마이크로서비스에서 트랜잭션을 처리하는 방법
모놀리식 시스템에서는 데이터베이스 트랜잭션을 사용하는 것이 일반적이다.
예를 들어 주문 시스템을 생각해 보자.
→ 결제 처리
→ 재고 차감
이 과정은 보통 하나의 트랜잭션으로 처리된다.
INSERT ORDER
UPDATE PAYMENT
UPDATE INVENTORY
COMMIT
만약 중간에 문제가 발생하면
으로 전체 작업을 취소할 수 있다.
이것이 ACID 트랜잭션이다.
하지만 마이크로서비스 아키텍처(MSA)에서는 상황이 달라진다.
서비스가 여러 개로 나뉘기 때문이다.
MSA에서 발생하는 트랜잭션 문제
MSA 환경에서는 각 서비스가 자신의 데이터베이스를 가진다.
예를 들어 다음 구조를 생각해 보자.
→ orders DB
Payment Service
→ payments DB
Inventory Service
→ inventory DB
주문 생성 과정은 다음과 같이 진행된다.
2. Payment Service → 결제 처리
3. Inventory Service → 재고 차감
문제는 이 과정이 하나의 트랜잭션으로 묶일 수 없다는 것이다.
예를 들어 다음 상황을 생각해 보자.
Payment 성공
Inventory 실패
이 경우 주문과 결제는 성공했지만
재고 차감이 실패했다.
모놀리식 시스템이라면 롤백이 가능하지만
MSA에서는 서비스가 분리되어 있기 때문에 쉽지 않다.
이 문제를 해결하기 위해 등장한 패턴이 바로
Saga 패턴이다.
Saga 패턴이란 무엇인가
Saga 패턴은 여러 서비스에 걸친 트랜잭션을 단계별로 처리하는 방식이다.
각 서비스는 자신의 로컬 트랜잭션을 수행한다.
만약 중간에 실패하면
이전에 수행한 작업을 보상 트랜잭션(Compensation Transaction)으로 취소한다.
예를 들어 주문 처리 과정은 다음과 같이 구성된다.
2. Payment 처리
3. Inventory 차감
만약 재고 차감이 실패하면
Order 취소
와 같은 보상 작업이 실행된다.
즉 Saga 패턴은
대신
을 사용하는 구조다.
Saga 패턴의 두 가지 방식
Saga 패턴은 보통 두 가지 방식으로 구현된다.
1. Choreography 방식
Choreography 방식에서는
서비스들이 이벤트 기반으로 서로 통신한다.
예를 들어 주문 생성 이벤트가 발생하면
이 이벤트를 다른 서비스들이 처리한다.
→ OrderCreated 이벤트 발행
Payment Service
→ 결제 처리
→ PaymentCompleted 이벤트 발행
Inventory Service
→ 재고 차감
만약 재고 차감이 실패하면
같은 보상 이벤트를 발행한다.
이 방식의 장점은 중앙 컨트롤러가 없다는 것이다.
하지만 서비스 간 흐름이 복잡해질 수 있다.
2. Orchestration 방식
Orchestration 방식에서는
중앙 Saga Coordinator가 흐름을 관리한다.
예를 들어 다음과 같은 구조다.
→ Order Service 호출
→ Payment Service 호출
→ Inventory Service 호출
만약 실패하면
→ Payment 취소
→ Order 취소
와 같이 보상 작업을 실행한다.
이 방식은 흐름 관리가 명확하지만
중앙 컨트롤러에 의존하게 된다.
Saga 패턴이 필요한 상황
Saga 패턴은 다음과 같은 상황에서 필요하다.
1. 여러 서비스에 걸친 트랜잭션
예를 들어 다음 작업이 있다.
- 주문 생성
- 결제 처리
- 재고 차감
- 배송 준비
각 서비스가 서로 다른 데이터베이스를 사용할 경우
Saga 패턴이 필요하다.
2. 이벤트 기반 시스템
Event Driven Architecture를 사용하는 경우
Saga 패턴은 자연스럽게 등장한다.
예를 들어 다음 이벤트 흐름이 있다.
즉 Saga 패턴은
대신
을 사용하는 구조다.
Saga 패턴의 두 가지 방식
Saga 패턴은 보통 두 가지 방식으로 구현된다.
1. Choreography 방식
Choreography 방식에서는
서비스들이 이벤트 기반으로 서로 통신한다.
예를 들어 주문 생성 이벤트가 발생하면
이 이벤트를 다른 서비스들이 처리한다.
→ OrderCreated 이벤트 발행
Payment Service
→ 결제 처리
→ PaymentCompleted 이벤트 발행
Inventory Service
→ 재고 차감
만약 재고 차감이 실패하면
같은 보상 이벤트를 발행한다.
이 방식의 장점은 중앙 컨트롤러가 없다는 것이다.
하지만 서비스 간 흐름이 복잡해질 수 있다.
2. Orchestration 방식
Orchestration 방식에서는
중앙 Saga Coordinator가 흐름을 관리한다.
예를 들어 다음과 같은 구조다.
→ Order Service 호출
→ Payment Service 호출
→ Inventory Service 호출
만약 실패하면
→ Payment 취소
→ Order 취소
와 같이 보상 작업을 실행한다.
이 방식은 흐름 관리가 명확하지만
중앙 컨트롤러에 의존하게 된다.
Saga 패턴이 필요한 상황
Saga 패턴은 다음과 같은 상황에서 필요하다.
1. 여러 서비스에 걸친 트랜잭션
예를 들어 다음 작업이 있다.
- 주문 생성
- 결제 처리
- 재고 차감
- 배송 준비
각 서비스가 서로 다른 데이터베이스를 사용할 경우
Saga 패턴이 필요하다.
2. 이벤트 기반 시스템
Event Driven Architecture를 사용하는 경우
Saga 패턴은 자연스럽게 등장한다.
예를 들어 다음 이벤트 흐름이 있다.
'Architecture' 카테고리의 다른 글
| 좋은 아키텍처는 기술이 아니라 ‘변경 비용’을 줄이는 것이다 (0) | 2026.03.12 |
|---|---|
| MSA에서 데이터 일관성(Eventual Consistency)을 어떻게 관리할까 (0) | 2026.03.12 |
| MSA에서 이벤트 드리븐 아키텍처를 언제 도입해야 할까 (0) | 2026.03.12 |
| 왜 MSA에서는 기술 통일보다 서비스 경계가 더 중요할까 (0) | 2026.03.12 |
| 왜 요즘 MSA에서 Node + Python + Java가 같이 쓰이는가 (0) | 2026.03.12 |
