Blog

Bounded Context: 도메인 모델의 경계를 정의하는 핵심

이 글에서는 Bounded Context의 개념과 역할을 확인하고, 도메인 경계를 효과적으로 정의하는 방법을 제공합니다.

2025년 02월 21일

Spring Cloud 란 무엇인가요? MSA 필수 기술 구현

Bounded Context: 도메인 모델의 경계를 정의하는 핵심

Bounded Context는 도메인 주도 설계(DDD)의 핵심 개념 중 하나로, 특정 도메인 모델이 의미를 가지는 경계를 정의합니다. 이는 복잡한 비즈니스 시스템을 이해하고 관리하기 쉽게 만들어주는 중요한 도구입니다.

Bounded Context란 무엇인가요?

Bounded Context(경계를 가진 문맥)는 도메인 주도 설계(DDD, Domain-Driven Design)에서 핵심 개념 중 하나로, 특정 도메인의 개념과 의미를 명확하게 정의하는 경계(boundary)를 의미합니다. Bounded Context를 이해하는 것은 마치 건물을 짓기 전에 각 층과 방의 역할을 정의하는 것과 같습니다. 각각의 Bounded Context는 특정 비즈니스 영역에 집중하고, 내부적으로는 일관성을 유지하며, 외부와의 상호작용은 명확하게 정의된 방식으로 이루어집니다.

Bounded Context의 예시
  • 소프트웨어 개발에서는 같은 용어가 다르게 해석될 가능성이 크다. 예를 들어, “상품(Product)”이라는 개념이 “주문 시스템(Order System)“과 “재고 관리 시스템(Inventory System)“에서 각각 다른 의미를 가질 수 있다.
  • 주문 시스템에서는 “상품”이 고객이 구매한 항목을 의미한다.
  • 재고 관리 시스템에서는 “상품”이 창고에서 보관 중인 물리적 아이템을 의미한다.
  • 자상거래 시스템에서 “고객(Customer)” 개념이 다른 문맥에서 어떻게 달라지는지 살펴봅니다.
Bounded Context Customer의 의미 특징
주문 시스템 (Order System) 주문을 한 고객 고객의 주문 내역을 관리
마케팅 시스템 (Marketing System) 이메일을 받아볼 수 있는 고객 광고 캠페인, 이메일 마케팅 대상
고객 서비스 시스템 (Customer Support) 상담 이력이 있는 고객 고객 문의 및 지원 요청 기록
  • 이처럼 각 시스템에서 “Customer”라는 개념이 다르게 정의되므로 서로 다른 문맥(Context)에서 의미가 달라질 수 있습니다.
  • 이러한 개념적 충돌을 방지하고 명확한 경계를 설정하는 것이 Bounded Context의 핵심 목적이다.

Bounded Context와 이벤트 스토밍, 컨텍스트 매핑의 관계 및 진행 방법

1. 개념 간 관계

이벤트 스토밍으로 컨텍스트를 찾고, Bounded Context로 서비스 경계를 정의한 뒤, 컨텍스트 매핑을 통해 서비스 간의 상호작용을 정리하는 방식으로 진행된다. 이 과정을 거치면 MSA에서 서비스 간의 역할과 관계가 명확해지고, 향후 확장성과 유지보수성이 향상된다.

  • Bounded Context(경계 컨텍스트)는 도메인 모델을 독립적인 경계 내에서 관리할 수 있도록 정의하는 개념이다. 이는 MSA에서 서비스 분리를 결정하는 핵심 개념이다.
  • 이벤트 스토밍(Event Storming)은 도메인 이벤트를 중심으로 도메인을 탐색하고, 비즈니스 프로세스를 모델링하는 기법이다. 이를 통해 Bounded Context의 후보를 찾을 수 있다.
  • 컨텍스트 매핑(Context Mapping)은 여러 Bounded Context 간의 관계를 정의하는 기법이다. 즉, 이벤트 스토밍을 통해 Bounded Context를 도출한 후, 컨텍스트 매핑을 통해 이들이 상호작용하는 방식과 의존성을 정의하게 된다.
단계 역할 주요 활동
1. 이벤트 스토밍 Bounded Context 후보 도출 – 주요 이벤트 식별
– 애그리게잇 및 도메인 개념 정의
– 서비스 분리 기준 찾기
2. Bounded Context 정의 독립적 도메인 및 서비스 결정 – 도메인 모델 확정
– 데이터 모델 및 API 설계
– 내부 비즈니스 로직 정의
3. 컨텍스트 매핑 서비스 간 관계와 협력 방식 정의 – 서비스 간 상호작용 정의
– 관계 패턴 적용 (Customer
-Supplier, ACL 등)
– API 및 데이터 공유 방식 결정
2. 진행 절차 및 역할

