PHpullh
학습 라이브러리/Java/사가(Saga) 패턴

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 메타데이터를 가집니다.