12/17

졸용·2025년 12월 17일

TIL

목록 보기
137/144

🔹 보상 트랜잭션이란?

보상 트랜잭션(Compensating Transaction)
분산 환경에서 이미 커밋된 작업을 “되돌리기 위해” 실행하는 추가 트랜잭션을 말한다.

❌ “롤백”이 아니라
✅ “취소·무효·상쇄”를 새로운 트랜잭션으로 수행하는 개념이다.



🔹 왜 보상 트랜잭션이 필요한가?

🔸 단일 DB 트랜잭션

BEGIN
  주문 생성
  결제 처리
ROLLBACK  ← 문제 생기면 한 번에 되돌림
  • ACID 보장
  • 하나의 DB / 하나의 트랜잭션 매니저
  • 롤백 가능

🔸 분산 트랜잭션 (MSA)

order-server      → 주문 생성 (COMMIT)
payment-server    → 결제 승인 (COMMIT)
delivery-server   → 배송 생성 ❌ 실패
  • 이미 각 서비스는 COMMIT 완료
  • 전통적인 ROLLBACK 불가능
  • 2PC는 현실적으로 성능·가용성 문제 큼

👉 그래서 등장한 개념이 보상 트랜잭션



🔹 보상 트랜잭션의 정의

보상 트랜잭션이란
이미 성공적으로 커밋된 트랜잭션의 효과를
비즈니스적으로 무효화하기 위해 실행하는 “역방향 트랜잭션”이다.

구분롤백보상 트랜잭션
실행 시점커밋 이전커밋 이후
방식DB 상태 복구새로운 비즈니스 동작
기술적 성격DB 기능애플리케이션 로직
사용 환경단일 시스템분산 시스템(MSA)


🔹 실제 예시로 보면 가장 명확함

예: 주문 → 배송 생성 실패

🔸 정상 흐름

  1. 주문 생성 ✅
  2. 허브 경로 계산 ✅
  3. 배송 생성 ❌ 실패

🔸 이때 “보상”은?

  • 주문을 ROLLBACK ❌ (이미 커밋됨)
  • 대신:
주문 상태 → CANCELED
배송 예약 데이터 → 취소 처리
결제 → 환불 (필요 시)

이 전체가 보상 트랜잭션이다.



🔹 Saga 패턴에서의 위치

보상 트랜잭션은 Saga 패턴의 핵심 구성 요소다.

🔸 Choreography Saga

  • 실패 이벤트 발생
  • 각 서비스가 자기 보상 로직 수행

🔸 Orchestrator Saga

  • 중앙 Orchestrator가
  • “A 실패 → B 보상 → C 보상” 순서 제어

👉 어떤 Saga든 보상 트랜잭션 없이는 성립 불가



🔹 보상 트랜잭션의 중요한 특성

🔸 항상 “완전 복구”를 목표로 하지 않는다

  • 재고 복구 ❌
  • 주문 취소 상태로 마킹 ✅
  • 금전적 환불만 보장하는 경우도 많음

🔸 멱등성(Idempotency)이 필수

같은 보상 이벤트가 2번 와도
결과는 1번 수행된 것과 동일해야 함
  • Kafka 중복 소비
  • 네트워크 재시도
  • 장애 복구 시 재처리

🔸 순서 보장이 중요

  • 배송 취소 → 결제 환불 (순서 중요)
  • 잘못하면 “배송 완료 후 환불” 같은 사고 발생

🔸 보상도 실패할 수 있다

  • 그래서 재시도 / DLQ / 알림 필요
  • “보상 트랜잭션도 하나의 비즈니스 트랜잭션”


🔹 요약 정리

보상 트랜잭션은 분산 환경에서 이미 커밋된 작업을 기술적으로 롤백할 수 없을 때, 비즈니스적으로 상태를 상쇄하기 위해 수행하는 역방향 트랜잭션이며, Saga 패턴의 핵심 구성 요소다.

profile
꾸준한 공부만이 답이다

0개의 댓글