[Microservice Pattern 실전] 주문-결제-배송 시스템 설계와 Docker/K8s 적용

🚀 Microservice Pattern 실전 예제: 주문-결제-배송 시스템 #

마이크로서비스 아키텍처는 하나의 큰 애플리케이션을 작고 독립적인 서비스 단위로 나누어 운영하는 방법론입니다.
이번 글에서는 실전 예제와 함께 Docker/Kubernetes 환경 + 이벤트 기반 Saga를 적용해보겠습니다.


1️⃣ 핵심 패턴 요약 #

패턴설명실전 예제 적용
Database per Service각 서비스가 자체 DB 보유Order DB, Payment DB, Shipping DB
API Gateway단일 진입점, 인증/로깅/라우팅Client → API Gateway → 각 서비스
Circuit Breaker서비스 장애 시 fallbackPayment Service 실패 시 주문 롤백
Saga분산 트랜잭션 관리주문 → 결제 → 배송 순서 처리
Event-Driven이벤트 기반 비동기 통신OrderCreatedEvent → Payment → Shipping

2️⃣ 서비스 구조 예시 #

microservice-app/
├── order-service/
│    ├── src/
│    └── database/
├── payment-service/
│    ├── src/
│    └── database/
├── shipping-service/
│    ├── src/
│    └── database/
└── api-gateway/
└── src/

각 서비스는 독립 배포 가능하며, API Gateway로 외부 요청 처리


3️⃣ 도메인 모델링 #

3.1 Order 엔티티 #

 1public class Order {
 2    private final String id;
 3    private final String customerId;
 4    private final List<OrderItem> items = new ArrayList<>();
 5    private String status = "PENDING";
 6
 7    public void addItem(String productId, int quantity) {
 8        items.add(new OrderItem(productId, quantity));
 9    }
10
11    public void confirm() { status = "CONFIRMED"; }
12}

3.2 Payment 도메인 서비스 #

1public class PaymentService {
2    public boolean pay(Order order, String method) {
3        if (!order.getStatus().equals("CONFIRMED")) {
4            throw new IllegalStateException("결제 전 주문만 처리 가능");
5        }
6        return true; // 실제 결제 로직
7    }
8}

3.3 이벤트 발행 #

1public class OrderCreatedEvent {
2    private final String orderId;
3    public OrderCreatedEvent(String orderId) { this.orderId = orderId; }
4}
  • OrderService → 이벤트 발행 → PaymentService → 처리 → ShippingService로 이벤트 전파

4️⃣ 이벤트 기반 Saga 예제 #

 1// 주문 생성 → 결제 → 배송
 2OrderService.createOrder(order);
 3eventBus.publish(new OrderCreatedEvent(order.getId()));
 4
 5PaymentService subscribes OrderCreatedEvent
 6   결제 성공  PaymentCompletedEvent 발행
 7   실패  OrderCancelledEvent 발행
 8
 9ShippingService subscribes PaymentCompletedEvent
10   배송 처리

Saga를 통해 분산 트랜잭션을 안전하게 처리


5️⃣ Docker & Kubernetes 예제 #

5.1 Dockerfile (Order Service 예시) #

1FROM openjdk:17-jdk-slim
2WORKDIR /app
3COPY target/order-service.jar .
4ENTRYPOINT ["java", "-jar", "order-service.jar"]

5.2 docker-compose 예시 #

 1version: '3'
 2services:
 3  order-service:
 4    build: ./order-service
 5    ports:
 6      - "8081:8081"
 7    networks:
 8      - micro-net
 9  payment-service:
10    build: ./payment-service
11    ports:
12      - "8082:8082"
13    networks:
14      - micro-net
15  shipping-service:
16    build: ./shipping-service
17    ports:
18      - "8083:8083"
19    networks:
20      - micro-net
21networks:
22  micro-net:

5.3 Kubernetes Deployment (Order Service) #

 1apiVersion: apps/v1
 2kind: Deployment
 3metadata:
 4  name: order-service
 5spec:
 6  replicas: 2
 7  selector:
 8    matchLabels:
 9      app: order-service
10  template:
11    metadata:
12      labels:
13        app: order-service
14    spec:
15      containers:
16        - name: order-service
17          image: order-service:latest
18          ports:
19            - containerPort: 8081

6️⃣ 실무 팁 #

  • 📝 서비스 독립성: 각 서비스 DB와 로직 독립
  • 📝 API Gateway 활용: 인증/라우팅/로깅 집중 관리
  • 📝 이벤트 기반 설계: Saga, Event-Driven으로 느슨한 결합
  • 📝 Circuit Breaker: 장애 시 fallback 처리 필수
  • 📝 모니터링 & 로깅: Prometheus, ELK 등 활용

7️⃣ 정리 #

  • 마이크로서비스 패턴은 단순히 나누는 구조가 아니라, 패턴 기반 설계 + 인프라 적용까지 포함
  • 핵심 패턴: Database per Service, API Gateway, Circuit Breaker, Saga, Event-Driven
  • 실무 적용: 작은 서비스부터 시작 → 이벤트 기반 통신 → Docker/K8s 배포 → 모니터링

💡 결론: 마이크로서비스는 단순한 구조 분리보다 설계 패턴과 운영 전략을 포함한 전반적 아키텍처 접근이 핵심입니다.

Advertisement