우주먼지
article thumbnail

💡 LazyInitializationException 발생

발생이유

1. Proxy 객체로 채워진 Entity의 타입캐스팅을 시도할 때
2. 트랜잭션 내부에서 연관관계가 설정된 엔티티의 프로퍼티 접근이 안됬을때
3. 영속성 컨텍스트가 Transaction 범위 밖인 Controller에서 Lazy Loading을 시도할 때

N:1 관계를 예시로, 1쪽에서의 Fetch 전략은 Lazy & N쪽에서의 Cascade 전이 범위는 Persist,Remove 설정

N의 엔티티를 단건 조회했을때 Lazy Loading으로 연관된 1은 바로 초기화가 되지않고,
필요할때 정보가 채워지는 Proxy 객체로 채워진다.

그럼 N의 Request가 Entity로 변환되고 Entity -> Response로 변환이 될때 정상적으로 변환이 될까?
정답은 안된다 이다

왜냐하면 1의 값을 써서 DTO를 채워야하는데 1의 값이 초기화가 되지 않은 상태여서 DTO 생성이 안됨

 

해결

방법 1.
Controller에서 Entity -> Response 변환하던것을
트랜잭션 범위안에 있는 Service로 가져와서
변환 시 쿼리를 날려 1의 값을 채우면 ResponseDTO가 정상적으로 만들어짐

방법 2.
임시 해결 -> open-in-view 옵션을 true로 변경 (권장 X, DB 성능 저하 및 장애 발생 가능성)
true 설정 시, 영속성 컨텍스트가 트랜잭션 범위를 넘어선 레이어까지 살아있음
false 설정 시, 트랜잭션이 종료될 경우 영속성 컨텍스트도 닫힌다

 

트랜잭션 내부에서 프록시 객체의 프로퍼티를 건드리니 오류가 사라지고 어플리케이션이 잘 실행되었음

'Error Handling > Java & Spring' 카테고리의 다른 글

💡 JPA N+1 문제 발생 이유 & 해결법  (0) 2023.01.25
❌ RedisConnectionFailurException  (0) 2023.01.10
❌ RedisSystemException  (0) 2023.01.10
❌ Circular Dependency  (0) 2023.01.03
❌ DataIntegrityViolation Exception  (0) 2023.01.01
profile

우주먼지

@o귤o

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그