[Spring] @Transactional - rollback

du·2022년 7월 9일
0

Spring

목록 보기
2/6

@Transactional이 언제 롤백하는지와 rollbackFor에 대해 알아보았다.

외부 연동 결과에 따라 커밋/롤백이 되도록 설정이 필요하여 @Transactional의 롤백기능을 사용 했는데 적용 후 테스트 서버에서 테스트하다보니 예상과 다르게 동작하는 것을 알게 되었다.
테스트 서버에는 연동 시 필요한 properties 파일이 없어 FileNotFoundException이 발생했는데 이 때 롤백이 되지 않았다.
어떤 Exception(Checked Exception 포함)이 발생하더라도 롤백이 필요했고 rollbackFor을 통해 설정이 가능하는 것을 알게되어 정리 해봤다.

예시

아래 예시는 org.springframework.transaction.annotation.Transactional을 사용하였다.
javax.transaction.Transactional 사용 시 rollbackFor대신 rollbackOn 을 사용하면된다.

  1. IllegalArgumentException(Unchecked Exception)이 발생하고 catch하는 경우 -> 롤백X
   @Transactional
   public void saveMember(MemberSaveRequestDto memberSaveRequestDto) {
       try {
           memberRepository.save(memberSaveRequestDto.toEntity());
           throw new IllegalArgumentException("IllegalArgumentException!!!");
       } catch (IllegalArgumentException e) {
           logger.error("IllegalArgumentException!!!");
       }
   }
  1. IllegalArgumentException(Unchecked Exception)이 발생하는 경우 -> 롤백O
   @Transactional
   public void saveMember(MemberSaveRequestDto memberSaveRequestDto) {
		memberRepository.save(memberSaveRequestDto.toEntity());
     	throw new IllegalArgumentException("IllegalArgumentException!!!");
}
   
  1. IOException(Checked Exception)이 발생하는 경우 -> 롤백X
    @Transactional
    public void saveMember(MemberSaveRequestDto memberSaveRequestDto) throws Exception {
        memberRepository.save(memberSaveRequestDto.toEntity());
        throw new IOException("IOException!!!");
    }
  1. rollbackFor지정을 하고 IOException(Checked Exception)이 발생하는 경우 -> 롤백O
    @Transactional(rollbackFor = {Exception.class})
    public void saveMember(MemberSaveRequestDto memberSaveRequestDto) throws Exception {
        memberRepository.save(memberSaveRequestDto.toEntity());
        throw new IOException("IOException!!!");
    }

결론

  1. @Transactional은 RuntimeException와 Error(checked exception은 제외)가 발생했을 때 롤백하는 것이 디폴트이다.
  2. rollbackFor설정을 통해 어떤 Exception(Exception class 여러개도 지정 가능)이 발생했을 때 롤백할지 지정할 수 있다.

@Transactional의 rollbackFor을 설정을 통해 특정한 Exception발생 시 혹은 모든 Exception발생 시 롤백되도록 지정할 수 있다.

참고 자료

0개의 댓글