티스토리 뷰
[개발] 지연 로딩 적용 후 read Test case 실행 시 발생하는 에러 해결법 🤔 org.hibernate.LazyInitializationException: could not initialize proxy [] - no Session
da_devel 2022. 5. 28. 13:18캡스톤 프로젝트 도중
lazy 지연 로딩에 대해 학습하다
다음과 같은 에러를 발견했다.
어떤 에러였으며 어떻게 해결했는지 같이 확인해보자.
data에 연관관계 설정 시
기존에는 다음과 같이 즉시로딩(Eager loading)으로
연관관계를 지정했다.
우선 즉시로딩의 장단점은
장점 : 한 번에 연관관계가 있는 모든 엔티티를 가져온다.
단점 : 여러 연관관계를 맺고 있거나 연관관계가 복잡할수록 조인으로 인한 성능 저하를 피할 수 없다.
JPA에서 연관관계의 데이터를 어떻게 가져올 것인가를
fetch(패치)라고 하는데
연관관계의 어노테이션의 속성으로 'fetch'모드를 정할 수 있다.
지연로딩 설정은 다음과 같이 할 수 있다.
결국 lazy loading 설정을 마치고
findById를 통해 read 기능을 수행하는 test case를 작성하고
실행시켰는데 다음과 같은 에러가 발생했다.
어떻게 해결할까? 🤔
이 메세지는 데이터베이스와 추가적인 연결이 필요하다는 의미이다.
우선 필자사 실행한 test case의 메서드를 한 번 보자.
지연 로딩 방식으로 로딩하기 때문에 Consulting 테이블만을 가져와서
System.out.println으로 조회하는 것은 문제되지 않는다.
문제는 consulting.getWriter()에서 발생한다.
코드를 보면 알겠지만 consulting 테이블에서
Member 테이블과 다대일 연관관계를 맺는다.
board.getWriter()는 member 테이블을 로딩해야 하는데
이미 데이터베이스와의 연결은 끝난 상태이기 때문에 에러가 발생한다.
'no Session' 메세지 발생 이유 🤔
이 문제를 해결하기 위해서는 다시 한번 데이터베이스와 연결이 필요한데
@Transactional이 바로 이러한 처리에 도움을 준다!
따라서 메서드 선언부에 @Transactional을 추가한다.
@Transactional은 해당 메서드를 하나의 '트랜잭션'으로 처리하라는 의미이다.
트랜잭션으로 처리하면 속성에 따라 다르게 동작하지만,
기본적으로는 필요할 때 다시 데이터베이스와 연결이 생성된다.
에러가 발생했던 test case 또한
다시 실행하면 문제 없이 실행되는 것을 확인할 수 있다.
오늘도 하나의 에러를 해결하며
많은 것을 배웠다.
그럼 오늘도 열심히 공부하자. 🔥
'개발' 카테고리의 다른 글
[개발] JUnit이란? 🤔 (0) | 2022.06.16 |
---|---|
[개발] 인텔리제이 단축키 PlugIn 설치방법 (0) | 2022.06.01 |
[개발] 연관관계에서의 @ToString()과 exclude 속성 (0) | 2022.05.29 |
[개발] 매핑 테이블 데이터 삭제 문제와 트랜잭션 처리 (0) | 2022.05.26 |
- Total
- Today
- Yesterday
- 풀이
- 소스코드
- 코드
- 개발자
- 강의
- 해커랭크 자바 챌린지
- BAEKJOON
- LinkedList
- hackerrank
- queue
- JPA
- 정보처리산업기사
- hackerrank challenges
- 해커랭크 챌린지
- 그리디
- 챌린지
- 자바의 정석
- 해커랭크
- 해커랭크 자바
- 정보처리 산업기사
- 정보처리산업기사 공부법
- ORM
- 자바
- stack
- challenges
- Java
- 백준
- 22 정보처리산업기사
- 디버깅
- 22 정보처리 산업기사
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |