[Spring] LazyInitializationException: could not initialize proxy

Ariul·2022년 8월 31일
0
post-thumbnail

Troubleshooting

문제

마이페이지에서 유저가 작성한 게시글을 전부 조회하려고 하는데 proxy 관련 오류가 떴다.

<포스트맨 에러 메시지>
마이페이지 조회 에러
<인텔리제이 에러 메시지>

2022-08-31 10:38:06.808 ERROR 4872 --- [nio-8080-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet]    
: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception 
[Request processing failed; nested exception is org.hibernate.LazyInitializationException: 
failed to lazily initialize a collection of role: com.clonecode.inssagram.domain.Post.imageList, 
could not initialize proxy - no Session] with root cause

해결 과정

@OnetoMany 관계에서 fetchType.LAZY로 되어있을 경우, 프록시 객체를 통해 지연 로딩되는 객체를 가져오려고 할 때 이미 세션이 사라져서 발생하는 에러이다.
post FetchType.EAGER를 명시해서 즉시 로딩으로 읽어오게 하면 해결될 수도 있다고 한다. 그런데 그리 좋은 방법은 아니라고 한다.

지연 조회 시점까지 세션을 유지 시켜주기 위해서 @Transactional 어노테이션을 마이페이지 조회 method 위에 추가했다. Transactional

두둥! 이제 잘 조회된다!

회고

  • 영속성 컨텍스트!?
    분명 공부할 때 이해했고, 내가 알고 있는 개념이라고 생각했다. 근데 다시 생각해 보니 영속성 컨텍스트를 풀어 설명한 그 "글"을 이해했던 거지, 영속성 컨텍스트 개념을 이해했던 게 아니란 걸 깨달았다.
  • @Transactional
    왜 쓰는지 모르지만 습관적으로 썼던 어노테이션인데, 이제서야 그 필요성을 확실히 깨달았다. 이전 코드들을 다시 보니 아주 중구난방으로 써왔더군..ㅎㅎ
  • "키워드"를 "검색"해서 블로그나 자료를 훑어보는 데서 그치는 게 아니라, 이 개념이 어디서, 어떻게, 왜 적용되는지까지 학습해야 할 필요를 느꼈다.
profile
정성과 진심을 담아 흔적을 기록하자💡

0개의 댓글