1) 이벤트 스토밍: Bounded Context를 식별하는 과정

    • 핵심 도메인 전문가(도메인 전문가, 개발자, 기획자 등)들이 함께 참여하여 도메인 이벤트를 중심으로 논의한다.
    • 주요 이벤트(예: 주문 생성, 결제 승인, 배송 시작)를 식별하고, 이를 기반으로 애그리게잇(Aggregate)과 역할을 정의한다.
    • 이벤트 간 연관성을 분석하면서 자연스럽게 서비스를 어디서 분리할지, 즉 Bounded Context의 경계를 결정할 수 있다.

2) Bounded Context 정의: 서비스 및 도메인 책임 결정

    • 이벤트 스토밍에서 식별한 애그리게잇과 도메인 개념을 기반으로 각 컨텍스트의 역할과 책임을 구체화한다.
    • 컨텍스트 내에서 데이터 모델, API 설계, 내부 비즈니스 로직 등을 설계할 수 있다.

3) 컨텍스트 매핑: Bounded Context 간 관계 정의

    • Bounded Context가 하나의 독립된 서비스나 시스템이 되는 것이 아니라, 서로 협력하거나 의존하는 관계를 갖는다.
    • 이를 명확하게 정리하기 위해 컨텍스트 매핑을 수행하며, 다음과 같은 패턴을 적용할 수 있다.
      • Shared Kernel: 일부 핵심 모델을 공유
      • Customer-Supplier: 한 컨텍스트가 다른 컨텍스트의 출력에 의존
      • Anti-Corruption Layer: 다른 컨텍스트와의 직접적인 의존을 막기 위해 변환 계층 적용
      • Open Host Service: 공통 API를 제공하여 여러 컨텍스트가 동일한 인터페이스를 활용
3. 실무 적용 예시

예를 들어, 전자상거래 시스템을 MSA로 분리한다고 하면, 다음과 같은 절차를 따른다.

1) 이벤트 스토밍을 수행

    • “주문이 생성됨”, “결제가 승인됨”, “배송이 시작됨” 등의 주요 이벤트를 나열
    • 이를 기준으로 관련 애그리게잇(예: 주문, 결제, 배송)을 정의
    • 여기서 자연스럽게 주문 서비스, 결제 서비스, 배송 서비스 같은 Bounded Context를 도출

2) Bounded Context를 확정하고 서비스 분리

    • 주문 서비스: 주문 생성 및 상태 관리
    • 결제 서비스: 결제 승인 및 취소 처리
    • 배송 서비스: 배송 요청 및 진행 상황 관리

3) 컨텍스트 매핑을 통해 관계 정의

    • 주문 서비스는 결제 서비스와 Customer-Supplier 관계 (주문이 결제 승인 여부에 따라 진행)
    • 배송 서비스는 주문 서비스의 이벤트를 구독하는 구조
    • 결제 서비스와 주문 서비스 사이에 Anti-Corruption Layer를 적용하여 결제 시스템 변경 영향을 최소화

Bounded Context 관련 주요 개념 및 이론

Bounded Context를 깊이 이해하기 위해 중요한 개념들을 정리하였습니다. 이를 숙지하면 도메인 주도 설계(DDD)와 마이크로서비스 아키텍처(MSA)에서의 Bounded Context 개념을 보다 효과적으로 적용할 수 있습니다.

개념 설명
유비쿼터스 언어 Bounded Context 내에서 개발자와 비즈니스 담당자가 사용하는 공통 언어
애그리게잇 관련 엔티티와 값 객체를 묶어 일관성을 유지하는 단위
도메인 이벤트 도메인에서 발생한 중요한 상태 변화를 알리는 이벤트
Upstream-Downstream 관계 컨텍스트 간 변화의 방향성을 정의하는 개념
Anti-Corruption Layer 컨텍스트 간 데이터 변환 및 보호 계층
폴리글랏 퍼시스턴스 컨텍스트별로 최적화된 데이터 저장소를 선택하는 전략
1. 유비쿼터스 언어 (Ubiquitous Language)

Bounded Context 내에서 도메인 전문가와 개발자가 공통으로 사용하는 언어입니다. 유비쿼터스 언어를 통해 팀원 간 의사소통을 명확하게 하고, 비즈니스 로직을 보다 정확하게 이해할 수 있습니다. 일관된 용어를 사용함으로써 개발 과정에서 발생할 수 있는 오해를 줄이고, 코드와 비즈니스 개념 간의 불일치를 방지할 수 있습니다.

