📌트러블 슈팅 작성 방법

⚠ @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로 새로운 조회 기능

추가하면서 발생한 문제

문제 원인