🔗 Distributed System

SAGA 패턴, JTA 트랜잭션

loose 2025. 3. 29. 18:30
반응형

마이크로서비스 아키텍처를 도입하면 시스템은 점점 더 작고 독립된 서비스들의 집합으로 나뉘게 됩니다. 하지만 이로 인해 트랜잭션 처리는 복잡해집니다. 단일 DB 트랜잭션으로는 처리할 수 없는 문제가 발생하죠. 이 글에서는 마이크로서비스 환경에서 트랜잭션을 다루는 대표적인 방식인 Saga 패턴과 JTA를 비교하고, 코레오그래피 기반의 Saga 구현 방식도 함께 살펴보겠습니다.

SAGA

Saga는 여러 개의 로컬 트랜잭션을 순차적으로 실행하면서 전체 작업을 처리하는 방식입니다. 각 단계가 성공하면 다음 단계로 넘어가고, 실패하면 이미 성공한 단계들에 대해 보상 트랜잭션(compensating transaction)을 실행합니다.

 

@Service
public class OrderSagaService {

    @Autowired private OrderService orderService;
    @Autowired private PaymentService paymentService;
    @Autowired private InventoryService inventoryService;

    public void createOrderSaga(String orderId) {
        try {
            orderService.createOrder(orderId); // A
            paymentService.pay(orderId);       // B
            inventoryService.deductStock(orderId); // C

            System.out.println("✅ 주문 전체 처리 성공");

        } catch (Exception e) {
            System.out.println("❌ 오류 발생: " + e.getMessage());

            // 보상 트랜잭션 (역순으로 호출)
            inventoryService.cancelStock(orderId); // optional
            paymentService.refund(orderId);
            orderService.cancelOrder(orderId);
        }
    }
}

Orchestration 방식에서는 중앙 컨트롤러(예: OrderSagaService)가 모든 흐름을 제어합니다. 반면, Choreography 방식에서는 각 서비스가 이벤트를 구독하고, 반응적으로 동작합니다.

그래서 Saga에서 Kafka를 이용해서 구현하기도 합니다.

 

JTA

JTA(Java Transaction API)는 2PC 기반으로 여러 리소스를 하나의 트랜잭션으로 묶을 수 있어 신뢰성은 높지만, 설정이 복잡하고 무거워 모놀리식 또는 단일 JVM 환경에 적합하며, 마이크로서비스 환경에는 잘 맞지 않습니다.

728x90