Domain
개발하고자 하는 구체적인 비즈니스 영역(현실세계의 문제)을 도메인이라고 합니다. 도메인은 여러 개의 서브도메인으로 이뤄져 있습니다. 해당 분야에 대한 지식을 가지고 있는 전문가, 실무자 등을 도메인 전문가(Domain expert)라고 부릅니다.
- Core Domain: 핵심 영역
- Supporting SubDomain: 비즈니스에 특화되어 있지만 핵심은 아닌 영역
- Generic SubDomain: 이메일 전송, OAuth, 결제 등 도메인에 특화되지 않은 영역
Domain model
모형(模型, Model, 모델)은 객체, 시스템, 또는 개념에 대한 구조나 작업을 보여주기 위한 패턴, 계획, 또는 설명이다. - Wikipedia
도메인 모델은 특정 도메인을 개념적으로 표현한 것입니다. 도메인 모델링을 하면서 도메인 전문가와 소프트웨어 개발자들 사이에서 개발되고 공유된 언어를 유비쿼터스 언어(Ubiquitous Language)라 고 합니다.
Entity
작게 나눈 도메인 논리와 그와 관련된 데이터를 하나의 객체로 만들었을 때, 이 객체가 식별성을 갖는다면 엔티티(Entity)고 합니다.
- 엔티티는 프로그램 내에서 식별할 수 있는 ID를 가지며, 이는 개념적 식별성과 같을 수도 다를 수도 있습니다.
- 엔티티는 생성되서 삭제되는 시점까지 연속성을 가지므로 갑자기 사라지지 않습니다. 따라서 삭제 전까지는 프로그램이 종료되더라도 연속성을 유지해야하므로 영속성(Persistence)을 갖습니다.
- 엔티티는 데이터베이스, 사용자 인터페이스, 서드파티 프레임워크 등의 변화에 영향을 받지 않도록 해야합니다.
Value Object
식별성은 없지만 도메인 논리와 그와 관련된 데이터로 이루어진 도메인 객체가 있다면 이를 값 객체(Value Object)라고 합니다.
- 값 객체가 공유되면 한 객체에서의 변경이 의도하지않은 결과를 초래할 수 있으므로 불변적(Immutable)이어야 합니다.
- 한 객체가 속성으로 값 객체를 가질 때, 이를 외부에 노출 시켜야하는 경우가 있는데, 이 경우 소유 객체의 불변식(Invariant)을 위반 할 수 있으므로 불변적이어야 합니다.
- 개발자들이 공유 객체의 불변성을 엄격하게 지킨다는 가정하에, 성능 개선이나 메모리 관리 등을 위해 값 객체를 공유할 수 있습니다.
Aggregate
복잡한 연관 관계를 맺는 객체들이 생기고 이를 대상으로 변경의 일관성(Consistency)을 보장하기란 쉽지 않습니다. 이 문제를 해결하기위해 연관된 객체를 모아 만든 객체를 애그리거트(Aggregate)라고 합니다.
- 애그리거트의 생성이 복잡한 경우 팩토리(Factory) 패턴을 사용할 수 있습니다.
- 애그리거트는 연관된 객체를 감싸는 경계(Boundary)를 갖습니다.
- 경계 외부에 노출되는 하나의 루트(Root) 엔티티를 갖습니다.
- 루트는 전역으로 식별되는 ID를 갖습니다.
- 루트는 경계 내의 객체들을 변경할 수 있습니다. 따라서 불변식(Invariant)을 검사해야할 책임이 있습니다.
Validation rules can be thought as invariants
- 루트는 내부 엔티티 참조를 반환할 수 있습니다. 참조된 객체의 불변성을 엄격히 지켜야 합니다.
- 루트는 내부 값 객체의 복사본을 반환할 수 있습니다.
- 애그리거트 안의 객체들은 외부 애그리거트 루트만 참조할 수 있습니다.
- 리포지토리(Repository)를 만들 때 애그리거트 루트를 반환하도록 만듭니다.
- 삭제 연산 시 애그리거트의 모든 객체를 제거해야 합니다.
Domain Service
엔티티나 값 객체에 속하지는 않지만 이들을 조합하여 수행되어야 하는 도메인 논리들을 도메인 서비스(Domain Service)라고 합니다.
- 상태를 갖지 않습니다
- 어떤 도메인 객체에 포함시키기 어렵습니다
- 다음의 경우 사용할 수 있습니다
- 중요한 비즈니스 프로세스를 수행하는 경우(예를 들어 둘 이상의 도메인 객체에서 필요로하는 입력 값을 계산)
- 어떤
Composition에서 다른Composition으로 도메인 객체를 변경하는 경우 Infrastructure에 대한Interface
Bounded Context
Context Map
- U(Upstream)
- OHS(Open Host Service): 다운스트림 클라이언트가 접근할 수 있는 프로토콜로 REST, RPC, MQ 등으로 구성될 수 있습니다
- PL(Published Language): 업스트림과 다운스트림 사이의 의사소통을 위한 언어로 업스트림에서 생성합니다
- D(Downstream)
- ACL(AntiCorruption Layer):
PL을 받았을 때, 다운스트림 내의 도메인 객체로 변환해주는 층입니다
- ACL(AntiCorruption Layer):