오류

fetch = FetchType.LAZY로 설정 된 entity의 데이터를 사용할 때 데이터조회를 못하면서 아래 오류가 발생했다.

 failed to lazily initialize a collection of role: com.my.jpa.entity.xxx.yyy, could not initialize proxy - no Session

원인

Lazy 로딩을 하기 위해서는 조회를 했던 영속성 컨텍스트가 유지가 되어야 하는데, 해당 영속성 컨텍스트가 끝나버려서 없어진게 원인이다.

즉, 조회를 진행한 트랜잭션이 이미 종료되었다고 보면 될 듯 하다.

해당 트랜잭션이 유지가 되어야 Lazy 로딩이 가능하다.

트랜잭션 밖에서 Lazy 로딩을 하게되면 이미 해당 트랜잭션이 종료되었기 때문에 오류가 발생한다.

해결

나같은 경우는 @Transacional을 선언하지 않아서 생긴 문제였다.

Lazy 로딩을 하려는 메서드가 하나의 Transacional 내에서 실행되도록 선언하면 된다.

굳이 Lazy 로딩을 하지 않아도 된다면 fetch = FetchType.EAGER로 변경해도 된다.

참고