[인프런 수강일기] DDD #3

soochangoforit·2023년 4월 30일

DDD

목록 보기
3/5


✅ Domain Event


  • 이벤트란? 시스템에서 발생한 과거의 일
  • 과거형 동사로 표현한다.
  • ex) 회원이 있고, 회원을 등록한 다음에 로그인 과정을 거치게 된다.
    • 회원 등록 됨 (과거형으로 표시)
    • 로그인이라는 활동을 통해서 발생된 사건이 ⇒ 로그인 됨 이라는 이벤트를 발생한다.

✅ Hot Spot


  • Domain Event를 붙이다 보면, 사람들이 알 수 없는 내용이 발생하거나 질문이 생긴다.
  • 이런 것들을 Hot Spot 이라고 해서 붙이게 된다.
  • 의견 수렴, 질문, 가정이 필요한 내용
  • 의문이 드는 내용들, 도메인 지식이 없는 경우, 알아가야 되겠다 하는 부분을 보라색으로 표시한다.
  • 관련된 이벤트의 필요한 경우에만 붙이게 된다

✅ Command


  • Command는 Domain Event에 쌍을 맞춰서 Domain Event의 왼쪽에 붙이게 된다.
  • Command는 Domain Event를 Trigger 하는 역할을 담당한다.
  • 현재 동사로 표현한다.

✅ Actor


  • Actor는 Command를 동작하게 하는 어떤 사용자 역할이다.
    당연히, 명사여야 한다. (사용자 역할)이다.

  • Command 아래에 붙이게 된다.
    이러한 경우는 좀 작은 포스트잇을 사용한다.

  • “회원 등록 됨“ 이라는 이벤트라고 하면
    회원이 회원 등록 Command를 통해서 Domain Event “회원 등록 됨“ 이벤트를 발생시킨다.

  • 하나의 문장으로 해석이 가능하도록 검증하는 용도로 활용 가능하다.

  • Command와 Domain Event를 제대로 식별했는지 액터를 통해서 검증할 수 있고
    교정을 할 수 있다.

Actor를 보통 뽑으라고 하면, Actor는 회원, 사용자 이런 식으로 뽑는 경우가 있다.
근데 그렇게 하면, 어떤 Command를 발생 시키는 것은 다 사용자이고 회원이게 된다.

그렇게 되면 Command나 Domain Event를 검증하는 입장이나 BC에 필요한 개념들을 찾아내기 힘들다.

그래서, Actor는 어떻게 보면 굉장히 구체화 해야한다.
배송이라는 Context에서 “회원”이라고 표현 안하고 “수취자"라는 역할로 할 수 있었다.

주문이라는 도메인에서 주문을 실제로 하는 사람은 “회원“ 보다는 개념보다는 “주문자"라고 하는 개념으로 식별할 수가 있었다.

그런식으로 Domain의 Context에 맞는 그런 구체적인 Actor 를 찾는 것이 굉장히 유비쿼터스 랭귀지를 통한 도메인 모델을 도출하는데 도움이 된다.
(구체적인 Actor를 도출하는 것이 중요하다.)


✅ Policy


  • Actor가 도출되었으면 Policy를 도출할 수 있다.

  • Policy가 굉장히 중요한 요소이다.

  • 어떤 이벤트가 발생했을때, 그것에 의해 자동화 되어서 다른 Command를 호출하는 정책이다.

  • 정책, 시나리오를 Policy라고 한다.

  • 특정 관계에서 커맨드가 특정 도메인 이벤트가 발생할 때 자동으로 실행된다 라는 관계가 있을 때 Policy라고 한다.

  • ~~ 하면 항상 ~~한다 라는 관계를 정책으로 표현할 수 있다.

  • 예를 들어서 회원 등록 됨 => 로그인 됨 사이에서는 자동으로 이루어지는 관계가 아니기에
    그러한 관계에서는 Policy를 도출할 수 없다. (자동으로 이루어지는 경우가 아니기에)

  • 예를 들어 “주문 됨” 이라는 이벤트가 있고 “배송 요청한다.“ Command를 Call 하게 된다.

  • 자동으로 주문 이벤트가 발생이 되면 반드시 배송 요청이라는 요청을 호출해야 한다는 비즈니스 규칙이 있다면 그것들을 “정책”으로 뽑을 수 있다.


✅ External System


  • 도메인 이벤트랑 연계 되는 외부 시스템 혹은 Legacy 시스템을 External System으로 뽑아내게 된다.
  • 예를 들면, 회원가입을 하는데 외부 Oauth2 시스템을 통해서 로그인을 하고자 할때
    그런 시스템을 외부 시스템 (External System)으로 표현할 수 있다.
  • 회원이 등록 되고 나서, 축하의 이메일을 발송하게 된다고 하면
    그 이메일을 전송하는 시스템이 외부 시스템이라고 할 수 있다.
  • 외부 시스템이라서 명사형으로 사용한다.

