지난번에 공부했던 프록시를 바탕으로 이번에는 SSE 에서 계속 보던 LazyInitializationException 관련해서 글 내용을 정리해볼까 한다.
이같은 오류가 발생하는 것으로 지나번 글에서 잠깐 언급이 있었는데, 좀 더 자세히 말하자면...
- 일반적인 백엔드 프로젝트에서 대부분의 로직은 REST API 에 해당하며 실행의 흐름은 @Controller, @Service, @Repository 순서가 된다.
- 서비스 레벨에서 @Transactional 이 명시된 메서드가 종료되면 Hibernate 의 Session 도 함께 종료된다.
- FetchType.LAZY 가 설정된 필드가 포함된 엔티티 오브젝트에 대해, 컨트롤러 레벨에서 해당 필드를 조회할 때 Getter 메서드를 호출하고 실제 조회 쿼리가 실행된다.
하지만 앞서 이미 Session 이 종료된 상태이기 때문에 LazyInitializationException 예외가 발생하게 된다.
좀... 어려운거 같은데... 좀 더 쉽게 말하면
Lazy Loading 을 하려고 하는데 세션이 사라져서 프록시 초기화가 불가능해 지연로딩을 못 하는 경우에 발생한다.
이를 해결하기 위한 가장 단순한 방법으로는 FetchType 을 Eager 로 설정해서 일괄적으로 부모 호출시 자식이 모두 즉시 로딩으로 초기화되도록 하면 해결이 가능합니다.
다만, Eager 의 경우엔 모든 연관된 데이터를 다 가져오기 때문에 반드시 필요한 경우가 아니면 이러한 방법으로 해결하는 것은 좋지 않다.
이러한 내용을 바탕으로 우리 프로젝트에서는 FetchType Eager 를 붙여줌으로써 해결 !
우리 프로젝트의 경우에는 실제로도 필요한 데이터가 많이 포함되어 있었기에 FetchType Eager 를 적용하게 되었다.
지금은 프로젝트 규모가 작아서 저러한 방법으로 해결했지만, 만약 더 커진다면 꽤나 깊은 고민이 필요해 보인다...
'일기' 카테고리의 다른 글
2023-02-14 (0) | 2023.02.14 |
---|---|
2023-02-13 (0) | 2023.02.13 |
2023-02-09 (0) | 2023.02.09 |
2023-02-08 (0) | 2023.02.09 |
2023-02-07 (0) | 2023.02.07 |