-
(2023-01-05 TIL) Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role 에러의 원인찾기TIL 2024. 1. 5. 09:01
한창 업무 관리 프로그램을 만드는 프로젝트를 팀원들과 하고 있을 때 벌어진 일입니다.
문제 발생지점입니다.
에러 로그에 찍힌 모습은 아래와 같습니다.
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.sparta.givemetuna.domain.user.entity.User.boardUserRoles: could not initialize proxy - no Session] with root cause
위 에러는 service에 @transactional이 걸려있지 않을때 생기는 대표적인 오류입니다. 저희는 service에 @transactional이 걸린 것을 모두 확인하고 다음 방안을 찾았습니다.
1. 1차 개선안
fetch = Fetchtype.EAGER
첫번째로 시도한 방법은 Fetchtype을 바꾸는것이었습니다. 하지만 Fetchtype.EAGER 전략은 저희가 처음 설정한 Fetchtype.LAZY 통일성이 깨지게 되고 성능 저하의 문제가 있어 채택하지 않았습니다.2. 2차 개선안
userDetails에서 가져온 user를 영속성 컨텍스트에서 관리하게끔 설정하여 문제를 해결하였습니다.
바뀐점은 userDetails.getUser()를 통해 유저 정보를 가져오지 않고 Controller에서 영속성 컨텍스트에서 관리해주는 User를 만들어준 것입니다.
'TIL' 카테고리의 다른 글
08.13.2024 TIL (0) 2024.08.13 (2024-01-09 TIL) 직렬화 역직렬화 (0) 2024.01.09 (2024-01-03 TIL) @NoArgsConstructor? @RequiredArgsConstructor? @AllArgsConstructor? (0) 2024.01.04 (2023-12-26 TIL) @Configuration에 대하여 (0) 2023.12.27 (2023-12-21 TIL) Builder를 대체 왜쓰는걸까? (1) 2023.12.23