개발/CS
Transaction Application Flow
용꿀
2025. 6. 14. 15:18
트랜잭션이란?
트랜잭션(Transaction)은 데이터베이스에서 여러 작업을 하나의 작업 단위로 묶어 처리하는 개념이다. 이때 ACID 특성을 만족해야 한다.
- Atomicity (원자성): 작업이 전부 수행되거나, 전혀 수행되지 않아야 한다.
- Consistency (일관성): 트랜잭션이 실행되기 전과 후의 데이터는 항상 유효한 상태를 유지해야 한다.
- Isolation (고립성): 동시에 실행되는 트랜잭션들은 서로 간섭해서는 안된다.
- Durability (지속성): 커밋된 트랜잭션 결과는 영구적으로 보존되어야 한다.
Transaction Application Flow란?
Transaction Application Flow는 하나의 비즈니스 유즈케이스에서 여러 단계의 작업을 트랜잭션으로 묶어 처리하는 흐름이다. 일부 단계가 실패하면 전체 작업을 롤백해 시스템의 일관성을 보장한다.
예를 들어, 주문 처리의 경우 다음과 같은 흐름이 트랜잭셔널 하게 처리되어야 한다.
- 주문 생성
- 재고 감소
- 결제 처리
이 세 단계 중 하나라도 실패하면 전체 트랜잭션은 롤백되어야 한다.
언제 사용하는가?
트랜잭셔널 애플리케이션 플로우는 다음과 같은 경우에 사용된다.
- 하나의 유즈케이스에서 여러 DB 조작이 있을 때
- 중요한 상태 변경(결제, 송금, 주문 등)이 필요한 경우
- 데이터 정합성과 무결성이 매우 중요한 도메인 (예: 금융, 커머스, 의료 등)
- 일부 작업이 실패하면 전체 작업을 취소해야 하는 상황
- 외부 시스템과 연계된 처리 흐름에서 일관성을 보장해야 할 때
트랜잭션을 잘못 설계하면 데이터 불일치나 시스템 오류로 이어질 수 있기 때문에, 적절한 경계를 설정하고 실패 처리 전략을 명확히 해야 한다.
구현 예시
@Service
public class OrderService {
private final OrderRepository orderRepository;
private final InventoryService inventoryService;
private final PaymentService paymentService;
@Transactional
public void createOrder(OrderRequest request) {
Order order = new Order(...);
orderRepository.save(order); // 1. 주문 생성
inventoryService.decreaseStock(request.getProductId(), request.getQuantity()); // 2. 재고 감소
paymentService.processPayment(request.getPaymentInfo()); // 3. 결제 처리
}
}
- @Transactional 어노테이션은 메서드 내 모든 작업을 하나의 트랜잭션으로 묶어준다.
- 예외가 발생하면 자동으로 롤백된다.
트랜잭셔널 플로우 차트
플로우차트 예시 (단일 서비스 기준)
시퀀스 다이어그램 예시 (마이크로서비스 기준)
트랜잭셔널 플로우 설계 시 고려사항
- 트랜잭션 경계 설정: 어디까지를 트랜잭션으로 묶을지 결정
- 에러 처리 전략: 실패 시 재시도, 보상 트랜잭션 여부
- 외부 시스템 통신 위치: 외부 API 호출은 트랜잭션 외부에서 처리하는 것이 일반적
- 분산 환경 고려: 마이크로서비스 아키텍처에서는 Saga, Outbox 등 분산 트랜잭션 패턴 사용
관련 패턴
- Saga Pattern: 서비스 간의 보상 트랜잭션으로 흐름을 관리하는 방식
- Eventual Consistency: 일시적으로 불일치가 발생할 수 있으나 결국 일관성을 맞춤
- Outbox Pattern: DB 트랜잭션 내에서 이벤트 로그를 저장한 뒤, 비동기적으로 발송