Backend · Architecture ·
[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 | 서비스 장애 시 fallback | Payment 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: 80816️⃣ 실무 팁 #
- 📝 서비스 독립성: 각 서비스 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