도메인 주도 설계의 창시자는 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