@Transactional이 언제 롤백하는지와 rollbackFor에 대해 알아보았다.
외부 연동 결과에 따라 커밋/롤백이 되도록 설정이 필요하여 @Transactional의 롤백기능을 사용 했는데 적용 후 테스트 서버에서 테스트하다보니 예상과 다르게 동작하는 것을 알게 되었다.
테스트 서버에는 연동 시 필요한 properties 파일이 없어 FileNotFoundException이 발생했는데 이 때 롤백이 되지 않았다.
어떤 Exception(Checked Exception 포함)이 발생하더라도 롤백이 필요했고 rollbackFor을 통해 설정이 가능하는 것을 알게되어 정리 해봤다.
아래 예시는 org.springframework.transaction.annotation.Transactional을 사용하였다.
javax.transaction.Transactional 사용 시 rollbackFor대신 rollbackOn 을 사용하면된다.
@Transactional
public void saveMember(MemberSaveRequestDto memberSaveRequestDto) {
try {
memberRepository.save(memberSaveRequestDto.toEntity());
throw new IllegalArgumentException("IllegalArgumentException!!!");
} catch (IllegalArgumentException e) {
logger.error("IllegalArgumentException!!!");
}
}
@Transactional
public void saveMember(MemberSaveRequestDto memberSaveRequestDto) {
memberRepository.save(memberSaveRequestDto.toEntity());
throw new IllegalArgumentException("IllegalArgumentException!!!");
}
@Transactional
public void saveMember(MemberSaveRequestDto memberSaveRequestDto) throws Exception {
memberRepository.save(memberSaveRequestDto.toEntity());
throw new IOException("IOException!!!");
}
@Transactional(rollbackFor = {Exception.class})
public void saveMember(MemberSaveRequestDto memberSaveRequestDto) throws Exception {
memberRepository.save(memberSaveRequestDto.toEntity());
throw new IOException("IOException!!!");
}
@Transactional의 rollbackFor을 설정을 통해 특정한 Exception발생 시 혹은 모든 Exception발생 시 롤백되도록 지정할 수 있다.