도메인 주도 설계 첫걸음 - 07장 시간 차원의 모델링
범위
- [Part 2] 전술적 설계 - 07장: 시간 차원의 모델링
개념 정리
책에서 기억하고 싶은 내용
이벤트 소싱
- 이벤트 소싱 패턴은 데이터 모델과 시간 차원을 도입한다.
- 애그리게이트의 현재 상태를 반영하는 스키마 대신 이벤트 소싱 기반 시스템은 애그리게이트의 수명주기의 모든 변경사항을 문서화하는 이벤트를 유지한다.
검색
- 이벤트 소싱을 사용하면 과거 정보를 쉽게 프로젝션할 수 있다.
분석
원천 데이터
- 이벤트 소싱 패턴이 작동하려면 객체 상태에 대한 모든 변경사항이 이벤트로 표현되고 저장되어야 한다.
- 이러한 이벤트는 시스템의 원천 데이터가 된다.
- 시스템의 이벤트를 저장하는 데이터베이스는 유일하고 강력하게 일관된 저장소인 시스템의 원천 데이터다.
- 이벤트를 저장하는 데 사용되는 데이터베이스를 지칭하는 이름이 이벤트 스토어(event store)다.
이벤트 스토어
- 이벤트 스토어는 추가만 가능한 저장소이므로 이벤트를 수정하거나 삭제할 수 없다.
이벤트 소싱 도메인 모델
- 이벤트 소싱 도메인 모델은 애그리게이트의 수명 주기를 모델링하기 위해 독점적으로 도메인 이벤트를 사용한다.
- 애그리게이트 상태에 대한 모든 변경사항은 도메인 이벤트로 표현돼야 한다.
- 이벤트 소싱 애그리게이트에 대한 각 작업은 다음 단계를 따른다.
- 애그리게이트의 도메인 이벤트를 로드한다.
- 이벤트 비즈니스 의사결정을 내리는 데 사용할 수 있는 상태로 프로젝션해서 상태 표현을 재구성한다.
- 애그리게이트의 명령을 실행하여 비즈니스 로직을 실행하고 결과적으로 새로운 도메인 이벤트를 생성한다.
- 새 도메인 이벤트를 이벤트 스토어에 커밋한다.
장점
- 시간 여행
- 도메인 이벤트는 애그리게이트의 모든 과거 상태를 복원하는 데도 사용할 수 있다.
- 심오한 통찰력
- 이벤트 소싱은 시스템의 상태와 동작에 대한 깊은 통찰력을 제공한다.
- 감사 로그
- 법률에 따라 일부 비지니스 도메인은 감사 로그를 반드시 구현해야 하며 이벤트 소싱은 이를 즉시 제공한다.
- 고급 낙관적 동시성 제어
- 이벤트 소싱을 사용할 때 기존 이벤트를 읽고 새 이벤트를 작성하는 사이에 정확히 무슨 일이 일어났는지 더 깊은 통찰력을 얻을 수 있다.
- 이벤트 스토어에 동시에 추가된 정확한 이벤트를 추출하고 새로운 이벤트가 시도된 작업과 충돌하닌지, 또는 추가 이벤트가 관련이 없ㄷ고 계속 진행하는 것이 안전한지에 대해 비즈니스 도메인 주도 의사결정을 내릴 수 있다.
단점
- 학습 곡선
- 패턴이 데이터를 관리하는 기존 기술과 엄청난 차이가 있다.
- 패턴을 성공적으로 구현하려면 팀 교육과 새로운 사고 방식에 익숙해지는 시간이 필요하다.
- 모델의 진화
- 이벤트 소싱 모델을 발전시키는 것은 어려울 수 있다.
- 아키텍처 복잡성
- 이벤트 소싱을 구현하면 수많은 아키텍처의 ‘유동적인 부분’이 도입되어 전체 설계가 더 복잡해진다.
자주 묻는 질문
성능
- 이벤트가 추가되면서 성능이 저하된다.
- 이벤트의 평균 수명 동안 기록될 것으로 예상되는 이벤트 수와 비교해서 누적될 이벤트 목록의 규모를 예측해야 한다.
- 스냅숏 패턴 같은 다른 패턴을 적용할 수도 있다.
- 확장할 수 있을까?
- 이벤트 소싱 모델은 쉽게 확장할 수 있다.
- 모든 애그리게이트 관련 작업은 단일 애그리게이트 컨텍스트에서 수행되므로 이벤트 스토어는 애그리게이트 ID로 분할할 수 있다.
- 애그리게이트 인스턴스에 속하는 모든 이벤트는 단일 샤드(shard)에 있어야 한다.
데이터 삭제
- 물리적으로 데이터를 삭제해야 하는 경우에는 어떻게 할까?
- 잊어버릴 수 있는 페이로드 패턴(forgettable payload pattern)으로 해결할 수 있다.
- 모든 민감 정보는 암호화된 형식으로 이벤트에 포함한다.
- 민감 데이터를 삭제해야 하는 경우 키 저장소에서 암호화된 키를 삭제한다. 결과적으로 이벤트에 포함된 민감 정보에 더 이상 접근할 수 없다.
이렇게 하면 안될까요…?
결론
- 이벤트 소싱 도메인 모델에서 애그리게이트 상태에 대한 모든 변경사항은 일련의 도메인 이벤트로 표현한다.
- 이벤트 기반 모델은 이벤트를 특정 작업에 최적화된 여러 표현 모델로 프로젝션할 수 있는 유연성을 제공한다.
- 이 패턴은 분석과 최적화를 위해, 또는 법적으로 감사 로그를 요구하기 때문에 시스템 데이터에 대한 심오한 통찰력이 필요한 경우에 적합하다.
This post is licensed under CC BY 4.0 by the author.