DDD라고 불리는 이 용어는 도메인 주도 설계라는 이름의 도메인과 일치하도록 소프트웨어를 모델링하는 데 중점을 둔 소프트웨어 설계 접근 방식이다.
도메인이란 사전적 의미로 '영역', '집합' 이다. 그리고 비즈니스 Domain은 유사한 업무의 집합이다.
기존의 어플리케이션 설계가 비즈니스 도메인에 대한 이해가 부족한 상태에서 설계 및 개발되었다는 반성에서 출발 하였다.
그래서 비즈니스를 도메인 별로 나누어 설계를 하여 확장성을 고려하고 모듈간의 의존성은 최소화하고 응집성은 최대화 했다.
소프트웨어의 복잡성을 최소화 하는 것이다.그리고 요구사항을 쉽게 반영하고 소통이 원활하게 이루어질 수 있다.
소프트웨어는 사용이 되어야 가치가 있는 것이다. 그래서 사용자가 이해하고 원하는대호 목적에 맞게 사용할 수 있도록하는 것을 목표로 해야 한다.
DDD를 프로젝트에 반영하기 위해서는 도메인을 우선으로 설계를 해야하고 그 도메인을 바탕으로 개발을 진행해야 한다.
8가지의 도메인 주도 설계의 주요 용어가 있다.
간단하게 생각해서 고객이 회원가입을 해서 물건을 결제, 배송까지의 Domain-Driven-Design을 해보자.
- 도메인이벤트는 시간흐름에 따른 시스템의 동작을 의미한다.
- 상태의 생성 / 변경 / 삭제가 발생하게 만든다.
- 비즈니스 흐름에서 발생한 이벤트에 초첨을 맞춰서 결정한다.
- 과거 시제 또는 명사형으로 기록한다.
- 이벤트들의 발생 순서를 고려하여 배치한다.
다음과 같이 도메인 이벤트를 작성 하였다. 정말 단순하게 소비자가 회원가입을 해서 물건을 검색 후 장바구니에 추가하고 장바구니안에 있는 물건들을 구매해서 배송까지의 과정이다.
- 명사형으로 작성한다.
- 아이템이 주문되었을 때 결제하는 과정은 외부 결제시스템을 이용한다.
- 결제가 승인되었을 경우 외부 이메일시스템을 통해 결과를 전송한다.
결재에 필요한 시스템과 구매를 했다는 이메일 시스템, 택배를 배송 해주는 시스템을 작성했다.
- 하나의 커맨드에 여러개의 이벤트가 발생할 수 있다.
- 개발자 입장에서 구현하게되는 API가 된다.
- 궁금한사항이나, 좀 더 논의가 필요한 사항, 결정하기 힘든 사항에 대한 내용을 붙인다.
- 액터는 사용자의 역할을 말한다.
- 비즈니스를 수행하는 구체적인 역할을 고려해서 도출하도록 한다.
- 해당 쇼핑몰 사례에서는 사용자를 게스트, 회원, 판매자, 구매자 등으로 구분할 수 있다.
너무 구매자 밖에 없는거 같아서 판매자 이벤트도 추가 하였다.
{구매자:액터}가 상품{상품결제:커맨드}하면 {장바구니 물건 결제됨:도메인이벤트}이벤트가 발생하고 이어서 외부 시스템{결제 시스템:외부시스템} 실행된다.
- 애그리거트는 가장 작은 도메인 모델의 모듈 단위이다.
- 커맨드와 도메인 이벤트가 영향을 주는 데이터 요소이다.
- 개발자의 입장에서 보면, 도메인의 실체 개념을 표현하는 객체(엔티티)로 구현하게 될 대상이다.
- 커맨드와 도메인 이벤트 사이 상단에 겹쳐서 붙인다.
- 도메인이벤트와 커맨드, 액터, 애그리거트를 고려해서 경계를 식별한다.
- 애그리거트의 이름으로 컨택스트 이름을 정의한다. 이 과정에서 동일 애그리거트 중심으로 모듈화가 이루어진다.
- 정책을 도출해서 붙인다.
- 정책은 이벤트 뒤에 따라오는 반응적인 비즈니스 로직이다.
- 어딘가의 커맨드를 작동시키는 역할을 하기 때문에 도메인 이벤트와 커맨드 사이에 존재하게 된다.
- 바운디드 컨택스트 간의 관계를 파악
- 동기적 호출방식과 비동기적 호출방식을 고려한 표현도 가능
- 동기적(실선): 항상 일관된 데이터필요, 컨텍스트간 의존도가 높음
- 비동기적(점선): 결과적 일관성으로 처리가능한 관계
DDD를 이용해서 설계를 하면 액터, 도메인에 따라 설계가 가능하고 마이크로서비스를 위한 설계가 되기도 한다.
이벤트 스토밍 예시를 너무 잘 봐서 그런데 혹시 출처를 밝히고 내용을 일부 참조해도 될까요?