Hibernate에서 지연로딩을 사용하는 동안 예외

이진영·2022년 10월 10일
0

Error를 적는 공간

목록 보기
1/2
post-thumbnail

생성일: 2022년 2월 12일 오후 11:44

💡 오늘은 project를 하는 과정에서 생긴 문제를 이야기 해볼려 한다.
Hibernate에서 지연 로딩을 사용하는 동안 세션이 없다는 예외에 직면하였다.

  • 내가 시도한 방법
    • 자체적인 지연로딩 문제
      처음에는 지연로딩으로 인한 문제인줄 알고 join fetch를 사용하였지만 이는 test상에서는 문제가 없었기에 별개의 문제로 다가가볼려 한다.
    • OSIV ON
      DB 트랜잭션을 시작할 때 JPA 영속성 컨텍스트가 DB 커넥션을 가져올 때 문제가 있다고 판단하여, 해당 방법으로 해결하려 했지만 여전한 문제를 직면!

하지만 본질적으로 다른 곳에서 문제가 발생하였다고 생각!

Hibernate에서 지연 로딩을 사용하는 동안 세션이 없다는 예외

JPA 문서를 찾아 보면서 지연로딩 문제 분류를 찾아 보았다! 답은 Hibernate에서 열린 세션이 필요합니다. 하지만 이는 트랜잭션이 닫힌 후 두번 째 LazyInitializationException 이 발생할 수 있다.

공식 문서

권장되는 접근 방식은 단일 트랜잭션에서 데이터 검색이 발생하도록 애플리케이션을 설계하는 것입니다. 그러나 로드된 항목과 로드되지 않은 항목을 판별할 수 없는 코드의 다른 부분에서 게으른 엔터티를 사용할 때 때때로 어려울 수 있습니다.
Hibernate에는 해결 방법인 enable_lazy_load_no_trans 속성이 있습니다. 이것을 켜면 지연 엔티티를 가져올 때마다 임시 세션이 열리고 별도의 트랜잭션 내에서 실행됩니다.

해결법

spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true 를 추가 하자!!

그렇다면 이러한 true 설정은 장점과 단점은?

  • 장점 속성이 켜저 있으면 트랜잭션과 그 경계에 대해 걱정할 필요가 없다. 이는 Hibernate에서 관리를 해주기 때문
  • 단점
    하지만 이는 성능에 크게 영향이 없을 때 사용이 되면 좋다. 1:1 관계가 있을 수 있으며, 전반적으로 이러한 설정은 프로덕션 준비가 된 기능이 아니다.

이 구성을 활성화하면 LazyInitializationException 이 사라질 수 있지만 세션이 닫히기 전에 모든 속성이 올바르게 초기화되도록 보장하는 가져오기 계획을 사용하는 것이 좋습니다.

profile
내가 공부한 것들을 적는 공간

0개의 댓글