could not initialize proxy [com.teamsparta.withdog.domain.user.model.User#1] - no Session 오류

2024. 7. 9. 20:06TIL

✔오늘 배운 중요한 🔑 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 -