본문 바로가기
DDD

[Domain Event] Event Modeling

by kooangelo 2024. 9. 2.

..

 

이벤트를 모델링할 땐 해당 이벤트가 속한 바운디드 컨텍스트의 유비쿼터스 언어에 따라 이벤트와 그 속성을 명명하자. 애그리게잇의 커맨드 오퍼레이션 실행에 따른 결과로서 이벤트가 발생한다면, 그 이름은 보통 실행된 커맨드로부터 파생된다. 커맨드는 이벤트의 원인이므로, 이벤트의 이름을 통해 과거에 발생한 커맨드도 적절히 나타낼 수 있다.

예제 시나리오에 따르면, 
우리가 백로그 항목을 스프린트로 커밋할 때 도메인에 일어난 일을 명시적으로 모델링하는 이벤트를 발행한다.

커맨드 오퍼레이션 : BacklogItem.commitTo (Sprint aSprint)
-> 이벤트 결과 : BacklogltemCommitted 

‘백로그 항목이 커밋됐다.’는 의미의 이벤트 이름은 요청된 오퍼레이션이 성공한 후
애그리게잇상에 무슨 일이 일어났는지 (과거형으로) 나타낸다. 
팀은 BacklogltemCommittedToSprint와 같은 좀 더 장황한 이름으로 모델링할 수도 있었는데 이런 이름도 괜찮았을 것이다. 
하지만 스크럼의 유비쿼터스 언어에서 백로그 항목은 스프린트 외에선 절대로 커밋되지 않는다.
즉 백로그 항목의 릴리스를 위해 일정을 수립하지, 릴리스를 위해 백로그 항목이 커밋되진 않는다.
conmitTo() 오퍼레이션 사용의 결과로서 이 이벤트가 발행됐음에는 의심의 여지가 없다.
그러므로 이벤트는 현재의 이름만으로도 충분하며, 이름이 간단할수록 읽기에 좋다. 
그렇지만 당신의 팀이 좀 더 구체적인 이름을 선호한다면 그렇게 사용해도 좋다.

애그리게잇으로부터 이벤트를 발행할 땐 이벤트의 이름에 발생의 과거 시점을 반영하는 것이 중요하다.
현재 일어나고 있는 일이 아니라 과거에 일어난 일이다. 
가장 좋은 이름은 일어난 사실을 반영해야 한다.

올바른 이름을 찾은 다음엔 어떤 속성을 부여해야 할까?
첫 번째, 이벤트가 언제 일어났는지 나타내는 타임스탬프가 필요하다.
자바에서는 이를 java.util.Date로 표현할 수 있다.

다음은 BacklogltemComnitted 의 분석 결과다.

public class BacklogltemCommitted implements DomainEvent {
  private Date occurredOn;
  private Backlogltemld backlogltemld;
  private Sprintld committedToSprintld;
  private Tenantld tenantld;
}

 - Implementing Domain-Driven Design 도메인 주도 설계 구현, 반 버논 p381~383

 

..

'DDD' 카테고리의 다른 글

[Domain Event] Messaging을 이용한 독립성(자치성)  (0) 2024.09.02
[Domain Event] MQ, 결과적 일관성  (0) 2024.09.02
[Domain Event] Batch Job과 Domain Event  (0) 2024.09.02
[Domain Event] Domain Event 정의, 특징  (2) 2024.09.02
Entity  (1) 2024.08.30