Problem
Spring Scheduling의 @Scheduled 어노테이션을 사용해서 예약된 일정 1시간 전에 알림을 주도록 했습니다. 하지만 알림이 정상적으로 도착하지 않고, LazyInitializationException 이라는 에러를 냈습니다.
org.hibernate.LazyInitializationException: could not initialize proxy [com.project.trainingdiary.entity.TraineeEntity#1] - no Session
How to solve
에러 로그를 보면 proxy를 읽어올 수 없다고 해서, 연관관계의 lazy fetch type이 생각났습니다. 더 찾아보니 특정 시간에 함수 실행을 등록하지만, 등록하는 시점에 넘겨주는 값들에는 실제 값이 들어있지 않은 상태입니다. 등록 후에 Hibernate의 Session이 끝나게 됩니다.
Session이 끝난 후에 엔티티 값을 가져오려고 하면 LazyInitializatioinException 에러를 냅니다. 물론 등록과 동시에 실행이 이루어지는 구조이긴 하지만, 둘(등록과 실행)은 명확히 분리된 단계라는 것을 알았습니다.
등록하는 시점에 사용할 모든 연관관계 값까지 가져와야 합니다. 그러기 위해서 fetch join 을 사용해서 쿼리 하는 시점에 연결된 값들을 가져오도록 하고, 그 상태로 함수 실행을 등록하도록 해서 해결했습니다.