이벤트 소싱

  • 애플리케이션 상태에 대한 모든 변경 사항을 일련의 이벤트로 캡쳐하는 데 중점을 두는 DDD의 중요 개념이다.
  • 애플리케이션 상태를 감사, 디버깅 및 재구축하는 데 많은 이점을 제공한다.
  • 유연하고 확장 가능한 아키텍쳐를 구현할 수 있다.

이벤트 소싱이란?

  • DB 업데이트 적용 대신 일련의 이벤트를 재생하여 애플리케이션의 현재 상태를 결정하는 패턴
  • 기존 관계형 DB 지속성에 대한 대앙ㄴ으로 볼 수 있다.
  • 엔티티의 현재 상태만 저장하는 대신 발생한 이벤트의 변경 불가능한 로그를 저장한다.
  • 이벤트는 애플리케이션 상태 변화를 나타내며, 특정 시점에 애플리케이션 상태를 재구축하는 데 사용할 수 있다.

주요 개념

  1. 이벤트
    • 이벤트 소싱의 핵심
    • 과거에 어떤 일이 발생했다는 사실을 나타낸다.
    • 각 이벤트는 불변이므로 일단 생성되면 수정할 수 없다.
    • 일반적으로 고유 식별자, 타임스탬프, 발생과 관련된 관련 데이터가 포함된 페이로드로 구성된다.
  2. 이벤트 스토어
    • 모든 이벤트가 지속되는 곳
    • 이벤트에 대한 쓰기 전용 로그 역할을 하며 데이터 내구성을 보장
    • 추가 전용이므로 새 이벤트는 로그 끝에만 추가할 수 있다.
  3. 이벤트 핸들러
    • 이벤트를 처리하고 이벤트에 반응하는 역할을 담당
    • 이벤트 스토어에서 이벤트 스트림을 수신하고 그에 따라 애플리케이션의 상태를 업데이트한다.
  4. 애그리거트
    • DDD 및 이벤트 소싱의 기본 구성 요소
    • 애그리거트는 관련 비즈니스 엔티티의 클러스터를 나타내며 이들의 동작을 캡슐화한다.
    • 애그리거트는 일관성 규칙이 적용되는 경계를 정의한다.

이점

  1. 감사 및 규정 준수 : 현재 상태에 도달한 과정을 더 쉽게 추적하고 이해할 수 있다.
  2. 시간적 쿼리 및 재구성 : 발생한 모든 이벤트를 캡쳐하기 때문에 특정 시점에 애플리케이션의 상태를 쿼리할 수 있다.
  3. 확장성 및 가용성
    • 대량의 데이터와 높은 처리량을 처리할 수 있는 이벤트 중심의 분산 아키텍쳐를 구현할 수 있다.
    • 이벤트 스트림, 메시지 큐를 사용하면 시스템의 여러 구성 요소가 독립적으로 비동기적으로 작동할 수 있다.
  4. 도메인 모델의 진화
    • 시간이 지남에 따라 도메인 모델의 진화를 촉진
    • 이벤트는 사실을 나타내므로 새로운 유형의 이벤트를 도입하거나 기존 이벤트를 수정하여 도메인 모델의 변경 사항을 쉽게 처리할 수 있다.

구현 고려 사항

  1. 이벤트 버전 관리
    • 도메인 모델 발전에 따라 이벤트 구조나 의미가 변경될 수 있다.
    • 이전 버전과 호환성을 보장하고 다양한 이벤트 스키마 버전을 처리하려면 이벤트를 버전화하는 것이 필요하다.
  2. 이벤트 재생 및 투영
    • 상태 재구축에는 올바른 순서로 재생이 필요하다.
    • 이벤트 스트림을 유지 관리하고 애플리케이션의 상태를 나타내는 프로젝션에 재생함으로써 달성할 수 있다.
  3. 외부 시스템과의 통합
    • 이벤트 소싱을 사용할 떄는 메시지 큐나 저장소 같은 외부 시스템과 통합해야 한다.
    • 통합을 통해서 여러 부분 간의 통신 및 조정이 가능하다.

요약

이벤트 소싱에서 중요한 개념

  1. 애그리거트
  2. 이벤트
  3. 이벤트 저장소
  4. 명령
  5. 이벤트 핸들러
  6. 이벤트 재생

이벤트 소싱, CQRS와 연관성

  1. CQRS는 읽기 및 쓰기 작업을 별도의 모델 또는 구성 요소로 분리하는 아키텍쳐 패턴이다.
    1. CQRS에서 쓰기 모델은 명령을 처리하고, 이벤트를 생성하고, 이벤트를 저장소에 지속시키는 일을 담당한다.
    2. 읽기 모델은 이벤트를 쿼리하고 읽기 작업에 최적화된 반정규화된 뷰, 테이블로 투영하는 작업을 담당
  2. 이벤트 소싱은 CQRS의 쓰기 모델에 적합하다.