2024. 7. 9. 20:06ㆍTIL
✔오늘 배운 중요한 🔑 point
- @Transactional을 사용하면 프록시 초기화 오류를 해결할 수 있다.
- FetchType= EAGER, JOIN FETCH 등으로도 해당 오류를 해결할 수 있다.
🎯 오늘 배운 내용
프로젝트의 테스트코드 작성중 오류가 발생하였다.!!
could not initialize proxy [com.teamsparta.withdog.domain.user.model.User#1] - no Session 라는 노란색 경고 표시가 뜬것인데 , 이때문에 test에 실패를 한 것으로 보인다.
이러한 오류가 발생하는 주된 원인은 Hibernate의 Lazy Loading과 관련된 문제일 가능성이 크다고 한다.
Hibernate에서는 기본적으로 Lazy Loading을 사용하여 연관된 엔티티를 필요로 할 때 로딩을 하고 이 경우, 엔티티를 로딩할 때 세션이 필요한데 일반적으로 트랜잭션 범위 내에서만 올바르게 작동한다고 한다.
즉, 엔티티를 로딩하려면 올바른 Hibernate 세션이 필요한 상황이다.
postService.getPostById(postId) 메서드는 getPostById 메서드 내부에서 Lazy Loading이 발생할 가능성이 있고 . 따라서 해당 메서드를 호출할 때는 이미 종료된 트랜잭션 및 세션이나 초기화되지 않은 Lazy 로딩을 처리하려고 하게 된다.
이로 인해 could not initialize proxy [com.teamsparta.withdog.domain.user.model.User#1] - no Session와 같은 오류가 발생할 수 있는 것이다.
해결방법은 상당히 간단한데 바로 @Transactional을 넣어주는것이다.
@Transactional을 붙여줬을 뿐인데 테스트가 무사히 통과한것을 확인할 수 있다.
@ManyToOne(fetch = FetchType.EAGER)을 사용해서 FetchType을 LAZY대신 EAGER로 사용하거나
JOIN FETCH를 사용하는등 @Transactional 사용 방법 말고도 다양한 방법이 존재한다.
🤔 어떻게 활용할까?
테스트 환경에서 @Transactional 어노테이션은 생성한 post에 대해서 롤백 기능도 제공하기 때문에 잘 활용하는 것이 필요하다.
📓 오늘의 한줄
"The secret of success is consistency of purpose."
- Benjamin Disraeli -
'TIL' 카테고리의 다른 글
Cache을 이용한 성능개선 프로젝트 마무리 (0) | 2024.07.11 |
---|---|
페이지네이션 적용된 캐시데이터 한번에 삭제하기 (0) | 2024.07.10 |
ngrinder 기본 설정 (0) | 2024.07.08 |
import와 @Import의 차이 (0) | 2024.07.07 |
ApplicationRunner를 사용하여 더미데이터 적재하기 (0) | 2024.07.06 |