About SAGA Pattern
· 9 min read
✅ Saga 패턴이란?
마이크로서비스 아키텍처(MSA) 환경에서 분산된 서비스 간의 트랜잭션 정합성을 보장하기 위해
각 서비스의 로컬 트랜잭션 + 보상 트랜잭션을 결합하여
전체 트랜잭션의 일관성을 유지하는 패턴이다.
📌 왜 필요한가?
- MSA에서는 서비스마다 DB가 분리되어 있어 **전통적인 분산 트랜잭션(2PC)**을 사용하기 어려움
- 외부 시스템 호출 등은 트랜잭션 롤백이 불가능
- 이 문제를 해결하기 위해, 각 단계가 실패하면 보상 트랜잭션을 수행하는 구조 필요
🧩 구성 요소
구성 요소 | 설명 |
---|---|
SagaInstance | 전체 Saga 트랜잭션의 상태를 관리하는 객체 |
SagaStep | 각 단계(로컬 트랜잭션)의 상태를 관리하는 객체 |
SagaService | 상태의 전이 및 정합성 판단을 수행하는 도메인 서비스 |
SagaOrchestrator | 이벤트 기반으로 흐름을 전개하고 상태를 갱신하는 중앙 조정자 |
Kafka | 서비스 간 이벤트 전달을 위한 메시지 브로커 |
EventPublisher/EventHandler | 도메인 이벤트를 발행하고 Kafka로 전달하는 중개 계층 |
🔁 전체 흐름 정리
[도메인 서비스] (예: PaymentService)
→ 로컬 트랜잭션 처리
→ 성공/실패 여부에 따라 도메인 이벤트 발행
[Spring EventPublisher]
→ 내부 이벤트 시스템으로 이벤트 전달
[이벤트 핸들러] (예: PaymentEventHandler)
→ 이벤트 수신
→ Kafka로 메시지 전송
[Kafka 브로커]
→ 이벤트 전파
[SagaOrchestrator] (예: OrderSagaOrchestrator)
→ Kafka 메시지 수신
→ Saga 상태 객체(SagaInstance/SagaStep) 갱신
→ 다음 단계로 명령 전파 or 보상 명령 실행
[SagaService]
→ Saga 상태 정합성 판단, 전이 처리, 완료 여부 판단
📦 Saga 상 태 추적용 테이블 설계
saga_instance
테이블
컬럼명 | 설명 |
---|---|
saga_id | Saga 고유 ID (UUID) |
saga_type | 어떤 Saga인지 (예: OrderSaga) |
status | 전체 Saga 상태 (STARTED, IN_PROGRESS, COMPLETED, FAILED, COMPENSATED 등) |
created_at / updated_at | 타임스탬프 |
saga_step
테이블
컬럼명 | 설명 |
---|---|
step_id | 고유 ID |
saga_id | 상위 Saga 참조 |
step_name | 단계명 (예: ProcessPayment) |
status | 단계 상태 (PENDING, COMPLETED, FAILED, COMPENSATED) |
order_index | 실행 순서 |
last_error | 실패 사유 |
compensated_at | 보상 완료 시간 |