예제) 전자상거래 시스템을 개발할 때, ‘주문(Order)’이라는 용어가 다양한 의미로 사용될 수 있다.

  • 영업팀: 고객이 상품을 요청한 행위
  • 물류팀: 배송이 필요한 물품의 리스트
  • 회계팀: 매출이 발생한 기록

이처럼 같은 개념이 다른 의미로 사용될 수 있으므로, Bounded Context 내에서 ‘주문’이라는 용어를 정확하게 정의해야 한다. 예를 들어, “주문(Order)은 고객이 상품을 구매할 때 생성되는 비즈니스 트랜잭션이며, 주문 상태(Order Status)를 통해 진행 과정을 추적한다”라는 식으로 명확히 정의하면 혼선을 줄일 수 있다.

2. 애그리게잇 (Aggregate)

Bounded Context 내에서 데이터와 로직을 그룹화하는 개념으로, 하나의 트랜잭션 단위가 됩니다. 애그리게잇은 관련된 엔티티(Entity)와 값 객체(Value Object)들을 포함하며, 외부에서 접근할 수 있는 단일 진입점인 애그리게잇 루트(Aggregate Root)를 가집니다.

예제) “주문(Order)” 애그리게잇

“주문(Order)” 애그리게잇은 “주문 항목(Order Item)”을 포함하며, 외부에서는 주문 객체를 통해서만 주문 항목을 관리할 수 있습니다. 이를 통해 데이터 일관성을 유지하고, 내부 복잡성을 효과적으로 감출 수 있습니다.

클립보드에 복사
3. 도메인 이벤트 (Domain Event)

도메인 내에서 중요한 상태 변화가 발생했음을 알리는 개념입니다. 예를 들어, “주문이 생성됨(Order Created)”, “결제가 완료됨(Payment Completed)” 등의 이벤트가 존재할 수 있습니다.

도메인 이벤트는 비동기적으로 다른 컨텍스트에 전달될 수 있으며, 이벤트 기반 아키텍처에서 중요한 역할을 합니다. 이를 활용하면 서비스 간 결합도를 낮추고, 확장성을 높일 수 있습니다.

4. 컨텍스트 간 관계 및 통합 방법
  • Upstream-Downstream 관계 : Bounded Context 간 상호작용에서 한 컨텍스트가 다른 컨텍스트에 영향을 미치는 방향성을 나타냅니다.
    • Upstream 컨텍스트: 변화를 주도하는 컨텍스트
    • Downstream 컨텍스트: Upstream의 변경 사항을 따라가야 하는 컨텍스트
    • 예를 들어, “상품 카탈로그(Product Catalog)”가 변경되면, 이를 참조하는 “주문 시스템(Order System)”도 영향을 받을 수 있습니다.
  • Anti-Corruption Layer (ACL) : 서로 다른 컨텍스트 간의 영향을 최소화하기 위한 계층입니다.
    • 데이터 변환 및 API 어댑터 역할 수행
    • 외부 시스템의 변경이 내부 시스템에 직접적인 영향을 주지 않도록 보호
    • 예를 들어, 외부 결제 시스템이 JSON API를 제공하지만 내부 시스템에서는 XML을 사용해야 하는 경우, ACL을 통해 데이터를 변환하여 시스템 간의 충돌을 방지할 수 있습니다.
5. 폴리글랏 퍼시스턴스 (Polyglot Persistence)

각 Bounded Context가 최적화된 데이터 저장소를 선택하는 전략입니다.

  • 관계형 데이터베이스 (RDB)
  • NoSQL (MongoDB, Cassandra)
  • 인메모리 데이터 저장소 (Redis)

예를 들어, 주문 관리 시스템은 트랜잭션을 보장하기 위해 **관계형 데이터베이스(RDB)**를 사용하고, 추천 시스템은 빠른 검색을 위해 NoSQL을 사용할 수 있습니다.

마무리

Bounded Context는 도메인 모델의 경계를 정의하고, 복잡한 시스템을 관리하기 쉽게 만들어주는 강력한 도구입니다. 이벤트 스토밍 워크샵과 컨텍스트 매핑을 통해 Bounded Context를 효과적으로 정의하고 관리할 수 있습니다.

또한 유비쿼터스 언어, 엔티티, 값 객체, 애그리거트, 도메인 이벤트, 폴리글랏 퍼시스턴스 등과 같은 추가적인 개념을 이해하면, Bounded Context를 더욱 깊이 있게 이해하고 활용할 수 있습니다.

References & Related Links

Share This Story, Choose Your Platform!