[Spring] @Transactional과 rollbackFor 속성
🚀 @Transactional과 rollbackFor 속성
Spring은 @Transactional이 붙은 Class에 Proxy를 생성하는 것이에요. Proxy는 트랜잭션 로직을 Method 앞 뒤에 넣어 준답니다.
주니하랑은 @Transactional에 rollbackFor 속성을 이용하여 Exception.class를 등록한 것이에요.
이 의미는 Spring에게 'Run Time Exception이 터지면 Roll Back 해줘!' 라고 하는 것이에요.
만약 이렇게 @Transactional에 속성을 주지 않으면 Spring은 RuntimeException.class, Error.class를 선언했다고 이해하는 것이에요. 즉, Default 속성이 이것이라는 것이지요.
하지만, 이렇게 checked Exception을 던져서 catch로 처리 했다고 한다면 (catch로 처리하고 안하고의 차이는 없음)
Roll Back이 기본적으로 적용되지 않는 것이에요. 따라서 DB에는 값이 들어간 상태로 작업이 끝나 버리는 것이에요.
정리하면 모든 Exception에 Roll Back이 되는 것이 아니라는 것이에요. catch도 그렇지만, throw를 해도 마찬가지인 것이에요.
rollbackFor를 사용하는 좋은 때!
먼저 Spring이 RuntimeException을 관리하는 것을 잊으면 안되는 것이에요. 만약 Checked Exception이 발생했을 때, 트랜잭션이 롤백 되지 않고, DB에 변경이 되는 것을 모르고 있다면 문제가 있는 것이에요. 모든 Exception에 대해 전부 트랜잭션 롤백을 하고 싶다면
@Transactional(rollbackFor = Exception.class)
바로 주니하랑이 했듯이 이렇게 해주면 롤백이 되는 것이에요.
따라서 우리는 롤백이 언제 되는지 정확히 파악하고, 그에 따른 설정을 해줘야 하는 것이에요.