도메인, 서브도메인, 바운디드 컨텍스트
소프트웨어 개발에서 **도메인 주도 설계(Domain-Driven Design, DDD)**는 복잡한 비즈니스 도메인을 효과적으로 관리하고, 비즈니스 목표에 부합하는 고품질의 소프트웨어 모델을 설계하는 데 중요한 역할을 합니다. 이번 포스트에서는 DDD의 두 번째 장인 **"Domains, Subdomains, and Bounded Contexts"**을 바탕으로 도메인, 서브도메인, 그리고 바운디드 컨텍스트의 개념과 그 중요성에 대해 심도 있게 살펴보겠습니다.
도메인, 서브도메인, 바운디드 컨텍스트란?
**도메인(Domain)**은 조직이 수행하는 일과 그들이 활동하는 세계를 의미합니다. 각 조직은 고유한 전문 지식과 운영 방식을 가지고 있으며, 이를 통해 시장에서 제품과 서비스를 제공합니다. 소프트웨어를 개발할 때, 우리는 이러한 조직의 도메인 내에서 작업하게 됩니다.
**서브도메인(Subdomain)**은 전체 도메인을 구성하는 개별적인 비즈니스 기능이나 영역을 말합니다. 대규모 조직이든 소규모 조직이든, 성공적인 비즈니스를 위해서는 여러 가지 기능을 분리하여 관리하는 것이 유리합니다. 예를 들어, 온라인 소매업체의 도메인은 제품 카탈로그, 주문, 인보이싱, 배송 등의 서브도메인으로 나눌 수 있습니다.
**바운디드 컨텍스트(Bounded Context)**는 특정 서브도메인이 독립적으로 모델링되고 개발되는 명확한 경계를 의미합니다. 각 바운디드 컨텍스트 내에서는 일관된 유비쿼터스 언어(Ubiquitous Language)가 사용되어 모델링됩니다. 이는 용어의 혼동을 방지하고, 각 컨텍스트 간의 상호 작용을 명확히 하기 위해 중요합니다.
전략적 설계의 중요성
**전략적 설계(Strategic Design)**는 DDD의 핵심 요소로, 도메인과 서브도메인을 명확히 구분하고, 바운디드 컨텍스트를 정의함으로써 전체 시스템의 복잡성을 관리할 수 있습니다. 전략적 설계를 소홀히 하면, 여러 서브도메인이 하나의 바운디드 컨텍스트에 혼합되어 복잡하고 유지보수가 어려운 시스템이 될 수 있습니다.
전략적 설계는 다음과 같은 이유로 중요합니다:
복잡성 관리: 복잡한 시스템을 여러 개의 작은 부분으로 나누어 관리할 수 있습니다.
팀 간 협업 촉진: 각 팀이 독립적인 바운디드 컨텍스트를 담당함으로써 충돌을 줄이고 효율적으로 협업할 수 있습니다.
유비쿼터스 언어의 일관성 유지: 각 컨텍스트 내에서 일관된 언어를 사용하여 소통의 명확성을 높입니다.
실제 사례: SaaSOvation의 도메인 분석
SaaSOvation은 두 가지 주요 SaaS 제품, CollabOvation과 ProjectOvation을 개발하는 회사입니다. 이 두 제품을 통해 DDD의 개념을 실제로 어떻게 적용하는지 살펴보겠습니다.
도메인과 서브도메인의 분리
SaaSOvation의 e-Commerce System을 예로 들어보겠습니다. 이 시스템은 다음과 같은 서브도메인으로 구성됩니다:
Product Catalog: 제품 목록을 관리합니다.
Orders: 주문을 처리합니다.
Invoicing: 청구서를 생성합니다.
Shipping: 제품을 배송합니다.
Inventory: 재고를 관리합니다.
External Forecasting: 판매 예측을 담당합니다.
바운디드 컨텍스트의 역할
바운디드 컨텍스트는 도메인 모델의 경계를 명확히 함으로써, 동일한 용어가 다른 의미로 사용되는 것을 방지합니다. 예를 들어, e-Commerce System 내에서의 "Customer"는 주문과 관련된 의미를 가지지만, Inventory System 내에서는 재고 관리와 관련된 의미를 가질 수 있습니다. 이러한 용어의 혼동을 피하기 위해 각 컨텍스트는 독립적인 유비쿼터스 언어를 사용합니다.
바운디드 컨텍스트의 설계 원칙
바운디드 컨텍스트를 효과적으로 설계하기 위해 다음과 같은 원칙을 따르는 것이 중요합니다:
명확한 경계 설정: 각 바운디드 컨텍스트는 명확한 경계를 가져야 하며, 그 안에서만 특정 도메인 모델이 사용되어야 합니다.
유비쿼터스 언어의 일관성: 각 컨텍스트 내에서 사용하는 용어는 일관되어야 하며, 다른 컨텍스트와는 독립적으로 관리되어야 합니다.
컨텍스트 간의 통합 관리: 서로 다른 컨텍스트 간의 데이터 교환과 통합은 명확한 인터페이스와 계약을 통해 관리되어야 합니다.
독립적인 배포와 개발: 각 컨텍스트는 독립적으로 개발되고 배포될 수 있어야 하며, 다른 컨텍스트에 대한 의존성을 최소화해야 합니다.
전략적 설계를 통한 모델링 개선
SaaSOvation의 사례에서 보듯이, 초기에는 CollabOvation 팀이 보안과 권한 관리를 협업 모델에 통합하려다가 문제가 발생했습니다. 이는 도메인 모델의 경계를 명확히 하지 않았기 때문입니다. 팀은 이를 해결하기 위해 다음과 같은 전략적 설계 단계를 거쳤습니다:
세그리게이티드 코어(Segregated Core): 보안과 권한 관리를 별도의 모듈로 분리하여 기존 협업 모델에서 분리했습니다.
바운디드 컨텍스트 분리: 보안과 권한 관리를 담당하는 Identity and Access Context를 별도로 정의했습니다.
컨텍스트 맵(Context Map): 서로 다른 바운디드 컨텍스트 간의 통합 방식을 정의하여, 시스템 간의 의존성을 명확히 했습니다.
이 과정을 통해 팀은 보안과 권한 관리가 협업 모델과 분리되어, 각각의 바운디드 컨텍스트가 독립적으로 관리될 수 있게 되었습니다. 이는 시스템의 유연성과 유지보수성을 크게 향상시켰습니다.
실제 프로젝트에서 도메인, 서브도메인, 바운디드 컨텍스트를 이해하고 정의하기 위해 화이트보드 작업을
도메인 식별: 자신이 속한 조직이나 프로젝트의 도메인을 명확히 정의합니다.
서브도메인 목록 작성: 일상 업무에서 인식되는 모든 서브도메인을 목록화합니다.
바운디드 컨텍스트 분리: 각 서브도메인을 독립적인 바운디드 컨텍스트로 분리하여 그 경계를 설정합니다.
컨텍스트 맵 작성: 바운디드 컨텍스트 간의 관계와 통합 방식을 시각화합니다.
이 과정을 통해 자신의 프로젝트에 맞는 DDD 모델을 구축할 수 있습니다
**도메인 주도 설계(Domain-Driven Design, DDD)**는 도메인, 서브도메인, 바운디드 컨텍스트를 명확히 구분하여 복잡한 비즈니스 시스템을 효과적으로 관리하고, 유지보수성과 확장성을 높이는 강력한 접근 방식입니다. 전략적 설계를 통해 각 서브도메인을 독립적인 바운디드 컨텍스트로 모델링함으로써, 팀 간의 협업을 촉진하고, 도메인 전문가와 개발자 간의 소통을 원활하게 할 수 있습니다.
DDD를 성공적으로 도입하기 위해서는 도메인 전문가와의 긴밀한 협력, 유비쿼터스 언어의 개발, 그리고 전략적 및 전술적 설계 패턴의 올바른 적용이 필요합니다.
Last updated
Was this helpful?