본문 바로가기
마이크로서비스

Devops Day 43 (5.4) 마이크로서비스_도메인 주도 설계 실습 Sprint

by Jackykim 2023. 5. 5.

이벤트 스토밍
이벤트 스토밍의 목적은 팀 전체가 도메인 지식을 공유를 통해 프로젝트의 방향성을 얼라인(align)시키는 것에 있습니다. 이 과정에는 프론트엔드 개발자, 백엔드 개발자, 데브옵스 개발자, 인프라 엔지니어 등의 소프트웨어 관련 담당자만 참여하는 것이 아닙니다.
일반적으로는 모두가 모여있는 공간에서 큰 화이트보드나 벽에 포스트잇을 자유롭게 붙이는 방식으로 실행되는데, 온라인 환경에서는 miro와 같은 툴을 이용해서 비슷한 효과를 기대할 수 있습니다.

https://miro.com/

 

도메인 주도설계의 주요 용어
1. 도메인 이벤트: 발생한 사건

2. 커맨드: 도메인 이벤트를 트리거하는 명령

3. 외부 시스템: 도메인 이벤트가 호출하거나 관계가 있는 레거시 또는 외부 시스템

4. 액터: 개인 또는 조직의 역할

5. 핫스팟: 의문사항, 결정하기 힘든 사항

7. 애그리거트: 도메인 이벤트와 커맨드가 처리하는 데이터, 상태가 변경되는 데이터

7. 정책: 이벤트 조건에 따라 진행되는 결정, “이벤트”가 발생할 때, “커맨드”를 실행한다

8. 정보: 액터에게 제공되는 데이터, 결정을 내리는데 영향을 주는 정보


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

 

2. 도메인 이벤트를 찾습니다.
- 도메인이벤트는 시간흐름에 따른 시스템의 동작을 의미합니다.

- 상태의 생성 / 변경 / 삭제가 발생하게 만듭니다.

- 비즈니스 흐름에서 발생한 이벤트에 초첨을 맞춰서 결정합니다
- 자유로운 의견을 통해 도출된 도메인 이벤트들을 발생 순서를 고려하여 배치합니다.

 

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

- 명사형으로 작성합니다.

- 아이템이 주문되었을 때 결제하는 과정은 외부 결제시스템을 이용합니다.

- 결제가 승인되었을 경우 외부 이메일시스템을 통해 결과를 전송합니다.

 

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

- 하나의 커맨드에 여러 개의 이벤트가 발생할 수 있습니다.

- 개발자 입장에서 구현하게 되는 API가 됩니다.

 

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

- 궁금한 사항이나, 좀 더 논의가 필요한 사항, 결정하기 힘든 사항에 대한 내용을 붙입니다.개발자 입장에서 구현하게 되는 API가 됩니다

 

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

- 액터는 사용자의 역할을 말합니다.

- 비즈니스를 수행하는 구체적인 역할을 고려해서 도출하도록 합니다.

- 해당 쇼핑몰 사례에서는 사용자를 게스트, 회원, 판매자, 구매자 등으로 구분할 수 있습니다.

 

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

- "{구매자:액터}가 상품 {주문을 취소:커맨드}하면 {상품주문취소됨:도메인이벤트} 이벤트가 발생


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

- 애그리거트는 가장 작은 도메인 모델의 모듈 단위입니다.

- 커맨드와 도메인 이벤트가 영향을 주는 데이터 요소입니다.

- 개발자의 입장에서 보면, 도메인의 실체 개념을 표현하는 객체(엔티티)로 구현하게 될 대상입니다.

- 커맨드와 도메인 이벤트 사이 상단에 겹쳐서 붙입니다.

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

- 도메인이벤트와 커맨드, 액터, 애그리거트를 고려해서 경계를 식별합니다.

- 애그리거트의 이름으로 컨택스트 이름을 정의합니다. 이 과정에서 동일 애그리거트 중심으로 모듈화가 이루어집니다.

 

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

- 바운디드 컨텍스트 간의 관계를 파악합니다

- 동기적 호출방식과 비동기적 호출방식을 고려한 표현도 가능합니다.

- 동기적(실선) : 항상 일관된 데이터 필요, 콘텍스트 간 의존도가 높음

- 비동기적(점선) : 결과적 일관성으로 처리가능한 관계

 

도메인 주도 설계 실습 : 중앙방역대책본부에는 다양한 팀(DDD의 관점에서는 Actor)이 있지만, 대중에게 가장 잘 알려진 다음의 네 팀의 업무만을 이해해 보도록 합시다.

환자관리팀

- 재택치료제도를 통해 환자를 치료해야 합니다.

- 환자가 n일 이후에 격리해제 기준에 부합하는지 확인해야 합니다.

> 무증상이고, 호전되는 경우 격리 해제가 가능합니다.

> 유증상이고, 증상이 호전되지 않을 경우 PCR 검사를 다시 진행해야 합니다.

환자 (Patient)

o    aggregate

  o    증상 여부

     o    유증상 symptomatic

     o    무증상 asymptomatic

o    command

  o    치료

  o    격리해제 기준 검토

     o    증상 확인

o    domain event

  o    n일 이후 무증상시

     o    격리 해제

  o    n일 이후 유증상자 (호전되지 않는 경우)

     o    → PCR 검사


역학조사팀

- 전자출입명부 및 카드 승인 내역을 기반으로 확진자의 동선을 조사하고, 밀접 접촉자를 확인합니다.


격리관리팀

- 확진자에게 격리 및 격리 해제를 통지하고, 자가격리자가 격리 중에 있는지, 또는 격리 위반을 했는지 확인합니다.


진단검사운영팀

- 선별진료소를 운영하고 PCR 검사를 통해 확진 여부를 파악합니다.