DDD(Domain Driven Design)

문한성·2023년 5월 8일
0

부트캠프

목록 보기
78/123

1. Domain이란 ?

  • 사전적의미는 '영역', '집합'입니다.

  • DDD에서 말하는 Domain은 비즈니스 Domain입니다.

  • 비즈니스 Domain은 유사한 업무의 집합입니다.(MPRS-마케팅,구매,연구,영업)

  • 어플리케이션은 비즈니스 Domain별로 나누어 설계 및 개발 될 수 있습니다.

2. DDD란? Domain Driven Design

  • 비즈니스 Domain별로 나누어 설계하는 방식입니다.

    • 기존의 어플리케이션 설계가 비즈니스 Domain에 대한 이해가 부족한 상태에서 설계 및 개발되었다는 반성에서 출발하였습니다.
    • DDD에서는 기존의 현업에서 IT로의 일방향 소통구조를 탈피하여 현업과 IT의 쌍방향 커뮤니케이션을 매우 중요하게 생각합니다.
  • DDD의 핵심 목표는 "Loosly coupling", "High cohesion"입니다.
    (어플리케이션 또는 그 안의 모듈간의 의존성은 최소화하고, 응집성은 최대화)

  • DDD는 Strategic Design과 Tactical Design으로 나눌 수 있습니다. Strategic Design은 개념 설계이고 Tactical Design은 프로그래밍하기 위한 구체적 설계라고 할 수 있습니다.

도매인 주도 설계 실습

도메인 주도 설계 실습을 진행하기 전 이벤트스토밍을 기법을 통한 진행방식에 대한 예시를 확인하겠습니다.

이벤트 스토밍의 목적은 팀 전체가 도메인 지식을 공유를 통해 프로젝트의 방향성을 얼라인(align)시키는 것에 있습니다.
이 과정에는 프론트엔드 개발자, 백엔드 개발자, 데브옵스 개발자, 인프라 엔지니어 등의 소프트웨어 관련 담당자만 참여하는 것이 아닙니다.

하나의 프로젝트 팀에 속하는 기획자와 프로젝트 매니저, UI/UX 디자이너 등 모든 인원이 참가하게 됩니다.
모든 구성원이 이해할 수 있는 형태와 언어로 프로젝트를 시각화합니다.
완성된 결과물을 가지고 모든 팀 구성원이 하나의 방향성을 가진 상태로 각자의 역할을 수행하게 됩니다.

일반적으로는 모두가 모여있는 공간에서 큰 화이트보드나 벽에 포스트잇을 자유롭게 붙이는 방식으로 실행되는데, 온라인 환경에서는 miro와 같은 툴을 이용해서 비슷한 효과를 기대할 수 있습니다.

https://miro.com/

도메인 주도설계의 주요 용어

  • 도메인 이벤트: 발생한 사건
  • 커맨드: 도메인 이벤트를 트리거하는 명령
  • 외부 시스템: 도메인 이벤트가 호출하거나 관계가 있는 레거시 또는 외부 시스템
  • 액터: 개인 또는 조직의 역할
  • 핫스팟: 의문사항, 결정하기 힘든 사항
  • 애그리거트: 도메인 이벤트와 커맨드가 처리하는 데이터, 상태가 변경되는 데이터
  • 정책: 이벤트 조건에 따라 진행되는 결정, “이벤트”가 발생할 때, “커맨드”를 실행한다
  • 정보: 액터에게 제공되는 데이터, 결정을 내리는데 영향을 주는 정보

이벤트스토밍 과정

1. miro를 통해 팀원들이 모였다면 주요 용어 포스트잇을 배치합니다.

https://contents-img-jeonghun.s3.ap-northeast-2.amazonaws.com/DDD/1.%E1%84%8C%E1%85%AE%E1%84%8B%E1%85%AD%E1%84%8B%E1%85%AD%E1%86%BC%E1%84%8B%E1%85%A5%E1%84%91%E1%85%A9%E1%84%89%E1%85%B3%E1%84%90%E1%85%B3%E1%84%8B%E1%85%B5%E1%86%BA.png

