IT/아키텍처

SAGA 패턴

Life Log 2025. 11. 24. 22:58
728x90
반응형

분산 트랜잭션의 핵심 전략

마이크로서비스 아키텍처(MSA)를 적용하면 서비스마다 별도의 DB를 가지게 됩니다.
그때 가장 큰 문제가 바로 트랜잭션(데이터 일관성)이에요.

기존 모놀리식처럼 하나의 DB에서 “BEGIN → COMMIT”으로 끝낼 수가 없죠.

MSA에서는 아래와 같은 문제가 생깁니다.

  • 주문 서비스에서 주문 데이터 저장
  • 결제 서비스에서 결제 승인
  • 재고 서비스에서 재고 감소

이 3개가 한 번에 성공해야 하는데
중간에 하나라도 실패하면 어떻게 해야 할까?

이걸 해결하는 대표적 패턴이 바로 SAGA 패턴입니다.


🧩 SAGA 패턴이란?

여러 개의 로컬 트랜잭션을 순차적으로 실행하고,
중간에 실패 시 이전 단계들을 보상(Compensation) 트랜잭션으로 되돌리는 패턴.

한 줄로 표현하면:

“분산 환경에서 2PC(2-Phase Commit)를 대체하는 실용적인 대안.”

즉, 분산 트랜잭션을 “되돌림(보상)” 방식으로 처리하는 구조예요.


⚙ SAGA의 두 가지 구현 방식

1) 코레오그래피(Choreography)

“이벤트 기반, 서비스들이 자율적으로 협업하는 방식”

각 서비스가 이벤트를 발행하고,
다른 서비스가 그 이벤트를 구독해서 자기 일을 진행함.

흐름 예시

OrderService → "주문 생성됨" 이벤트 발행
  ↓
PaymentService → "결제 성공" 이벤트 발행
  ↓
InventoryService → "재고 차감 완료" 이벤트 발행

장점

  • 서비스 간 결합도가 낮음
  • 구현이 단순함
  • 이벤트 기반으로 확장성이 좋음

단점

  • 전체 트랜잭션 흐름을 파악하기 어려움
  • 복잡한 비즈니스에서는 이벤트 폭발(Event Storming) 가능

2) 오케스트레이션(Orchestration)

“중앙에서 SAGA Coordinator가 흐름을 지휘하는 방식”

하나의 중앙 서비스(Coordinator)가
각 서비스를 순차적으로 호출하고 성공/실패를 관리함.

흐름 예시

[Saga Coordinator]
   → OrderService 호출
   → PaymentService 호출
   → InventoryService 호출

장점

  • 흐름을 한 곳에서 관리하므로 가시성이 좋음
  • 복잡한 프로세스에 유리함

단점

  • Coordinator 중심 구조가 부담될 수 있음
  • 중앙 집중형 구조 → Coordinator 의존성 증가

🔙 SAGA의 핵심: 보상 트랜잭션(Compensation)

MSA에서는 “롤백”이 아니라 보상 작업을 수행합니다.

예시로 보면 더 쉽죠.

💳 주문 시스템 예시

1) 정상 흐름

  1. 주문 생성
  2. 결제 승인
  3. 재고 차감
  4. 주문 확인 완료

2) 중간 단계에서 실패가 발생하면?

예를 들어 재고 감소에서 실패했다면:

  • 재고 차감 실패 → 결제 취소 → 주문 취소
    이렇게 역순으로 보상 트랜잭션을 실행합니다.

근데 여기서 중요한 건:

보상 트랜잭션은 “정확한 반대 작업”이 아니라
비즈니스적으로 인정할 수 있는 상쇄 작업입니다.


🧪 SAGA 작동 예시 (텍스트 시나리오)

[Start]
 OrderService: 주문 생성 성공
 PaymentService: 결제 승인 성공
 InventoryService: 재고 부족 → 실패 발생
 → Compensation 시작
 PaymentService: 결제 취소
 OrderService: 주문 취소
[End: 전체 실패 처리]

이렇게 해서 일관성을 맞추는 것이 SAGA의 핵심이에요.


🧠 SAGA를 사용할 때의 주의사항

1) 보상 트랜잭션이 반드시 존재해야 한다

“되돌릴 수 없는 작업”이 있으면 SAGA 적용이 어려움
예: 물리적 배송 출발, 외부 시스템 irreversible 처리 등

2) eventually consistent(최종적 일관성)를 이해해야 함

MSA에서는 즉시 일관성이 아니라
시간차를 두고 데이터가 맞춰지는 모델이에요.

3) 이벤트 중복 처리 대비 필요

네트워크 특성상 같은 이벤트가 여러 번 발생할 수 있음 → idempotency 필요

4) 장애 상황에 강한 구조 필요

이벤트 소실, 중복, 지연에 대한 전략이 필요합니다.


💡 SAGA가 필요한 상황

✔ 마이크로서비스로 분리됐고, 여러 서비스가 하나의 비즈니스 트랜잭션을 구성할 때
✔ 결제·주문·재고처럼 강한 일관성이 필요한 비즈니스
✔ 외부 API 호출이 끼어 있는 트랜잭션
✔ 동기식 2PC가 불가능하거나 성능 문제가 있을 때

특히 전자상거래, 금융, 물류에서 거의 필수입니다.


📌 SAGA 패턴과 MSA 아키텍처 연결하면?

MSA를 도입했다고 끝나는 게 아니라,
서비스 간 데이터 일관성 전략이 반드시 필요해요.

SAGA는 그중에서도 가장 널리 쓰이고 실용적인 해법입니다.

  • Orchestration ↔ BPM(업무 프로세스)
  • Choreography ↔ Event Driven Architecture
  • 보상 트랜잭션 ↔ 기업 운영 규칙

이렇게 비즈니스 흐름까지 연결해서 설계하면
정말 안정적인 분산 트랜잭션 구조가 만들어집니다.


✨ 마무리

SAGA 패턴은 분산 시스템에서 발생하는 “트랜잭션 일관성 문제”를
현실적으로 해결하기 위한 강력한 방법입니다.

“롤백이 아니라 보상으로 해결한다.”

이 한 문장이 SAGA 패턴의 모든 핵심을 담고 있어요.

MSA를 도입한다면 반드시 SAGA를 이해하고 있어야 하고,
SAGA 없이는 분산 환경에서 안정적인 트랜잭션을 보장하기 어렵습니다.

 

728x90
반응형