Closed JinhwanB closed 6 months ago
위 컨트롤러가 호출되면 TokenProvider의 아래 메소드가 호출 되는것을 확인
public Authentication getAuthentication(String jwt) {
UserDetails userDetails = memberService.loadUserByUsername(getUserName(jwt));
return new UsernamePasswordAuthenticationToken(userDetails, "", userDetails.getAuthorities());
}
위 에러에 대해서 구글링을 해보니 Transaction이 끝난 뒤에 엔티티를 조회하면서 생기는 오류라는 것에 힌트를 얻었다.
즉 위 메소드가 호출됐을 때 Transaction이 끝나면서 멤버의 role을 initialize하지 못하는 것이다.(role에 있는 @ElementCollection
은 기본적으로 lazy로딩이다.)
따라서 Transaction이 유지될 수 있도록 해당 메소드에 @Transactional
을 붙여주었다.
@Transactional
public Authentication getAuthentication(String jwt) {
UserDetails userDetails = memberService.loadUserByUsername(getUserName(jwt));
return new UsernamePasswordAuthenticationToken(userDetails, "", userDetails.getAuthorities());
}
토큰을 통한 인증 후 권한이 필요한 컨트롤러 호출 시 발생한 에러다.
이 멤버 엔티티의 role을 읽을 때 문제가 생기는 것 같다.