마이크로서비스 분산 트랜잭션을 다루는 SAGA 패턴
마이크로서비스 환경의 분산 트랜잭션을 로컬 트랜잭션과 보상 트랜잭션으로 관리하는 SAGA 패턴의 구현 방식과 운영 고려사항을 정리한다.
2026-08-14 · 최초 발행 2025-05-23
서비스별 데이터베이스가 나뉜 환경의 트랜잭션 문제
마이크로서비스에서는 서비스마다 데이터베이스를 독립적으로 운영하고 배포한다. 여러 서비스에 걸친 작업을 하나의 전통적인 ACID 트랜잭션으로 묶기 어려운 이유다. 2PC(Two-Phase Commit) 같은 방식도 이런 환경에서는 관리가 쉽지 않다.
SAGA 패턴은 이 문제를 작은 로컬 트랜잭션의 흐름으로 나눈다. 각 서비스가 자신의 작업을 완료하고 다음 작업을 이어 가며, 중간 단계가 실패하면 이미 완료된 작업은 보상 트랜잭션(Compensating Transaction)으로 되돌린다.
SAGA는 1987년 프린스턴 대학에서 장기 실행 트랜잭션(Long-running transaction)을 관리하기 위한 개념으로 처음 제안됐다.
로컬 작업과 보상 작업을 연결하는 방식
SAGA에서는 로컬 트랜잭션이 끝날 때 이벤트를 발행하고, 그 이벤트가 다음 트랜잭션을 시작하게 할 수 있다. 특정 단계가 실패한 경우에는 이전 상태를 복원하는 보상 트랜잭션을 실행한다.
이 흐름은 서비스 간 데이터가 항상 같은 순간에 일치하는 구조가 아니라, 각 단계의 성공과 실패를 따라 일관성을 회복하는 구조다.
이벤트로 이어지는 Choreography SAGA
이벤트-트리거 방식은 서비스가 서로를 직접 호출하지 않고 이벤트를 매개로 작업을 연결한다. 작업을 마친 서비스는 이벤트를 발행하고, 이를 구독하는 다른 서비스가 자신의 작업을 수행한다. 실패에 대한 보상도 이벤트로 시작된다.
중앙 조정자가 없으므로 서비스의 자율성과 느슨한 결합을 유지하기 좋고 구현도 단순하다. 반면 서비스가 늘어날수록 전체 트랜잭션 흐름과 의존성을 파악하기 어려워지며, 디버깅과 모니터링의 부담도 커진다.
주문 처리에서는 주문 서비스가 주문 생성 이벤트를 발행하고, 재고 서비스가 이를 받아 재고를 확인·차감한다. 이후 결제 서비스와 배송 서비스가 차례로 이벤트를 구독해 처리할 수 있다. 결제가 실패하면 결제 실패 이벤트를 발행하고, 재고 서비스가 이를 받아 차감한 재고를 복원한다.
중앙 조정자가 제어하는 Orchestration SAGA
컴앤드-오케스트레이션 방식에서는 중앙 조정자(Orchestrator)가 트랜잭션의 단계와 결과를 관리한다. 조정자는 각 서비스를 호출하고 응답 채널(Reply Channel)로 성공 또는 실패 결과를 받는다. 결과에 따라 다음 명령을 전송하거나 보상 트랜잭션을 실행하며, 트랜잭션 상태도 중앙에서 관리한다.
전체 흐름을 확인하기 쉽고 오류 처리를 한곳에 모을 수 있어 구현과 테스트가 비교적 단순하다. 다만 조정자 의존성이 커지고, 조정자가 단일 장애 지점(Single point of failure)이 될 수 있다. 서비스 간 결합도 강해질 가능성도 있다.
여행 예약에서는 사가 오케스트레이터가 항공권, 호텔, 렌터카, 결제 서비스를 순서대로 호출할 수 있다. 호텔 예약이 실패하면 이미 처리된 항공권 예약을 취소하도록 명령한다.
선택 기준은 결합도와 제어 방식이다
| 특성 | 이벤트-트리거 방식 | 컴앤드-오케스트레이션 방식 |
|---|---|---|
| 통신 방식 | 비동기식 | 동기식 |
| 결합도 | 낮음 | 높음 |
| 복잡성 | 서비스 증가에 따라 복잡해짐 | 중앙 관리로 비교적 단순 |
| 가시성 | 낮음 | 높음 |
| 확장성 | 높음 | 중간 |
| 장애 허용성 | 높음 | 중앙 조정자에 의존 |
| 적합한 상황 | 단순한 워크플로우, 낮은 결합도 요구 | 복잡한 워크플로우, 중앙 제어 필요 |
단순한 워크플로우에서 서비스 간 결합도를 낮춰야 한다면 이벤트-트리거 방식이 맞는다. 흐름이 복잡하고 중앙에서 제어해야 한다면 오케스트레이션 방식이 더 적합하다.
운영에서 놓치기 쉬운 지점
동일한 메시지가 여러 번 처리돼도 결과가 같도록 멱등성(Idempotency)을 보장해야 한다. 트랜잭션 ID를 이용해 중복 처리를 막는 방식이 필요하다.
SAGA는 결과적 일관성(Eventual Consistency)을 전제로 한다. 따라서 비즈니스 로직은 일시적인 불일치를 허용할 수 있어야 한다.
모든 이벤트와 명령은 로깅해 감사 추적과 장애 복구에 활용한다. 장기 실행 트랜잭션에는 타임아웃 메커니즘을 두어 무한 대기를 막고, 전체 사가 프로세스 상태와 실패한 사가에 대한 알림도 함께 운영해야 한다.
주문·이체·예약처럼 단계가 이어지는 업무
전자상거래 주문은 주문 생성, 재고 확인, 결제 처리, 배송 준비의 흐름으로 구성된다. 아마존, 이베이 등 대형 전자상거래 플랫폼에서도 유사한 패턴을 사용한다.
금융 거래에서는 출금 계좌 확인, 인출, 입금 계좌 확인, 입금이 하나의 흐름을 이룬다. 블록체인 기반 결제 시스템에도 유사한 패턴이 적용된다.
여행 패키지 예약은 항공권, 호텔, 렌터카, 결제가 연속으로 이어지는 사례다. Booking.com, Expedia 등에서 활용된다.
분산 트랜잭션 설계에 남는 과제
SAGA는 마이크로서비스 환경에서 분산 트랜잭션의 일관성을 다루는 방법이다. 이벤트-트리거 방식과 컴앤드-오케스트레이션 방식 중 어느 쪽을 택할지는 트랜잭션의 복잡성, 서비스 간 결합도, 장애 허용성에 따라 달라진다.
금융, 전자상거래, 여행 예약처럼 복잡한 비즈니스 트랜잭션을 다루는 도메인에서는 보상 흐름 자체가 설계의 일부가 된다. 멱등성, 모니터링, 로깅을 뒷받침하는 인프라도 함께 갖춰야 한다.