🔗 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