🌳 고급 고급
Saga 패턴
쉽게 이해하기
여행사에서 항공권, 호텔, 렌터카를 예약한다고 해보세요. 항공권 예약은 성공했는데 호텔 예약이 실패하면 어떻게 할까요? 이미 끊은 항공권을 취소해야겠죠. Saga 패턴은 이런 식으로 각 단계를 순서대로 진행하다가, 중간에 실패하면 이전 단계들을 역순으로 취소(보상)하는 거예요.
핵심 정리
마이크로서비스 환경에서 여러 서비스에 걸친 트랜잭션을 관리하기 위해, 각 단계를 독립적으로 실행하고 실패 시 보상 트랜잭션으로 롤백하는 패턴이에요.
자세히 알아보기
모놀리식 애플리케이션에서는 데이터베이스 트랜잭션으로 여러 작업을 하나로 묶을 수 있어요. 실패하면 전체 롤백하면 되니까 간단하죠. 하지만 마이크로서비스는 각 서비스가 독립적인 데이터베이스를 가지고 있어서, 전통적인 분산 트랜잭션(2PC)은 성능과 복잡도 문제로 쓰기 힘들어요.
Saga 패턴은 긴 트랜잭션을 여러 개의 작은 로컬 트랜잭션으로 쪼개요. 주문 처리를 예로 들면 '재고 확인 → 결제 처리 → 배송 생성' 순서로 진행하는데, 각 단계마다 보상 트랜잭션을 정의해둬요. 결제가 실패하면 이미 감소시킨 재고를 복구하는 식이죠.
구현 방식은 두 가지예요. Choreography 방식은 각 서비스가 이벤트를 발행/구독하면서 다음 단계를 진행해요. 중앙 조정자 없이 분산되어 있지만, 전체 흐름을 파악하기 어렵죠. Orchestration 방식은 Saga 조정자가 각 서비스를 순서대로 호출해요. 흐름이 명확하지만 조정자가 단일 장애점이 될 수 있어요.
주의할 점은 보상 트랜잭션이 항상 성공한다고 보장할 수 없다는 거예요. 그래서 재시도 로직, 타임아웃 처리, 수동 개입 절차까지 고려해야 해요. 이커머스의 주문 처리, 예약 시스템, 금융 거래처럼 여러 서비스가 협력해야 하는 비즈니스 프로세스에서 필수적인 패턴이에요.