Spring
@Transactional 어노테이션 롤백 동작 방식
TedDev
2024. 10. 30. 18:17
728x90
@Transactional 어노테이션은 Spring 프레임워크에서 트랜잭션 처리를 간소화하고 자동화하기 위해 사용된다. 이 어노테이션이 선언된 메서드에서 예외가 발생하면 트랜잭션을 롤백한다. 그러나 모든 예외가 롤백되는 것은 아니며 기본적으로 롤백 범위는 특정한 예외 유형에 따라 결정된다.
기본 롤백 정책
- Checked Exception (체크 예외)
Exception을 상속하지만 RuntimeException을 상속하지 않은 예외는 기본적으로 롤백되지 않는다
예) IOException, SQLException 등 - Unchecked Exception (언체크 예외)
RuntimeException 및 그 하위 클래스들은 기본적으로 롤백된다
예) NullPointerException, IllegalArgumentException 등 - Error
Error 및 그 하위 클래스들도 기본적으로 롤백된다
예) OutOfMemoryError, StackOverflowError 등
롤백 정책 커스터마이징
기본 동작 외에 특정 예외에 대해 롤백 동작을 명시적으로 지정할 수 있다
@Transactional(rollbackFor = Exception.class)
public void someMethod() throws Exception {
// 코드 로직
}
- rollbackFor : 롤백할 예외를 명시한다
위 코드에서는 Exception 타입의 예외가 발생해도 트랜잭션이 롤백된다 - rollbackForClassName : 문자열로 예외 클래스 이름을 지정한다
@Transactional(rollbackForClassName = "java.io.IOException")
public void someMethod() throws IOException {
// 코드 로직
}
특정 예외에 대해 롤백 방지
트랜잭션이 특정 예외에 대해 롤백되지 않도록 설정할 수도 있다
@Transactional(noRollbackFor = IllegalArgumentException.class)
public void someMethod() {
throw new IllegalArgumentException("이 예외는 롤백되지 않습니다.");
}
- noRollbackFor: 롤백되지 않을 예외를 지정한다
위 코드에서는 IllegalArgumentException이 발생해도 트랜잭션이 롤백되지 않는다
트랜잭션 전파(Propagation)와 롤백
트랜잭션의 전파(Propagation) 설정에 따라 롤백 범위가 달라질 수 있다
- REQUIRED : 이미 진행 중인 트랜잭션이 있으면 해당 트랜잭션에 참여하며, 예외가 발생하면 상위 트랜잭션도 롤백된다
- REQUIRES_NEW : 항상 새 트랜잭션을 시작하며, 롤백은 해당 새 트랜잭션에만 영향을 미친다
- NESTED : 상위 트랜잭션 내에서 중첩된 트랜잭션이 실행되며, 하위 트랜잭션의 롤백은 상위 트랜잭션에 영향을 미치지 않는다
728x90
정리
- 언체크 예외(RuntimeException, Error) : 기본적으로 롤백
- 체크 예외(Exception) : 기본적으로 롤백되지 않음
- 커스터마이징 : rollbackFor, noRollbackFor 옵션으로 예외에 따라 롤백 동작을 제어
- Propagation : 트랜잭션 전파에 따라 롤백 범위가 달라질 수 있음
이처럼 @Transactional 어노테이션을 사용하면 트랜잭션 롤백 동작을 정교하게 제어할 수 있다. 프로젝트 상황에 맞게 적절한 예외 처리 전략을 사용하는 것이 중요하다.
반응형