@Transactional어노테이션을 통해 자동으로 트랜잭션이 시작된다.트랜잭션 버퍼에 기록된다.트랜잭션 로그 버퍼
데이터베이스 내부에 있는 임시 저장 공간이다. 커밋 전에 모든 작업이 여기에 기록된다.
스프링은 트랜잭션 처리 시 예외의 종류에 따라 다음과 같은 전략을 사용한다.
1. 체크 예외 (Checked Exception)
@Transactional(rollbackFor = SomeCheckedException.class)를 사용해 롤백할 수 있다.RuntimeException을 상속한 예외로, 컴파일 타임에 강제되지 않는다. 다음은 결제 잔고 부족을 비즈니스 예외로 처리하면서 트랜잭션을 커밋하거나 롤백하는 예제이다.
public class InsufficientBalanceException extends Exception {
public InsufficientBalanceException(String message) {
super(message);
}
}
@Service
public class OrderService {
@Transactional(rollbackFor = InsufficientBalanceException.class)
public void placeOrder(OrderRequest orderRequest) throws InsufficientBalanceException {
// 주문 생성
Order order = createOrder(orderRequest);
// 결제 처리
if (!processPayment(orderRequest)) {
order.setPaymentStatus("PENDING");
throw new InsufficientBalanceException("잔고가 부족하여 결제가 대기 상태로 처리되었습니다.");
}
// 결제가 성공하면 주문 완료
order.setPaymentStatus("PAID");
}
private boolean processPayment(OrderRequest orderRequest) {
// 잔고 체크 로직 (가상의 처리)
return orderRequest.getBalance() >= orderRequest.getAmount();
}
}
placeOrder 메서드는 @Transactional 애너테이션을 사용하여 트랜잭션을 관리한다. InsufficientBalanceException은 체크 예외이지만, rollbackFor 옵션을 사용하여 롤백 대상에 포함시켰다. processPayment 메서드가 false를 반환하면 결제 상태를 대기로 설정하고 예외를 발생시킨다.