LazyInitializationException
LazyInitializationException이란 ?
- JPA에서 Lazy Loading된 Entity에 접근할 때 발생할 수 있는 Exception
- FetchType.LAZY를 사용하여 Entity를 지연 로딩할 때 발생할 수 있는 Exception
예외 발생 경우
1. 영속성 컨텍스트가 닫혀있는 경우
- Lazy Loading된 Entity에 접근하려는 시점에 영속성 컨텍스트가 닫혀있는 경우, 즉시 로딩이 아닌 경우 LazyInitializationException이 발생할 수 있습니다.
2. Entity가 Proxy로 초기화되지 않은 경우
- Lazy Loading된 Entity가 영속성 컨텍스트에 존재하지만 아직 로딩되지 않은 상태에서 접근하려고 할 때 LazyInitializationException이 발생할 수 있습니다. 이는 영속성 컨텍스트가 해당 Entity를 Proxy로 감싸서 Lazy Loading을 지원하기 때문입니다.
Solution
1. Transaction
- Transaction 범위 내에서 연관된 Entity에 접근하도록 유지함
- @Transactional annotation을 사용하여 트랜잭션을 설정하거나, 트랜잭션을 직접 관리하는 방식을 사용할 수 있음
2. Initialize
- Lazy Loading Entity를 초기화합니다.
- 영속성 컨텍스트가 열려있는 상태에서 연관된 Entity에 접근하여 Database에서 로딩하는 방식
- Transaction을 시작하고, 접근한 Entity에 대한 적절한 method를 호출하여 초기화할 수 있습니다.
3. Fetch Join
- Fetch Join을 사용하여 Lazy Loading된 연관 Entity를 함께 불러옴