2. 도메인 이벤트를 찾습니다.

  • 도메인이벤트는 시간흐름에 따른 시스템의 동작을 의미합니다.
  • 상태의 생성 / 변경 / 삭제가 발생하게 만듭니다.
  • 비즈니스 흐름에서 발생한 이벤트에 초첨을 맞춰서 결정합니다.
  • 과거 시제 또는 명사형으로 기록합니다.
    ex) 회원가입되었다 or 회원가입됨 https://contents-img-jeonghun.s3.ap-northeast-2.amazonaws.com/DDD/2.%E1%84%83%E1%85%A9%E1%84%86%E1%85%A6%E1%84%8B%E1%85%B5%E1%86%AB%E1%84%8B%E1%85%B5%E1%84%87%E1%85%A6%E1%86%AB%E1%84%90%E1%85%B3%E1%84%8E%E1%85%A1%E1%86%BD%E1%84%80%E1%85%B5.png
  • 자유로운 의견을 통해 도출된 도메인 이벤트들을 발생 순서를 고려하여 배치합니다. https://contents-img-jeonghun.s3.ap-northeast-2.amazonaws.com/DDD/2-1.%E1%84%89%E1%85%B5%E1%84%80%E1%85%A1%E1%86%AB%E1%84%92%E1%85%B3%E1%84%85%E1%85%B3%E1%86%B7%E1%84%8B%E1%85%A6+%E1%84%84%E1%85%A1%E1%84%85%E1%85%B3%E1%86%AB+%E1%84%87%E1%85%A2%E1%84%8E%E1%85%B5.png

3. 외부 시스템을 필요로 하는 프로세스를 찾아서 도메인 이벤트 뒤에 붙입니다.

  • 명사형으로 작성합니다.
  • 아이템이 주문되었을 때 결제하는 과정은 외부 결제시스템을 이용합니다.
  • 결제가 승인되었을 경우 외부 이메일시스템을 통해 결과를 전송합니다. https://contents-img-jeonghun.s3.ap-northeast-2.amazonaws.com/DDD/3.%E1%84%8B%E1%85%AC%E1%84%87%E1%85%AE%E1%84%89%E1%85%B5%E1%84%89%E1%85%B3%E1%84%90%E1%85%A6%E1%86%B7+%E1%84%8E%E1%85%A1%E1%86%BD%E1%84%80%E1%85%B5.png

4. 커맨드를 도메인 이벤트 앞에 배치합니다.

  • 하나의 커맨드에 여러 개의 이벤트가 발생할 수 있습니다.
  • 개발자 입장에서 구현하게 되는 API가 됩니다. https://contents-img-jeonghun.s3.ap-northeast-2.amazonaws.com/DDD/4.%E1%84%8F%E1%85%A5%E1%84%86%E1%85%A2%E1%86%AB%E1%84%83%E1%85%B3+%E1%84%8E%E1%85%A1%E1%86%BD%E1%84%80%E1%85%B5.png

5. 핫스팟을 찾아서 배치합니다.

  • 궁금한 사항이나, 좀 더 논의가 필요한 사항, 결정하기 힘든 사항에 대한 내용을 붙입니다. https://contents-img-jeonghun.s3.ap-northeast-2.amazonaws.com/DDD/5.%E1%84%92%E1%85%A1%E1%86%BA%E1%84%89%E1%85%B3%E1%84%91%E1%85%A1%E1%86%BA+%E1%84%8E%E1%85%A1%E1%86%BD%E1%84%80%E1%85%B5.png

6. 액터를 찾아서 배치합니다.

  • 액터는 사용자의 역할을 말합니다.
  • 비즈니스를 수행하는 구체적인 역할을 고려해서 도출하도록 합니다.
  • 해당 쇼핑몰 사례에서는 사용자를 게스트, 회원, 판매자, 구매자 등으로 구분할 수 있습니다. https://contents-img-jeonghun.s3.ap-northeast-2.amazonaws.com/DDD/6.%E1%84%8B%E1%85%A2%E1%86%A8%E1%84%90%E1%85%A5%E1%84%8E%E1%85%A1%E1%86%BD%E1%84%80%E1%85%B5.png

