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 어노테이션을 사용하면 트랜잭션 롤백 동작을 정교하게 제어할 수 있다. 프로젝트 상황에 맞게 적절한 예외 처리 전략을 사용하는 것이 중요하다.

반응형