could not initialize proxy [com.teamsparta.withdog.domain.user.model.User#1] - no Session 오류
✔오늘 배운 중요한 🔑 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에 대해서 롤백 기능도 제공하기 때문에 잘 활용하는 것이 필요하다.