JAVA · 디자인패턴
사가(Saga) 패턴
분산 트랜잭션을 보상 트랜잭션으로 관리하는 사가 패턴입니다.
디자인패턴고급Saga보상트랜잭션분산트랜잭션마이크로서비스
핵심 설명
분산 트랜잭션을 보상 트랜잭션으로 관리하는 사가 패턴입니다.
Java code
import java.util.*;
public class SagaPattern {
// 사가 단계 정의
interface SagaStep {
void execute() throws Exception;
void compensate(); // 보상 트랜잭션
}
// 사가 오케스트레이터
static class SagaOrchestrator {
private final List<SagaStep> steps = new ArrayList<>();
private final Deque<SagaStep> completed = new ArrayDeque<>();
void addStep(SagaStep step) { steps.add(step); }
void execute() {
for (SagaStep step : steps) {
try {
step.execute();
completed.push(step);
} catch (Exception e) {
System.out.println("실패! 보상 시작: " + e.getMessage());
rollback();
throw new RuntimeException("사가 실패", e);
}
}
System.out.println("사가 성공!");
}
private void rollback() {
while (!completed.isEmpty()) {
SagaStep step = completed.pop();
try {
step.compensate();
} catch (Exception e) {
System.err.println("보상 실패: " + e.getMessage());
}
}
}
}
public static void main(String[] args) {
SagaOrchestrator saga = new SagaOrchestrator();
saga.addStep(new SagaStep() {
public void execute() { System.out.println("1. 재고 차감"); }
public void compensate() { System.out.println("1. 재고 복구"); }
});
saga.addStep(new SagaStep() {
public void execute() { System.out.println("2. 결제 처리"); }
public void compensate() { System.out.println("2. 결제 취소"); }
});
saga.addStep(new SagaStep() {
public void execute() throws Exception {
System.out.println("3. 배송 요청");
throw new Exception("배송 서비스 장애");
}
public void compensate() { System.out.println("3. 배송 취소"); }
});
try { saga.execute(); } catch (Exception e) {
System.out.println("최종: " + e.getMessage());
}
}
}학습 팁
사가의 보상 트랜잭션은 반드시 멱등(idempotent)해야 합니다. 같은 보상을 여러 번 실행해도 결과가 같아야 합니다.
주의할 점
보상 트랜잭션이 실패하면 데이터 불일치가 발생합니다. 보상 실패에 대한 재시도/알림 전략이 필요합니다.
자주 묻는 질문
사가(Saga) 패턴란 무엇인가요?
분산 트랜잭션을 보상 트랜잭션으로 관리하는 사가 패턴입니다.
사가(Saga) 패턴 학습 시 주의할 점은 무엇인가요?
보상 트랜잭션이 실패하면 데이터 불일치가 발생합니다. 보상 실패에 대한 재시도/알림 전략이 필요합니다.
Continue Learning
Java 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.