📌트러블 슈팅 작성 방법
⚠ @Transactional
문제 상황
javax.persistence.TransactionRequiredException: No EntityManager with actual **trasaction** available for current thread - **cannot reliably process** 'remove' call
로그아웃할 때 RefreshToken을 삭제해주는데 메소드 실행 도중 에러가 발생
문제 원인
public Long logout(HttpServletRequest httpServletRequest) {
if (!tokenProvider.validateToken(httpServletRequest.getHeader("RefreshToken"))) {
throw new IllegalArgumentException("Token이 유효하지 않습티다.");
}
Member member = tokenProvider.getMemberFromAuthentication();
if (null == member) {
throw new IllegalArgumentException("사용자를 찾을 수 없습니다.");
}
refreshTokenRepository.deleteByMember(member);
return member.getId();
}
delete 메소드에 @Transactional을 붙여주지 않아서 메소드 실행 도중 에러가
발생했을 때 롤백을 하지 못해서 원자성이 보장되지 않아 위와 같은 에러를
발생하였다.
문제 해결
@Transactional
public Long logout(HttpServletRequest httpServletRequest) {
if (!tokenProvider.validateToken(httpServletRequest.getHeader("RefreshToken"))) {
throw new IllegalArgumentException("Token이 유효하지 않습티다.");
}
Member member = tokenProvider.getMemberFromAuthentication();
if (null == member) {
throw new IllegalArgumentException("사용자를 찾을 수 없습니다.");
}
refreshTokenRepository.deleteByMember(member);
return member.getId();
}
위와 같이 @Transactional 어노테이션을 붙여주었더니 정상적으로 실행되었다.
⚠ @Param(”id”)
문제 상황
java.lang.IllegalStateException: For queries with named parameters you need to use provide names for method parameters. Use **@Param** for query method parameters, or when on Java 8+ use the javac flag -parameters.
JpaRepository<>를 상속받은 Repository에서 @Query로 새로운 조회 기능
추가하면서 발생한 문제
문제 원인