(참고 : woowabros.github.io/experience/2019/01/29/exception-in-transaction.html)
- CheckedException : 예외 발생 시트랜잭션을 롤백하지 않고 예외를 던져줍니다.
- UncheckedException : 예외 발생 시 트랜잭션을 roll-back 합니다.
- roll-back이 되는 범위가 달라지기 때문에 개발자가 이를 인지하지 못하면 실행 결과가 맞지않거나 예상치 못한 예외가 발생할 수 있습니다.
스프링의 선언적 트랜잭션 (@Transactional) 안에서 RuntimeException 이 발생하면 롤백이 발생하여 롤백 예외가 발생합니다. (try-catch 문을 이용해서 RuntimeException을 잡더라도 롤백이 발생합니다!)
위의 코드는 OuterService에 있는 메서드는 클래스의 트랜잭션 선언에 의해 트랜잭션메서드가 됩니다. 그리고 그 메서드는 또 다른 트랜잭션 클래스의 메서드를 호출합니다. 호출된 내부 메서드는 결과적으로 마지막에 RuntimeException을 던집니다.
결과적으로 이 코드를 실행하면 UnexceptedRollbackException이 발생합니다. 즉, 롤백이 발생합니다.
스프링은 내부적으로 트랙잭션 중 RuntimeException이나 Error가 발생하면 try-catch문을 거치지 않고 예외가 던져지면서 트랜잭션 완료처리가 시작됩니다. 참여한 트랜잭션에 rollback-only를 마킹을 합니다. 그리고 최종 커밋을 할 때 rollback-only가 마킹되어 있는것을 확인하고 롤백을 합니다.
스프링의 트랜잭션에서는 왜 RuntimeException이나 Error을 왜 롤백 대상으로 볼까?
이전에 설명한것처럼 CheckedException은 예상 가능한 예외이고 UncheckedException은 예상치못한 예외라서 롤백이 진행되는 것입니다. (default 설정일때)
해당 스프링의 트랜잭션에서 RuntimeException 발생 시 롤백하는 과정은 아래의 링크(우아한 기술 블로그의 구인본님께서 쓰신 글)에서 자세히 읽으실 수 있습니다. (글도 굉장히 재밌게 쓰셨습니다!)
'Spring' 카테고리의 다른 글
[Spring] @ModelAttribute @RequestParam @RequestBody 차이 (0) | 2021.04.15 |
---|---|
SpringBoot build.gradle 설정 (0) | 2021.01.26 |
세션 저장소를 사용하는 3가지 방법 (0) | 2020.07.25 |
Spring Security 와 OAuth2 로 로그인 구현 (구글, 카카오, 네이버 등) (0) | 2020.07.25 |
단위테스트 실행 콘솔에서 실행된 MySQL 쿼리 보기 (0) | 2020.07.22 |
댓글