7. 문장으로 액터, 커맨드, 이벤트를 검토해 봅니다.

  • "{구매자:액터}가 상품 {주문을 취소:커맨드}하면 {상품주문취소됨:도메인이벤트} 이벤트가 발생하고, 이어서 주문 취소된 상품의 재고를 변경하는 {상품재고수정:커맨드}이 실행되어서 {상품재고수정됨:도메인이벤트} 이벤트가 발생함으로써 시스템이 동작한다"

8. 애그리거트를 정의합니다.

  • 애그리거트는 가장 작은 도메인 모델의 모듈 단위입니다.
  • 커맨드와 도메인 이벤트가 영향을 주는 데이터 요소입니다.
  • 개발자의 입장에서 보면, 도메인의 실체 개념을 표현하는 객체(엔티티)로 구현하게 될 대상입니다.
  • 커맨드와 도메인 이벤트 사이 상단에 겹쳐서 붙입니다. https://contents-img-jeonghun.s3.ap-northeast-2.amazonaws.com/DDD/8.%E1%84%8B%E1%85%A2%E1%84%80%E1%85%B3%E1%84%85%E1%85%B5%E1%84%80%E1%85%A5%E1%84%90%E1%85%B3+%E1%84%8E%E1%85%A1%E1%86%BD%E1%84%80%E1%85%B5.png

9. 바운디드 컨텍스트를 정의하고 정책을 도출합니다.

  • 도메인이벤트와 커맨드, 액터, 애그리거트를 고려해서 경계를 식별합니다.
  • 애그리거트의 이름으로 컨택스트 이름을 정의합니다. 이 과정에서 동일 애그리거트 중심으로 모듈화가 이루어집니다.
  • 정책을 도출해서 붙입니다.
  • 정책은 이벤트 뒤에 따라오는 반응적인 비즈니스 로직입니다.
  • 어딘가의 커맨드를 작동시키는 역할을 하기 때문에 도메인 이벤트와 커맨드 사이에 존재하게 됩니다. https://contents-img-jeonghun.s3.ap-northeast-2.amazonaws.com/DDD/9.%E1%84%87%E1%85%A1%E1%84%8B%E1%85%AE%E1%86%AB%E1%84%83%E1%85%B5%E1%84%83%E1%85%B3%E1%84%8F%E1%85%A5%E1%86%AB%E1%84%90%E1%85%A2%E1%86%A8%E1%84%89%E1%85%B3%E1%84%90%E1%85%B3%E1%84%8B%E1%85%AA+%E1%84%8C%E1%85%A5%E1%86%BC%E1%84%8E%E1%85%A2%E1%86%A8.png

10. 호출 관계의 방향성을 고려하여 컨택스트 매핑을 진행합니다.

  • 바운디드 컨텍스트 간의 관계를 파악합니다
  • 동기적 호출방식과 비동기적 호출방식을 고려한 표현도 가능합니다.
  • 동기적(실선) : 항상 일관된 데이터 필요, 콘텍스트 간 의존도가 높음
  • 비동기적(점선) : 결과적 일관성으로 처리가능한 관계
    ex)
  • 클라이언트 -> 구매 컨텍스트 (동기적)
    -> 고객이 상품을 주문 : 즉시 수행되어야 함
  • 클라이언트 -> 상품 컨텍스트 (동기적)
    -> 고객이 상품정보를 조회 : 즉시 수행되어야 함
  • 구매컨텍스트 -> 배송 컨텍스트 (비동기)
    -> 배송 컨텍스트에 장애가 발생해도 주문을 받아둠, 배송 시스템 정상화 시 주문-배송 연결
    -> 고가용성을 보장 https://contents-img-jeonghun.s3.ap-northeast-2.amazonaws.com/DDD/10.%E1%84%8F%E1%85%A5%E1%86%AB%E1%84%90%E1%85%A2%E1%86%A8%E1%84%89%E1%85%B3%E1%84%90%E1%85%B3+%E1%84%86%E1%85%A2%E1%84%91%E1%85%B5%E1%86%BC.png
profile
기록하고 공유하려고 노력하는 DevOps 엔지니어

0개의 댓글