티스토리 뷰
이 글은 순수 창작이 아니라, 맨 아래에 출처를 밝힌 사이트의 글 일부를 번역한 글입니다.
LazyInitializationException 은 무엇이고 어떻게 해결하는가
잦은 문제인 만큼, 다양한 조언들을 찾을 수 있는 문제이기도 하다.
하지만 맹목적으로 조언들을 들어서는 안된다. 조언대로 문제를 해결하는 과정에서 또 다른 문제가 발생하는 경우가 있기 때문이다. 그 다른 문제란 1) 성능의 이슈일수도 있고, 2) 매번 다른 결과를 도출하는 해결방법을 찾게 되는 것일 수도 있다.
다음 문단들에서, 이 예외가 무엇인지, 무시해야 하는 조언에는 어떤 것이 있는지, 그리고 조언을 듣는 것 외에 문제를 해결하기 위한 방법에는 무엇이 있는지 설명하겠다.
Hibernate 는 언제 LazyInitialization 예외를 던지는가
Hibernate 는 활성화된 세션 맥락이 없이 다른 엔티티에 lazily fetched 연관관계를 처음으로 생성해야 할 때 LazyInitializationException 예외를 던진다.
-> 즉, 엔티티를 클래스로만 만들어 놓은 후에 (세션을 시작하지 않은 상태에서) 바로 연관관계를 맺어버리면 예외가 발생한다. 아직 엔티티는 영속성 객체가 되지 않았기 때문이다.
이 상황은 대체로 클라이언트 애플리케이션이나 웹 계층 에서 생성 후 초기화되지 않은 연관관계를 사용하는 경우에 발생한다.
여기서 이 상황을 테스트하는 단순한 예제를 볼 수 있다.
EntityManager em = emf.createEntityManager(); // 엔티티 관리자를 생성한다고 생각하면 됨
em.getTransaction().begin(); // 엔티티를 관리하는 객체에서 트랜잭션을 시작한다.
TypedQuery<Author> q = em.createQuery("SELECT a FROM Author a", Author.class); // DAO 에서 SQL 쿼리를 실행하는데, Author 엔티티 타입을 반환하는 쿼리를 생성한다.
List<Author> authors = q.getResultList(); // Author 리스트를 쿼리로부터 구한다.
em.getTransaction().commit();
em.close();
for (Author author : authors) {
List<Book> books = author.getBooks();
log.info("... the next line will throw LazyInitializationException ..")
books.size();
}
생성된 쿼리는 List<Book> 에 lazily feetched 연관관계를 가지고 있는 Author 엔티티를 반환한다. Hibernate 는 books 객체를 lazy loading 을 담당하는 Hibernate 만의 List 구현 방식을 사용하여 생성한다. 이 리스트 내의 원소에 접근하려 하거나 그 원소들 위에 동작하는 메서드들을 호출하려 하면, Hibernate 의 방식으로 구현된 List 는 이용 가능한 활성화된 세션이 없다는 것을 인식하고 LazyInitializationException 을 던지는 것이다.
출처
'Database' 카테고리의 다른 글
[Database Test] Soft Delete 를 H2 활용해서 테스트하기 (0) | 2023.01.10 |
---|---|
[MySQL] date vs datetime vs timestamp (2) | 2022.12.03 |
[JPA] JOIN & N+1 문제 (2) | 2022.11.26 |
[Hibernate] Session 이란? (0) | 2022.11.26 |
[Spring Data JPA] LazyInitializationException 2부: Hibernate 의 List 구현 방식 & 지연 로딩 (0) | 2022.11.26 |
- Total
- Today
- Yesterday
- 기지국 설치
- Java Data Types
- 코테
- 실시간데이터
- JPA
- DeSerialization
- spring
- 프로그래머스
- Spring Boot
- JPQL
- 역직렬화
- 알고리즘
- @RequestBody
- json web token
- N+1
- 깃랩
- 지연 로딩
- LazyInitializationException
- ci/cd
- JOIN FETCH
- docker
- Jackson
- Firebase
- FCM
- google cloud
- gitlab
- 도커
- 가상 서버
- 인증/인가
- DTO
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |