Saga 패턴

IT 위키

사가 패턴(영어: Saga Pattern)은 마이크로서비스 아키텍처나 분산 시스템에서 여러 서비스에 걸친 다단계 트랜잭션을 관리하여 데이터 일관성을 확보하기 위한 설계 패턴이다.

정의[편집 | 원본 편집]

사가 패턴은 하나의 큰 트랜잭션을 여러 개의 로컬 트랜잭션으로 나누고, 각 로컬 트랜잭션이 자신의 데이터베이스를 업데이트한 뒤 다음 단계를 트리거하는 방식으로 실행된다. 만약 중간 단계에서 실패가 발생하면 이전에 완료된 단계들에 대해 보상 트랜잭션(compensating transaction)을 실행하여 시스템을 일관된 상태로 복구한다.

“사가(Saga)”라는 이름은 고대 북유럽의 장편 서사문학에서 유래했으며, 하나의 큰 트랜잭션이 여러 단계를 거치며 성공 또는 실패에 따라 보상되거나 계속 이어지는 구조가 이야기처럼 흐르는 연속성을 지닌다는 점에서 비유적으로 사용되었다. 이 용어는 1987년 Hector Garcia-Molina와 Kenneth Salem이 발표한 논문 「Sagas」에서 처음 제안되었다.

주요 구성 요소 및 작동 방식[편집 | 원본 편집]

  • 로컬 트랜잭션(Local Transaction)
각 서비스 내에서 ACID 원칙에 따라 실행되는 단위 작업이다.
  • 보상 트랜잭션(Compensating Transaction)
로컬 트랜잭션 이후 오류가 발생했을 때 이전 로컬 트랜잭션의 효과를 되돌리기 위한 작업이다.
  • 트랜잭션 흐름(Transaction Flow)
로컬 트랜잭션이 성공하면 다음 단계가 실행되며, 실패하면 보상 흐름이 실행된다.

장점[편집 | 원본 편집]

  • 여러 마이크로서비스에 걸친 작업을 단일 트랜잭션처럼 관리하면서도 전통적 2‑단계 커밋(2PC)의 단점(블로킹, 단일 실패 지점 등)을 피할 수 있다. [1]
  • 비동기 방식 및 느슨한 결합(loose coupling)을 통해 시스템 확장성과 유연성을 확보할 수 있다.
  • 실패 시 보상 트랜잭션을 통해 시스템을 일관된 상태로 유지할 수 있다.

단점 및 고려사항[편집 | 원본 편집]

  • 전체 흐름이 복잡해질 수 있으며, 특히 서비스 수가 많아질수록 설계 및 디버깅이 어려워진다.
  • 보상 트랜잭션을 설계해야 하며, 이 작업이 누락되거나 잘못 설계되면 데이터 불일치가 발생할 수 있다.
  • 격리(isolation)가 보장되지 않으므로 결국적 일관성(eventual consistency) 모델을 이해하고 수용해야 한다.
  • 트랜잭션 흐름이 길어지면 지연(latency)이 증가할 수 있다.

적용 가능한 상황 및 예시[편집 | 원본 편집]

적용에 적합한 경우[편집 | 원본 편집]

  • 마이크로서비스 아키텍처에서 여러 서비스가 독립적으로 데이터를 관리하고 있으며, 하나의 작업이 여러 서비스를 거쳐야 하는 경우.
  • 전통적 분산 트랜잭션(예: 2PC)이 적합하지 않거나 불가능한 환경에서 데이터 일관성을 확보해야 할 때.
  • 예컨대 주문 처리, 결제, 재고 관리, 배송 등 여러 단계가 연관된 비즈니스 흐름에 적합하다. [2]

예시[편집 | 원본 편집]

온라인 쇼핑몰에서 주문 처리 흐름을 다음과 같이 생각해보자:

  1. 주문 생성(Order Service)
  2. 결제 처리(Payment Service)
  3. 재고 차감(Inventory Service)

만약 결제 단계에서 오류가 발생하면, 결제가 성공한 상태라면 환불 처리하고, 주문 상태를 취소하며, 재고가 이미 차감됐다면 재고를 복구하는 보상 트랜잭션이 실행된다.

오케스트레이션 vs 코레오그래피 방식 비교[편집 | 원본 편집]

방식 특징 적합한 상황
오케스트레이션 중앙 오케스트레이터가 전체 흐름을 제어하고, 각 서비스에 호출 또는 명령을 내림. 흐름이 명확하고 관리가 용이함. 복잡한 워크플로우, 서비스 수가 많거나 제어가 필요할 때
코레오그래피 각 서비스가 이벤트를 발행하고 구독함으로써 흐름이 분산되어 진행됨. 느슨한 결합, 단일 실패점 없음. 단순한 흐름, 서비스 수가 적고 자율성이 높을 때

설계 팁 및 주의사항[편집 | 원본 편집]

  • 각 로컬 트랜잭션과 그에 대응하는 보상 트랜잭션을 명확히 정의해야 한다.
  • 각 단계를 가역적(undo 가능) 또는 보상 가능(compensable) 하도록 설계해야 한다. [3]
  • 흐름 상태를 추적할 로그 또는 상태 저장소(saga log)를 마련하여 장애 복구 또는 재시도가 가능하도록 해야 한다.
  • 아이디엠포턴트(idempotent)한 작업을 설계하여 재시도 시 이상 동작을 막아야 한다.
  • 서비스 경계(domain boundary)를 잘 정의하고, 너무 많은 책임이 한 사가에 몰리지 않도록 주의한다.
  • 사가의 복잡도가 지나치면 관리 비용이 증가하므로 초기에는 단순한 흐름으로 시작하는 것이 좋다.

결론[편집 | 원본 편집]

사가 패턴은 마이크로서비스 아키텍처에서 분산 트랜잭션 문제를 해결하기 위한 강력한 설계 방식이다. 다단계 작업을 여러 서비스가 협력해 수행하면서도, 실패 시 보상을 통해 일관성을 유지할 수 있다. 다만 설계와 구현이 복잡할 수 있으므로 팀과 시스템의 특성에 맞춰 신중히 적용하는 것이 중요하다.

같이 보기[편집 | 원본 편집]

참고 문헌[편집 | 원본 편집]

  • Microsoft Azure Architecture Center. “Saga Design Pattern.”
  • Baeldung. “Saga Pattern in Microservices.”
  • AWS. “Saga Pattern — AWS Prescriptive Guidance.”
  • Garcia-Molina, H., Salem, K. “Sagas.” ACM SIGMOD, 1987.
  1. Baeldung, “Saga Pattern in Microservices”
  2. Microsoft Azure Architecture Center, “Saga Design Pattern”
  3. Microsoft Azure Architecture Center, “Saga Design Pattern”