핵심 인사이트 (3줄 요약)

  1. 본질: 이벤트 소싱 (Event Sourcing)은 시스템의 현재 상태를 저장하는 대신, 그 상태에 이르기까지의 모든 상태 변화 이벤트(event)를 영구적이고 순서가 보장된 추가 전용(append-only) 이벤트 스트림으로 저장하고, 이 이벤트들을 순서대로 재생(replay)하여 현재 상태를 복원하는 패턴이다.
  2. 가치: 데이터의 전체 변경 이력이 이벤트로 보존되므로 완벽한 감사 추적(audit trail), 특정 시점으로의 시간 여행(time travel), 이벤트 재생을 통한 새로운 읽기 모델 생성이 모두 가능해진다.
  3. 판단 포인트: 이벤트 소싱은 이벤트 스키마 진화, 스냅샷 전략, 긴 이벤트 스트림의 성능이라는 세 가지 기술적 도전을 수반하므로, 감사 추적과 이력 관리가 핵심 요구사항인 금융·의료·법률 도메인에서 그 가치가 극대화된다.

Ⅰ. 개요 및 필요성

전통적인 CRUD (Create, Read, Update, Delete) 방식에서는 현재 상태만 저장하고 이전 상태는 덮어쓴다. 이 방식은 "지금 무엇인가"는 알 수 있지만 "어떻게 이 상태가 되었는가"는 알 수 없다. 금융 거래에서 현재 잔액은 알 수 있지만 어떤 입출금이 있었는지 알 수 없는 상황이 된다.

이벤트 소싱은 이 문제를 근본적으로 해결한다. 현재 잔액 대신 "100원 입금", "50원 출금", "200원 입금" 같은 이벤트들을 순서대로 저장한다. 현재 잔액(250원)은 이 이벤트들을 재생하여 계산한다. 어떤 시점의 잔액도 해당 시점까지의 이벤트를 재생하면 알 수 있다.

┌─────────────────────────────────────────────────────────────┐
│        이벤트 소싱 vs 전통 CRUD 저장 방식 비교              │
├─────────────────────────────────────────────────────────────┤
│  [전통 CRUD] - 현재 상태만 저장                              │
│  계좌 잔액: 250원 (이력 없음)                                │
│                                                             │
│  [이벤트 소싱] - 이벤트 스트림 저장                          │
│  이벤트 #1: AccountOpened(balance=0)  @2026-01-01           │
│  이벤트 #2: MoneyDeposited(amount=100) @2026-01-02          │
│  이벤트 #3: MoneyWithdrawn(amount=50)  @2026-01-03          │
│  이벤트 #4: MoneyDeposited(amount=200) @2026-01-04          │
│                                                             │
│  현재 상태 = 이벤트 #1~#4 순차 재생 → 잔액 250원            │
└─────────────────────────────────────────────────────────────┘

이벤트는 append-only로만 저장된다. 한번 기록된 이벤트는 수정하거나 삭제하지 않는다. 이 불변성(immutability)이 감사 추적의 신뢰성을 보장한다.

  • 📢 섹션 요약 비유: 회계 장부는 숫자를 지우고 고쳐 쓰지 않는다. 잘못된 금액은 반대 방향의 정정 분개를 추가한다. 이벤트 소싱은 이 회계 원칙을 소프트웨어에 적용한 것이다.

Ⅱ. 아키텍처 및 핵심 원리

이벤트 소싱의 핵심 구성 요소는 이벤트 스토어(Event Store), 애그리게이트(Aggregate), 프로젝션(Projection), 스냅샷(Snapshot)이다.

항목설명포인트
이벤트 스토어이벤트를 append-only로 영구 저장불변성, 순서 보장, 버전 관리
애그리게이트이벤트를 소비하여 현재 상태 계산이벤트 적용(apply) 메서드
프로젝션이벤트로부터 읽기 모델 생성CQRS 읽기 모델과 결합
스냅샷특정 시점 상태 저장으로 재생 최적화N번째 이벤트마다 스냅샷
┌─────────────────────────────────────────────────────────────┐
│      스냅샷을 통한 이벤트 재생 최적화                        │
├─────────────────────────────────────────────────────────────┤
│  이벤트 스트림:                                             │
│  E1 E2 E3 ... E500 [스냅샷] E501 E502 ... E750 [스냅샷] ... │
│                                                             │
│  현재 상태 복원 시:                                         │
│  가장 최근 스냅샷 로드 + 스냅샷 이후 이벤트만 재생          │
│  (전체 이벤트 재생 불필요 → 성능 최적화)                    │
└─────────────────────────────────────────────────────────────┘

이벤트 스키마 진화가 이벤트 소싱의 핵심 기술 도전이다. 초기에 정의한 이벤트 구조가 비즈니스 변화로 바뀌어야 할 때, 이미 저장된 이벤트를 변경할 수 없으므로 업캐스팅(upcasting) 기법으로 이전 버전 이벤트를 최신 버전으로 변환하여 처리한다.

  • 📢 섹션 요약 비유: Git의 커밋 히스토리와 같다. 현재 코드 상태는 모든 커밋을 순서대로 적용한 결과다. 특정 커밋으로 되돌아가거나(time travel), 새로운 브랜치에서 다른 방향으로 실험(새 읽기 모델)할 수 있다.

