Domain Driven Design - (1)
0. 목차
1. 도메인 주도 설계란?
소프트웨어 및 시스템을 구축하기 위해서는 우선 ‘문제’ 자체를 이해해야 한다.
- 문제 : 조직의 비즈니스 전략과 소프트웨어를 통해 얻고자 하는 가치를 의미한다.
- 문제를 이해하려면 그것이 존재하는 ‘맥락’을 이해해야 한다.
- 비즈니스 도메인 : 기업의 주요 활동 영역, 회사가 제공하는 서비스를 의미한다.
- 하위 도메인 : 비즈니스 활동의 세분화된 영역, 제공하는 서비스 단위를 의미한다.
2. 하위 도메인
비즈니스 활동의 세분화된 영역, 제공하는 서비스 단위를 의미한다.
2.1. 하위 도메인 유형
하위 도메인 유형에는 크게 3가지가 존재한다.
핵심(Core)
- 회사가 경쟁력을 갖추기 위해서 경쟁 업체들과 차별점으로 수행하고 있는 것(핵심 BM)
- 복잡성은 높은 경우일 가능성이 높지만 비즈니스에 대한 경쟁력을 제공한다.
- Ex) 우버의 방향에 따른 손님 매칭 서비스, 구글의 검색 순위 알고리즘
일반(Generic)
- 모든 회사가 같거나 비슷한 방식으로 수행하는 비즈니스 활동
- 복잡하고 구현하기 어려우나, 경쟁력을 제공하지 않으면 안되는 알려진 영역
- Ex) 인증, 권한 부여
지원(Supporting)
- 회사의 비즈니스를 지원하는 다양한 활동들
- 기능은 간단하며, 경쟁 우위를 제공할 가능성이 적은 것들
- Ex) 게시판, 단순 ETL 시스템 등등
2.2. 하위 도메인 구현 방법
핵심(Core)
- 사내에서 주로 구현하며, 조직내의 핵심 인력들에게 할당하는 중요 업무
- 지속적으로 변경이 예상되므로 가장 진보적인 엔지니어링 기술을 적용할 필요가 있다.
일반(Generic)
- 이미 만드렁진 제품 혹은 오픈 소스 솔루션을 이용하여 사용한다.
지원(Supporing)
- 구현 및 유지보수 비용을 고려하여 외부 솔루션을 사용할 가능성이 높다.
- 사내 예산/비용 등에 의하여 언제든지 자체 구현할 가능성도 존재한다.
- 정교한 디자인 패턴이나 고급 엔지니어링 기술이 필요 없는 경우가 많다.
2.3. 하위 도메인 식별
- 이미 존재하는 경우 이에 대한 문서나 커뮤니케이션
- 회사의 부서 혹은 조직 단위의 형태
- 응집된 유스케이스의 집합
3. 멘탈 모델과 도메인 지식
- 도메인 지식(멘탈 모델) : 도메인 전문가가 문제를 생각하는 방식을 의미한다.
- 문제를 해결하기 위해서는 ‘문제’ 자체를 이해해야한다.(맥락 포함)
3.1. Model Driven Architecture(MDA)
전통적인 모델링 방식인 Model Driven Architecture 는 아래와 같은 과정을 거쳤다.
- CIM(Computation Idependet Model) 에플리케이션에 대한 비즈니스 요구사항을 수집한다.
- PIM(Platform Idependent model) 도메인 모델에 대한 UML 다이어그램을 작성한다.(특정 기술에 종속적이지 않은)
작성된 UML 모델은 핵심 비즈니스 서비스와 컴포넌트를 나타낸다. - PSM(Platform Specific model) 애플리케이션에 대한 특정 기술과 관련한 UML 모델을 작성한다.
- Code 애플리케이션 코드를 만들어낸다.
3.2. Domain Driven Design
- 유비쿼터스 언어 : 도메인 지식을 변환하는 대신 도메인을 설명하기 위한 단일화된 체계
- 비즈니스 도메인에 관련된 용어, 기술 용어는 지양해야한다.
4. 유비쿼터스 언어
- 정확하고 일관성 있는 용어, 모호한 용어는 안 된다.
- 정확한 의미는 맥락에 따라 사람과의 상호 작용에 따라 다르다.
- 정책 -> 규제/규칙/계약과 같이 명확하게 정의해야한다.
- 동의어(X)
- 사용자(X) -> 방문자, 계정
5. 도메인 모델
- 효과적인 모델은 그 목적을 달성하는데 필요한 세부사항만 포함한다.
- 실 세계의 복사본이 아니라 문제를 해결하려는 의도가 있으며, 그 목적에 필요한 정보만 제공해야 한다.
- All Models are Wrong, Some are Usefule
- 모델은 본질적으로 추상화의 결과이다.(꼭 일치할 필요 없이 맥락에 맞게 추상화)
- 모델로써 실세계의 복잡성을 관리한다.
- 도메인 모델링 : 유비쿼터스 언어로 사실상 비즈니스 도메인 모델을 구축하는 것이다.
- 명사와 행위 파악
6. 진흑 덩어리
- 소프트웨어의 복잡성은 본질적인 도메인 복잡함과 우발적인 기술 복잡성의 혼합의 결과물
- 용어 충돌, 모호성
- 예시) 거대한 ERD
- 해결 방법 : Context(주제 영역) 를 나누자!
- Bounded Context :
맥락의 경계, 유비쿼터스 언어를 여러 개의 작은 언어로 나눈 다음
각 언어를 적용할 수 있는 명시적인 Bounded Context 에 할당한다.
7. 바운디드 컨텍스트
- 도메인 모델의 경계를 의미한다.
- 유비쿼터스 일관성이 유지되는 경계이다.
- 유티쿼터스 언어의 용어, 원칙, 비즈니스 규칙은 해당 바운디드 컨텍스트 내에서만 일관성이 있다.
- 즉, 유비쿼터스 언어는 바운디드 컨텍스트내의 도메인 주요 개념을 표현하기 위해 도메인내에서만 사용하는 공통 언어이다.
- 예시)
- 주문 : 주문하는 사람
- 시스템 : 고객
- 배송 : 배송 받는 사람
7.1.. 바운디드 컨텍스트와 도메인 모델
- 도메인 모델 : 특정 도메인을 개념적으로 표현한 것
- 도메인의 핵심 규칙을 구현한 것이다.
- 바운디드 컨텍스트가 이후 세분화 될 수 있다.
- 컴포넌트 개발 생명주기 분리할 필요가 있거나 기능이 독립적으로 확장해야 할 경우
- 각 바운디드 컨텍스트의 수명 주기는 독립적이다.
- 물리적 경계 역할, 소유권 경계
- 바운디드 컨텍스트와 하위 도메인의 차이
- 하위 도메인은 비즈니스 전략에 의해 정의된다.
- 바운디드 컨텍스트는 소프트웨어 엔지니어에 의해 설계된다.
- 하위 도메인은 발견하고, 바운디드 컨텍스트는 설계한다는 점이다.
- 큰 도메인 모델을 별개의 바운디드 컨텓스트로 분리한다.
8. 컨텍스트 매핑
- 바운디드 컨텍스트는 서로 독립적으로 발전할 수 있지만, 상호작용 해야한다.
- 즉, 각각의 바운디드 컨텍스트는 접점이 있다는 뜻인데 이를 Contract 라고 한다.
- 바운디드 컨텍스트의 연동, 통합 :
각 바운디드 컨텍스트에서 작업하는 팀간의 관계를 의미하기도 한다. 이 과정에서 서로간의 유비쿼터스 언어에 대한 통역, 동기화 같은 작업이 필요하다.- 협력형 패턴 그룹
- 시용자-제공자
- 분리형 노선
- 기타 등등
8.1. 협력형 패턴 / 파트너쉽 패턴
- 바운디드 컨텍스트가 굉장히 밀접할 때
- 단순 의사소통으로도 해결이 가능하다.
8.2. 협력형 패턴 / Shared Kernel
- 바운디드 컨텍스트에서 서로간의 공용 영역이 존재한다.
- 공용 모듈 및 이를 함께 관리함으로서 해결한다.
- 단, 공유 영역은 최소한으로 가져가고자 노력해야한다.
8.3. Spplier-Customer / Upstream, Downstream
- 공급자와 소비자로 나뉘어, 소비자가 공급자로부터 어떠한 정보를 받는다.
8.4. Spplier-Customer / Conformist
- 순응주의자.
- 하위 팀에서 상위 팀의 모델을 그대로 사용하는 방식
- 힘의 균형은 상류에 존재한다.
8.5. Spplier-Customer / Anti-Corruption Layer
- ACL(충돌방지계층)
- 하류가 상위에서 제공하는 모델에 대해서 순응하지 않는 경우
- ACL 에서 모델을 변환하여 사용하는 패턴(주로 레거시에서 사용)
8.6. Spplier-Customer / Open Host Service
- OHS(오픈 호스트 서비스)
- 힘이 사용자(하류) 측에 있을 경우, 제공자는 사용자를 보호하고 가능한 최고의 서비스를 제공한다.
- 여러 사용자에 따른 버전 관리 가능해야 한다.
8.7. Spplier-Customer / Public Language
- 공개 프로토콜, 공표된 언어(PL)
- 명세를 전달한다.
8.8.Seprate Ways
- 각자의 길
- 커뮤니케이션의 어려움
- 협력과 연동보다는 특정 기능을 중복으로 두는 것이 더 저렴한 경우다.
9. 서비스 매핑
- [핵심 서브 도메인] == ACL —— OHS/PL – [일반 서브 도메인 칸텍스트]
- [핵심 서브 도메인] == ACL —— OHS/PL – [지원 서브 도메인 컨텍스트]
- [지원 서브 도메인 컨텍스트] == ACL —— OHS/PL – [일반 서브 도메인]
This post is licensed under CC BY 4.0 by the author.