[architecture Series Ddd] 04.04.eventsourcing
February 23, 2025
이벤트 소싱
- 애플리케이션 상태에 대한 모든 변경 사항을 일련의 이벤트로 캡쳐하는 데 중점을 두는 DDD의 중요 개념이다.
- 애플리케이션 상태를 감사, 디버깅 및 재구축하는 데 많은 이점을 제공한다.
- 유연하고 확장 가능한 아키텍쳐를 구현할 수 있다.
이벤트 소싱이란?
- DB 업데이트 적용 대신 일련의 이벤트를 재생하여 애플리케이션의 현재 상태를 결정하는 패턴
- 기존 관계형 DB 지속성에 대한 대앙ㄴ으로 볼 수 있다.
- 엔티티의 현재 상태만 저장하는 대신 발생한 이벤트의 변경 불가능한 로그를 저장한다.
- 이벤트는 애플리케이션 상태 변화를 나타내며, 특정 시점에 애플리케이션 상태를 재구축하는 데 사용할 수 있다.
주요 개념
- 이벤트
- 이벤트 소싱의 핵심
- 과거에 어떤 일이 발생했다는 사실을 나타낸다.
- 각 이벤트는 불변이므로 일단 생성되면 수정할 수 없다.
- 일반적으로 고유 식별자, 타임스탬프, 발생과 관련된 관련 데이터가 포함된 페이로드로 구성된다.
- 이벤트 스토어
- 모든 이벤트가 지속되는 곳
- 이벤트에 대한 쓰기 전용 로그 역할을 하며 데이터 내구성을 보장
- 추가 전용이므로 새 이벤트는 로그 끝에만 추가할 수 있다.
- 이벤트 핸들러
- 이벤트를 처리하고 이벤트에 반응하는 역할을 담당
- 이벤트 스토어에서 이벤트 스트림을 수신하고 그에 따라 애플리케이션의 상태를 업데이트한다.
- 애그리거트
- DDD 및 이벤트 소싱의 기본 구성 요소
- 애그리거트는 관련 비즈니스 엔티티의 클러스터를 나타내며 이들의 동작을 캡슐화한다.
- 애그리거트는 일관성 규칙이 적용되는 경계를 정의한다.
이점
- 감사 및 규정 준수 : 현재 상태에 도달한 과정을 더 쉽게 추적하고 이해할 수 있다.
- 시간적 쿼리 및 재구성 : 발생한 모든 이벤트를 캡쳐하기 때문에 특정 시점에 애플리케이션의 상태를 쿼리할 수 있다.
- 확장성 및 가용성
- 대량의 데이터와 높은 처리량을 처리할 수 있는 이벤트 중심의 분산 아키텍쳐를 구현할 수 있다.
- 이벤트 스트림, 메시지 큐를 사용하면 시스템의 여러 구성 요소가 독립적으로 비동기적으로 작동할 수 있다.
- 도메인 모델의 진화
- 시간이 지남에 따라 도메인 모델의 진화를 촉진
- 이벤트는 사실을 나타내므로 새로운 유형의 이벤트를 도입하거나 기존 이벤트를 수정하여 도메인 모델의 변경 사항을 쉽게 처리할 수 있다.
구현 고려 사항
- 이벤트 버전 관리
- 도메인 모델 발전에 따라 이벤트 구조나 의미가 변경될 수 있다.
- 이전 버전과 호환성을 보장하고 다양한 이벤트 스키마 버전을 처리하려면 이벤트를 버전화하는 것이 필요하다.
- 이벤트 재생 및 투영
- 상태 재구축에는 올바른 순서로 재생이 필요하다.
- 이벤트 스트림을 유지 관리하고 애플리케이션의 상태를 나타내는 프로젝션에 재생함으로써 달성할 수 있다.
- 외부 시스템과의 통합
- 이벤트 소싱을 사용할 떄는 메시지 큐나 저장소 같은 외부 시스템과 통합해야 한다.
- 통합을 통해서 여러 부분 간의 통신 및 조정이 가능하다.
요약
이벤트 소싱에서 중요한 개념
- 애그리거트
- 이벤트
- 이벤트 저장소
- 명령
- 이벤트 핸들러
- 이벤트 재생
이벤트 소싱, CQRS와 연관성
- CQRS는 읽기 및 쓰기 작업을 별도의 모델 또는 구성 요소로 분리하는 아키텍쳐 패턴이다.
- CQRS에서 쓰기 모델은 명령을 처리하고, 이벤트를 생성하고, 이벤트를 저장소에 지속시키는 일을 담당한다.
- 읽기 모델은 이벤트를 쿼리하고 읽기 작업에 최적화된 반정규화된 뷰, 테이블로 투영하는 작업을 담당
- 이벤트 소싱은 CQRS의 쓰기 모델에 적합하다.