5. Bounded Context (경계 컨텍스트)

박은서's avatar
May 01, 2026
5. Bounded Context (경계 컨텍스트)

1. Bounded Context (경계 컨텍스트)

1️⃣ Bounded Context란?

1) 정의

  • 하나의 도메인 모델이 의미를 가지는 “경계”
  • 같은 단어라도 컨텍스트(맥락)에 따라 의미가 달라지기 때문에
    • 그 의미를 명확하게 구분하는 영역

2) 한 줄 핵심

“같은 단어라도 의미가 다르면, 다른 컨텍스트로 나눠라”

2️⃣ 왜 필요한가?

1) 문제 상황

예: “Order”
영역
의미
쇼핑
주문
물류
배송 요청
회계
결제 내역
👉 같은 “Order”인데 의미가 다름

2) 문제점

  • 하나의 모델로 합치면
    • 필드가 계속 늘어남
    • 로직 충돌
    • 유지보수 지옥

3) 해결

👉 Bounded Context로 분리
[주문 컨텍스트] → 주문 생성 [결제 컨텍스트] → 결제 처리 [배송 컨텍스트] → 배송 관리

3️⃣ 핵심 개념 (중요)

1) 컨텍스트별로 모델이 다르다

같은 “Order”라도 다르게 정의됨
예시
  • 주문 컨텍스트
    • class Order { List<OrderItem> items; OrderStatus status; }
  • 결제 컨텍스트
    • class Order { Long orderId; int totalAmount; }
      👉 완전히 다른 모델임 (이게 핵심)

2) 컨텍스트 간 독립성

  • 서로 내부 구조 몰라도 됨
  • 필요한 정보만 주고받음
👉 느슨한 결합 (Loose Coupling)

3) 경계 안에서는 언어 통일

👉 유비쿼터스 언어
  • 주문 컨텍스트: “주문 생성”
  • 결제 컨텍스트: “결제 승인”
👉 같은 단어라도 의미 다르면 분리

4️⃣ Bounded Context vs MSA (중요)

👉 헷갈리는 포인트

1) 관계

개념
설명
Bounded Context
설계 개념
MSA
배포/아키텍처

2) 관계 정리

  • 이상적인 구조
    • Bounded Context 1 → 서비스 1 Bounded Context 2 → 서비스 2
  • 현실
    • 하나의 서비스에 여러 컨텍스트
    • 또는 하나의 컨텍스트를 여러 서비스로 쪼갬

5️⃣ 컨텍스트 간 통신 방식

1) API 호출

Order → Payment API 호출

2) 이벤트 기반 (추천)

OrderCreated 이벤트 발생 → Payment 서비스가 구독
👉 MSA에서 많이 사용

6️⃣ 실무 예시

👉 “예약 취소 → 승인 → 환불”

❌ 하나로 만든 경우

ReservationService - cancel() - approve() - refund()
👉 모든 책임이 한 곳 → 유지보수 어려움

✅ Bounded Context 적용

[예약 컨텍스트] - 예약 생성, 취소 요청 [관리자 컨텍스트] - 취소 승인 [결제 컨텍스트] - 환불 처리
  • 흐름
    • 1. 예약 취소 요청 2. 관리자 승인 3. 환불 처리
      ➡️ 각 컨텍스트가 자기 책임만 가짐

7️⃣ 장점 / 단점

✅ 장점

  • 복잡한 시스템 분리 가능
  • 팀 단위 개발 가능
  • 유지보수 쉬움
  • MSA로 확장 용이

❌ 단점

  • 설계 난이도 높음
  • 초기 분석 필요
  • 컨텍스트 경계 잘못 잡으면 오히려 더 복잡

8️⃣ 한 줄 핵심 정리

“모델의 의미가 바뀌는 지점에서 경계를 나누는 것”

🔥 중요한 포인트 (실무 감각)

1) “같은 이름 = 같은 모델”이 아니다

→ 의미 다르면 무조건 분리

2) Service 기준으로 나누지 말고

비즈니스 흐름 기준으로 나눠라

3) DB 기준으로 나누면 망한다

→ 항상 “업무 책임” 기준으로 나눠야 함
Share article