도메인 주도 설계:
- 소프트웨어 설계 방법론
- 비즈니스 도메인을 중심으로 설계하는 것
유비쿼터스 언어:
- 개발자와 도메인 전문가들의 공통 언어, 어휘집을 말함
- 커뮤니케이션의 명료화를 위해서 사용하는 것
애그리게이트와 애그리게이트 루트:
- 애그리게이트는 엔터티의 집합으로 트랜잭션적 일관성을 관리해야하는 범위임
- 애그리게이트에서는 엔터티 뿐 아니라 값 객체도 포함한다
- 애그리게이트 루트는 애그리게이트를 나타내는 대표 엔터티로 외부에서는 이 객체로만 소통할 수 있음. 내부 엔터티와 직접적인 소통은 어렵다
경계된 컨택스트:
- 특정 도메인이 적용되는 범위를 명확히 나누는 것
- 큰 도메인의 범위를 나눠서 복잡성을 관리하기 위함임. 이를 통해 각 컨택스트는 독립적으로 개발 가능
엔터티와 값 객체:
- 엔터티는 데이터베이스 테이블을 나타내는게 아니라 도메인의 각 객체를 나타냄.
- 엔터티는 고유 식별자를 가지다
- 엔터티는 비즈니스 행위를 포함한다.
- 엔터티는 물론 하나의 테이블과 매핑될 수도 있음.
- 값 객체는 도메인을 나타내긴 하지만 엔터티와 달리 고유 식별자가 없다. 그리고 별도의 생명 주기가 없음
엔터티와 도메인 모델과의 차이점은?
- 도메인 모델은 헥심 도메인을 하나 표현하는가임. 주문 도메인 모델은 주문 전체를 포함
- 도메인 모댈의 구성요소로 엔터티와 레파지토리 서비스 값 객체 어그리게이트를 포함한다
도메인 이벤트:
- 도매인 내에서 발생한 주요 이벤트
- 불변성을 가져야하며, 고유허게 식별된다
도메인 주도 설계 과정:
- 정해진 순서는 없지만 대략적으로는 이 과정들이 필요할 것.
- 1. 도메인을 먼저 이해하고 바운디드 컨택스트로 쪼갤것
- 2. 바운디드 컨택스트 들의 관계를 나타낼 것
- 3. 바운디드 컨택스트 내부에서 포한하고 있는 도메인을 정리하기, 애그리게이트 정의, 엔터티 정의
마이크로서비스라면 하나의 바운디드 컨택스트가 하나의 서비스로 대응되려나?
- 이상적이긴 하다. 그러나 하나의 바운디드 컨택스트도 복잡하다면, 그것또한 나눠서 마이크로서비스로 쪼갤 수 있다
반 버논이 말한 애그리게이트 설계 원칙:
- 불변식을 통해 일관성 경계를 보호하라:
- 애그리게이트는 트랜잭션적 일관성 경계를 정의합니다.
- 애그리게이트 내의 불변식은 모든 작업에서 유지되어야 합니다.
- 예: 주문 총액은 항상 주문 항목들의 합과 일치해야 합니다.
- 작은 애그리게이트로 설계하라:
- 큰 애그리게이트는 성능과 확장성 문제를 일으킬 수 있습니다.
- 작은 애그리게이트는 동시성 문제를 줄이고 성능을 향상시킵니다.
- 예: '주문'과 '고객'을 별도의 애그리게이트로 분리하는 것이 좋습니다.
- ID로 다른 애그리게이트를 참조하라:
- 애그리게이트 간 참조는 ID를 통해 이루어져야 합니다.
- 직접 객체 참조는 애그리게이트 간 결합도를 높이고 일관성 유지를 어렵게 만듭니다.
- 예: 주문 애그리게이트는 고객 ID를 참조하되, 고객 객체 전체를 포함하지 않습니다.
- 결과적 일관성을 사용하여 외부 변경을 업데이트하라:
- 다른 애그리게이트의 변경은 비동기적으로 처리되어야 합니다. 도메인 이벤트를 이용한 변경을 말함.
- 즉시적 일관성 대신 결과적 일관성(eventual consistency)을 수용합니다.
- 예: 고객 주소 변경이 관련 주문에 즉시 반영되지 않고, 비동기 프로세스를 통해 업데이트됩니다.
'Domain Driven Design' 카테고리의 다른 글
경계 간 매핑 전략 세우기 (0) | 2023.12.17 |
---|