↩️ 명시적 Rollback

정의

명시적 Rollback은 개발자가 특정 조건에서 트랜잭션을 직접 롤백 상태로 표시하는 방식이다. Spring의 기본 자동 롤백 규칙 외에, 비즈니스 조건에 따라 강제로 롤백해야 할 때 사용한다.

Spring은 기본적으로 RuntimeException 발생 시 자동 롤백을 수행한다.
하지만 예외를 던지지 않고도 롤백해야 하는 상황에서는 명시적 처리가 필요하다.

🧩 역할

  • 트랜잭션을 개발자가 직접 롤백 상태로 만든다
  • 예외를 던지지 않아도 롤백을 지정할 수 있다
  • 비즈니스 조건에 따른 정교한 제어가 가능하다

🛠 설정 방법

TransactionAspectSupport 사용

Spring AOP의 트랜잭션 관리 안에서 현재 트랜잭션 상태를 가져와 강제로 롤백을 지정할 수 있다.

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

이 메서드는 현재 진행 중인 트랜잭션을 커밋하지 않고 롤백 대상으로 표시한다.

🛠 사용 예시

비즈니스 로직에서 조건에 따른 롤백

@Service
@Transactional
public class OrderService {

    public void placeOrder(Order order) {
        orderRepository.save(order);

        if (order.getAmount() > 10000) {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return;
        }
    }
}

예외를 던져 롤백하는 방식

@Transactional
public void process(Order order) {
    if (order.getAmount() > 10000) {
        throw new IllegalStateException("금액 초과");
    }
}

⚠️ 주의사항

  • 트랜잭션 범위 안에서만 사용할 수 있다.
  • setRollbackOnly() 이후에는 해당 트랜잭션을 커밋할 수 없다.
  • 너무 자주 사용하면 흐름이 숨겨져서 유지보수가 어려워질 수 있다.
  • 예외 기반 롤백과 명시적 롤백을 섞을 때는 의도를 분명히 해야 한다.

📌 정리

  • 명시적 Rollback은 개발자가 직접 트랜잭션을 롤백 상태로 만드는 방식이다.
  • TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()로 처리할 수 있다.
  • 예외를 던지지 않는 비즈니스 조건에서도 롤백을 제어할 수 있다.

연결문서

댓글남기기