Strategic Design
Domain
도메인은 소프트웨어가 해결하고자 하는 문제 영역.
SubDomain
도메인 내의 관련 개념들을 그룹화하는 개념.
3가지 종류의 sub domain
- 핵심 서브도메인
- 수익에 영향을 미치고 다른 회사와의 경쟁에서 우위를 제공하는 영역
- 지원 서브도메인
- 핵심 서브도메인이 효과적으로 기능하는 데 필요한 서비스를 제공하는 영역
- 일반 서브도메인
- 모든 회사가 같은 방식으로 수행하는 영역
E-Commers - 재고 관리 서브도메인: 제품, 재고 수준, 재주문을 관리 - 고객 관리 서브도메인: 고객 계정, 주문, 반품을 관리 - 배송 및 물류 서브도메인: 배달과 배송을 관리
Ubiquitous Language
도메인과 도메인 모델을 설명하는 데 사용되는 공유 언어.
개발자, 도메인 전문가 및 다른 이해관계자들 모두가 공통으로 사용한다.
개발자가 사용한다는 뜻은 결국 코드에서도 동일한 언어로 사용된다는 것을 의미한다.
크게는 인터페이스, 클래스 부터 작게는 변수명 까지 동일한 언어로 사용해야한다.
유비쿼터스 언어는 단순히 이름을 짓는 행위만을 의미하는 것이 아니다.
비즈니스 개념과 관계가 소프트웨어에 정확하게 표현되도록 보장하고 소프트웨어가 비즈니스 요구사항과 일치하도록 하는 방법이다.
Bounded Context
특정 모델이 적용되는 범위를 정의하는 경계
도메인의 서로 다른 측면에 대해 서로 다른 모델을 만들고, 이들 사이의 경계를 명확하게 정의하여 동일한 용어가 다른 맥락에서 다른 의미로 사용될 수 있도록 한다.
"상품" 이라는 용어를 각 Context 마다 서로 다르게 사용하는 예 - 카탈로그 컨텍스트: 이미지, 설명, 특징 등을 포함 - 재고 컨텍스트: SKU, 위치, 수량 정보를 포함 - 주문 컨텍스트: 가격, 할인 정보를 포함
Tactical Design
Entity
고유한 식별성을 가진 도메인 객체
엔티티는 아래와 같은 특성을 가진다.
- 식별성
- 엔티티는 도메인 모델에서 다른 엔티티와 구별되는 고유한 식별성을 가진다.
- 가변성
- 엔티티의 속성은 식별성을 유지하면서 시간에 따라 변한다.
- 행위
- 엔티티는 흔히 복잡한 비즈니스 로직과 규칙인 행위를 수행한다.
- 관계
- 엔티티는 다른 엔티티, 값 객체, 또는 도메인 서비스와 관계를 가진다.
Value Object
고유한 식별성을 가지지 않는 객체.
엔티티의 수명을 넘어서는 수명을 가지지도 않는다.
값 객체는 그것의 속성으로 정의되며, 불변성을 가진다. 즉, 생성된 후에는 상태가 변경될 수 없다.
Repository
도메인 계층의 영속성 계층을 추상화한 개념.
도메인 객체의 저장에 대한 세부사항을 숨기면서 도메인 객체를 저장하고 검색하는 방법을 제공한다.
리포지토리를 통해 도메인 계층은 영속성 메커니즘에 대해 알 필요가 없게 된다.
Domain Service
특정 엔티티나 값 객체에서 처리하기에 부자연스러운 작업을 수행하는 요소.
상태를 가지지 않아야 하며 자체적인 영속성을 갖지 않아야 한다.