2024. 2. 5. 16:41ㆍSpringboot
LazyInitializationException: could not initialize proxy - no Session
-> 모든 Entity의 접근을 Lazy전략으로 접근
접근 방법 :
1. 관련 메서드마다 @Transactional
-> 연관 관계를 가지고 있는 Entity가 자동으로 초기화되지 않음
-> 이로 인해 해결되지 않음
2. application.yml : open-in-view 사용
-> open-in-view : true 설정으로 인한 문제점이 많음
1. 성능 저하 : 데이터베이스 연결을 오랫동안 가지고 있음
2. 트랜잭션 범위와 세션 범위의 혼동 : 세션은 열지만 트랜잭션 확장에는 어려움이 있음
3. N+1 쿼리 문제 발생
-> 해당 패턴은 안티 패턴 : 성능적 문제 발생 가능성이 높음
https://stackoverflow.com/questions/30549489/what-is-this-spring-jpa-open-in-view-true-property-in-spring-boot
What is this spring.jpa.open-in-view=true property in Spring Boot?
I saw spring.jpa.open-in-view=true property in Spring Boot documentation for JPA configuration. Is the true default value for this property if it's not provided at all?; What does this really do? ...
stackoverflow.com
3. entityManager.find() 사용
-> 1차 캐시의 활용 : 이미 사용되고 있는 Entity를 재사용해서 데이터베이스의 접근을 줄여주어 매력적이라 판단 -> 초기에 사용
-> entityManager.find()는 별도의 데이터베이스 조회를 발생시키지만 N+1 쿼리 문제에 취약함
4. JQPL 사용 또는 QueryDsl
-> 관련 엔티티를 한 번의 쿼리로 함께 로드
->지연 로딩된 연관 엔티티에 대한 여러 별도의 데이터베이스 호출을 줄일 수 있음
-> N+1 문제를 줄일 수 있음
-> 해당 방안이 제일 적절하다고 생각하여 사용하게 되었음
-> 하지만 이 또한 N+1 문제를 줄이는 것이고 완벽한 해결방안이 아님, 대용량 데이터 처리에는 아직까지도 어려움이 있음(상대적으로 entityManager.find()보다 좋음)
** 해당 사항을 고려했을 때, 프로젝트 규모면에서는 entityManager.find()가 적절하나 확장성면에서 JQPL이 적절하다고 판단하여 사용하게 됨
'Springboot' 카테고리의 다른 글
Access Token과 Refresh Token(0) (0) | 2023.12.21 |
---|---|
@Value, @ConfigurationProperties에 대해서 (0) | 2023.12.20 |
Spring boot를 이용한 게시글에 AWS S3 이미지 업로드 (0) | 2023.12.14 |
Spring boot 간단한 AWS S3 MultipartFile 업로드 (0) | 2023.12.13 |
Spring boot 순환 참조 문제 (0) | 2023.12.12 |