본문 바로가기

Dot ./에러 모음

[Spring error] Spring Data Jpa - LazyInitializationException 오류

Spring Data Jpa - LazyInitializationException 오류

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: dotsecurity.login.domain.user.roles, could not initialize proxy -  no Session

이 오류는 조회까지는 성공했는데, user.get getRoles() 를 호출해서 사용할 때 영속성 컨텍스트가 종료되어 버려서, 지연 로딩을 할 수 없어서 발생하는 오류이다.

 

JPA에서 지연로딩을 하려면 항상 영속성 컨텍스트가 있어야 한다.

 

보통 트랜잭션 밖에서 user를 조회하면 해당 오류가 발생한다. 그래서 해당 서비스에서 트랜잭션이 정상적으로 작동되는지 확인해봐야 한다.

 

@Transactional 입력

jwt 토큰에 있는 id를 통해 userDetails로 접근하여 데이터를 받아오는 로직이었는데

userDetailsService쪽에서 특정 id에 해당되는 user 정보를 가져오는메소드에 @Transactional를 달아줬더니 해결 되었다.

@Transactional
public UserDetails loadUserById(Long id){
User user = userRepository.findById(id)
.orElseThrow(() ->
new UsernameNotFoundException("User not found with id : " +id));

return UserPrincipal.create(user);
}