DataFetcher 구현 시 마주친 JPA LazyInitializationException

DataFetcher 구현을 위해 패키지를 생성하고 DgsComponent를 사용하여 아래와 같이 MovieDataFetcher를 구현하였다.

단순하게 쿼리를 movie의 내용만 조회했을 때는 정상적으로 결과값이 도출되었고

movie와 1:N 관계로 형성된 Director의 내용을 추가하고 Altair를 이용하여 쿼리를 실행해보았는데

아래와 같은 오류가 발생하였다.

??? 위와 같은 오류가 나타났다. 그리고 Log를 살펴보니

No Session… 사실 JPA를 사용을 해봤음에도 위와 같은 오류는 처음 마주하였다

구글링과 GPT를 이용하여 LazyInitializationException이 발생하는 이유를 보니

JPA는 @Transactional을 사용하지 않으면 영속성을 이어가지 못하기 때문에 지연로딩시에

해당 문제가 발생할 수 있는 것이였다.

그래서 @Transactional를 이용한 서비스 클래스를 생성하고 진행해보았다.

하지만.. 동일한 결과 해결이 되지 않았다.

원인 파악

원인이 무엇일까를 고민해봤다.. 처음 접근은 강의의 내용과 다르게 나는 MySQL 데이터베이스를 사용했던 점에서

h2 데이터베이스와 무언가 다를 것이라는 접근이었는데 영속성과는 관계가 없을 듯하여 패스하였고..

JPA 설정에 문제가 있을 것 같다라는 생각이 들었다.

그렇게 application-yml 파일에 관련된 JPA 설정을 찾아보다가 OSIV 설정이라는 것을 알게되었다.

아무 생각없이 spring.jpa.open-in-view 설정을 false 처리하였는데

이 설정이 OSIV 설정이다. OSIV란 JPA 영속성 컨텍스트와 Hibernate Session을 View가 렌더링이

될때까지 유지를 시킬건지 아닐건지에 대한 설정이다.

설정을 변경하고 Altair에 Query를 실행하니 정상적으로 출력이 되었다.

느낀 점

정말 강의를 진행하면서 이렇게 무지하게 설정을 진행했던 것이 후회스럽다. JPA와 영속성 컨텍스트, Hibernate에 대해서 다시 공부하는 계기가 된 것 같다.