Ⅲ. 비교 및 연결

이벤트 소싱과 전통 CRUD의 선택은 "현재 상태"와 "변화의 이력" 중 무엇이 핵심 자산인지에 따라 결정된다.

비교 축AB
저장 대상현재 상태 (Latest State)변화 이벤트 스트림
이력 추적별도 감사 테이블 필요이벤트 자체가 이력
시간 여행불가 (이전 상태 소실)이벤트 재생으로 가능
복잡도단순높음
읽기 성능직접 조회 (빠름)프로젝션 필요

이벤트 소싱은 DDD (도메인 주도 설계)의 애그리게이트(Aggregate) 패턴, CQRS와 삼위일체를 이룬다. DDD 애그리게이트가 도메인 경계를 정의하고, 이벤트 소싱이 상태 변화를 이벤트로 저장하며, CQRS가 읽기 모델을 분리한다.

  • 📢 섹션 요약 비유: 사진(CRUD)은 현재 모습만 담지만, 영상(이벤트 소싱)은 모든 순간의 변화를 담는다. 사진으로는 어제 어디에 있었는지 알 수 없지만, 영상은 재생하면 알 수 있다.

Ⅳ. 실무 적용 및 기술사 판단

이벤트 소싱의 실무 도입에서 가장 많이 간과하는 것은 GDPR (General Data Protection Regulation, 일반 개인정보보호 규정) 등 개인정보 삭제 요구와의 충돌이다. 이벤트가 append-only라 삭제가 불가능하므로, 암호화 삭제(cryptographic erasure) 기법으로 개인정보를 암호화하고 키만 삭제하는 방식을 사용한다.

판단 체크리스트

  1. 완벽한 감사 추적(audit trail)이 법적·비즈니스적으로 필요한가?
  2. 과거 특정 시점의 상태 조회(time travel)가 요구사항인가?
  3. 이벤트 스키마 진화 전략이 계획되어 있는가?
  4. 스냅샷 전략으로 이벤트 재생 성능이 수용 가능한가?
  5. GDPR 등 개인정보 삭제 요구에 대한 암호화 삭제 전략이 있는가?
  • 📢 섹션 요약 비유: 의료 기록은 현재 상태만 기록하지 않고 모든 진료 이력을 보존한다. 특정 날의 진료 내용을 다시 볼 수 있고, 이력으로 현재 상태를 설명한다.

Ⅴ. 기대효과 및 결론

이벤트 소싱을 적용하면 완벽한 감사 추적, 시간 여행, 이벤트 재생을 통한 버그 재현·재처리, 새로운 읽기 모델의 언제든지 추가가 가능해진다. 특히 금융·의료·법률처럼 이력 추적이 규정 요구사항인 도메인에서 추가 감사 테이블 없이 이 요구사항을 자연스럽게 충족한다.

한계는 기술 복잡도와 초기 학습 비용이다. 이벤트 스키마 설계, 스냅샷 전략, 프로젝션 관리, GDPR 대응이 모두 추가 설계 고려사항이다. 조회 지연(최종 일관성)도 감수해야 한다.

미래 방향으로는 ① 이벤트 소싱 전용 데이터베이스(EventStoreDB)의 성숙, ② 블록체인과 이벤트 소싱의 감사 추적 공유 원칙 활용, ③ ML 모델 학습 데이터로 이벤트 스트림 활용이 주목받고 있다.

이벤트 소싱은 "현재 상태는 과거 모든 변화의 결과물"이라는 철학을 시스템 설계에 적용한 것으로, 변화의 이력이 핵심 자산인 도메인에서 가장 강력한 무기로 기억해야 한다.

  • 📢 섹션 요약 비유: 블랙박스는 현재 차량 상태가 아니라 사고 직전까지의 모든 이동 이력을 기록한다. 이벤트 소싱은 소프트웨어 시스템의 블랙박스다.

📌 관련 개념 맵

[CRUD 이력 소실 문제] → [이벤트 소싱] → [애그리게이트] → [CQRS 읽기 모델] → [감사 추적·시간 여행]

개념연결 포인트
CQRS이벤트 소싱의 쓰기 이벤트로부터 읽기 모델 생성
애그리게이트이벤트를 적용하여 현재 상태를 유지하는 DDD 개념
스냅샷이벤트 재생 성능 최적화 기법
EventStoreDB이벤트 소싱 전용 데이터베이스

📈 관련 키워드 및 발전 흐름도

[CRUD 상태 덮어쓰기] → [이벤트 로그 패턴] → [이벤트 소싱 패턴(그렉 영)] → [CQRS+DDD 결합] → [EventStoreDB] → [블록체인·ML 이벤트 스트림 활용]

👶 어린이를 위한 3줄 비유 설명

  1. 저금통(현재 잔액)만 보면 돈을 얼마나 넣고 뺐는지 모르잖아요.
  2. 이벤트 소싱은 "100원 넣기", "50원 꺼내기" 같은 모든 기록을 순서대로 남기는 방법이에요.
  3. 그러면 어느 날의 잔액도 기록을 되감아서 계산할 수 있어요!