LazyInitializationException

2024. 2. 5. 16:41Springboot

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이 적절하다고 판단하여 사용하게 됨