도메인 주도 설계의 창시자는 Eric Evans이다. 2003년에 Domain-Driven Design:Tackling Complexity in the Heart of Software 책이 나옴으로써 시작되었다.
"객체 모델링을 어떻게 실제 소프트웨어 프로젝트에 적용할 것인지에 대해 미처 몰랐던 부분을 채워주고 시각 또한 향상시킬 것이다"
- Eric Evans(2003)


도메인 레이어에서 도메인을 표현하기 위한 방법론으로써 다음 두 가지가 있다. 빌딩 블록의 목적은 구현에 대한 가이드를 제공해서 복잡도를 낮추는 것이다.
불변식(invariant)을 중심으로 도메인 모델은 구현되어야 한다. 이 때 Aggregate는 불변식을 만족시키는 객체 그룹 단위 처리를 가능하게 한다.
Repository는 Aggregate단위와 연결될 수 있다.
Aggregate를 너무 복잡하게 만들지 않으려면 결과적 일관성(Eventual Consistency)를 유지하는 방식으로 작성되어도 된다. (message를 발행하게 하는 방식 등이 가능하다)
이러한 방법론은 자연스럽게 객체지향과도 잘 어울린다 (반드시 객체지향일 필요는 없다)
애자일과 도메인 주도 설계 (파트3 내용 중 일부만 정리)
도메인 주도 설계와 애자일일은 명시적으로 연결되어 있지 않지만 도메인 모델=코드로 정의한다면 이 순환을 지속적으로 가능하게 하는 것은 애자일 방법론과 가깝다. 또한 리팩터링과도 일맥상통하다.
주로 개발자들은 파트2: 모델 주도 설계의 빌딩 블록을 전술적 패턴이라고 부르며 여기에 집중하는 경향이 있다. 하지만 에릭 에반스는 파트3와 파트4에 좀 더 집중하려고 한 것 같다. 특히 파트3를 통해서는 리팩터링에 대한 개념을 도메인 주도 설계와 연결하려고 했고, 파트4를 통해서는 전략적 설계를 설명하려고 했다.
파트4의 14장. 모델의 무결성 유지는 솔루션 공간에 대한 해법을 15장. Distillation은 문제 공간에 대한 해법으로 이해할 수 있다. 워낙 개발자들이 관심을 끌지 못했던 것인지 Vaughn Vernon(2013)에서는 아예 전략적 패턴의 내용을 책 앞쪽으로 가지고 들어왔을 정도이다.
(참고) Scott Millett(2015)는 C#을 가지고 설명하지만 매우 유용하다.
이미지 reference
1. https://dev.to/jhonifaber/domain-driven-designddd-understanding-main-concepts-11p3
2. https://ahmedhemaz.medium.com/my-journey-in-learning-domain-driven-design-part2-layers-and-hexagonal-architecture-67697ff1426c