✅ Aggregate


  • 최종적으로 Aggregate 이라는 것을 도출하게 된다.
  • Command 와 Domain Event 사이에 위쪽에 노랑색 포스트잇을 붙인다.
  • Domain Event와 Command에 의해서 관리되는 데이터라고 한다.
  • Domain Event와 Command를 표현하는 키워드라고 할 수 있다.
    명사로 표현한다.

1. 도메인 이벤트 도출


  • 하나의 흐름을 도메인 이벤트를 가지고 도출한 것이다.
  • 조금씩 띄워져 있는 경우는 Command를 붙이기 위해서이다.

2. Hot Spot 식별


  • 주문 취소됨이 가능한 시점을 모르는 경우 (도메인에 대한 이해 부족)
  • 추후 결정하기 위해 기록

3. Command 식별


  • Domain Event를 붙이게 되면 Command 는 쉽게 붙일 수 있다.
  • 결제 승인됨, 주문 완료됨, 결제 거부됨 같은 경우는
    주문 항목 주문이라는 Command 에 의해서 한번에 실행이 되는 이벤트라서 이렇게 붙이지 않을 수도 있다.
  • 비지니스 로직에 따라서 달라질 수 있다.

4. Actor 식별


  • Actor를 식별하게 된다.
  • 회원이랑 관리자 이런식으로 도출하게 되면 추후 BC를 구분하는데 힘들다.
  • BC 내에 활동할 그런 Actor 들 역할을 찾아낸다.
  • 그 다음 Policy를 식별하게 된다.

5. 정책 식별


  • 주문 취소 됨이라는 이벤트가 발생 되면, 반드시 재고 수정이라는 것이 자동으로 되어야 한다.
  • 주문 완료 됨이라는 이벤트가 발생하게 되면 이것 역시 재고 수정이라는 것이 자동으로 되어야 한다.
  • 이런 경우에 Policy를 도출하게 된다.
  • 주문 완료 됨이라는 이벤트가 시작하면 배송 접수라는 이벤트가 자동으로 실행되어야 하는 경우에는Policy를 사용할 수 있다.
  • 그 다음에 하는게 외부 시스템을 호출하게 되는 것이다.

6. 외부 시스템 식별


  • 결제가 승인이 되고 나서, 이메일을 수신할때, 이메일 시스템이라는 외부 시스템을 호출할 수 있다.
  • 그런 연관관계를 외부 시스템으로 도출한다.
  • 관계가 있는 도메인 이벤트에 외부 시스템을 붙이면 된다.

7. Aggregate 식별


  • 최종적으로 Aggregate를 도출하게 된다.
  • Aggregate는 Command와 Domain Event에 의해 관리되는 데이터라고 할 수 있다.
  • 데이터적인 요소들을 도출하게 된다.

8. Bounded Context 식별


그 다음에 BC를 도출하게 된다.
최종적으로 식별한 Aggregate를 기점으로 식별하게 된다.

  • BC을 도출하게 되면 각각의 경계가 생긴다.

  • 그 BC 경계를 넘나드는 것을 Policy를 통해서 확인할 수 있다.

  • BC 를 넘나드는 Policy가 있다면은 그런 부분들은 Context Mapping을 해야되는 대상이 된다.

  • Context Mapping을 어떻게 할 것인가 (크게는 2개)

    • 동기적 관계
    • 비동기적 관계 (제일 많이 사용되는 관계)
  • 그리고 도출된 BC에서 핵심(Core)이냐 일반 or 지원 Context이냐를 식별하게 된다.

  • 그렇게 하는 이유는 만약 주문이 핵심 Context가 되었을때 주문에 대한 설계 전략들을 달리 가져갈 수 있다.

  • BC 도 핵심, 일반, 지원을 나눠서 각기 다른 설계 전략을 가질 수 있다.

  • 그렇게 중요하지 않는 부분에 대해서는 외주를 통해서 넘길 수도 있다.


9. 전체적인 Context Mapping


  • 각각의 BC 관계를 표현하는 정책들을 비동기적 혹은 동기적으로 설계를 진행할 수 있다.
  • BC와 외부 시스템을 표현만 하면 이해하기 힘들기에 Front End를 표현하면 이해하기 수월하다
  • Front End와의 관계는 반드시 동기 관계이다.

Ex) 이벤트 스토밍 결과를 헥사고날 아키텍쳐와 매핑하기


  • Command는 API 후보가 되는 것이고
  • Aggregate는 비즈니스 로직을 표현하는 후보가 될 것이다. (도메인 모델이나 데이터 모델이 될 수 있다.)
  • 외부 시스템은 외부와 연계되는 요소들이 된다.
  • Domain Event는 각각의 다른 영역과 비동기 통신을 하게 되는 부분이다. (메시지 브로커)

참고

https://www.inflearn.com/course/%EB%8F%84%EB%A9%94%EC%9D%B8%EC%A3%BC%EB%8F%84-%EC%84%A4%EA%B3%84-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4

profile
Go For It

0개의 댓글