피드로 돌아가기![[SaaS] 시간여행이 가능한 시스템 아키텍처](https://tsewlmecqtvqphyhezcm.supabase.co/storage/v1/object/public/thumbnails/b6b2ba5f-8802-4264-9ca8-d78ee3c0e65c.webp?)
강남언니 공식 블로그Backend
원문 읽기
[SaaS] 시간여행이 가능한 시스템 아키텍처
힐링페이퍼가 Event Sourcing 패턴으로 의료 SaaS 도메인의 상태 변경을 이벤트 스트림으로 저장해 감사 추적(Audit Log)과 과거 시점 데이터 복원 가능
AI 요약
Context
미용의료 병원 SaaS에서 환자 내원 과정(접수→상담→시술→사후관리)의 순차적 변경 사항을 추적하고, 특정 시점으로 돌아가 데이터를 확인해야 하는 요구사항이 있었다. 기존 상태 기반 시스템은 최종 스냅샷만 저장하므로 어떤 작업이 언제 누가 수행했는지, 버그가 로직인지 사용자 입력인지 구분할 수 없었다.
Technical Solution
- 상태 변경을 이벤트 객체로 저장: Reserve, CancelReservation 등 모든 도메인 명령을 이벤트로 변환해 EventStore에 순서대로 기록
- Event Handler를 통한 상태 복원: 저장된 이벤트들을 순차 재생(rehydrate)해 언제든 특정 시점의 Schedule 상태를 재구성
- CommandExecutor로 도메인 검증 후 이벤트 생성: 중복예약 방지 등 비즈니스 로직을 먼저 검증한 후만 이벤트를 발행하는 구조
- Headspring을 중앙 조정자로 설계: streamId 기반으로 EventStore 조회 → 상태 복원 → 명령 실행 → 이벤트 저장 → MessageBus 발행의 일관된 흐름 제공
- CQRS 패턴으로 조회 성능 보완: 명령 모델은 Event Sourcing으로 구현하고 조회 모델을 별도 유지해 '특정 시간대 스케줄 조회' 같은 복잡한 필터링 시 쿼리 성능 저하 해결
Key Takeaway
변경 이력과 감사 추적이 중요한 도메인(결제, 예약, 의료 프로세스)에서는 Event Sourcing을 통해 '무엇이 언제 일어났는가'를 영구 기록하고 DDD의 Aggregate 패턴과 EventStorming을 자연스럽게 적용할 수 있다. 단, 다중 스트림 조회나 대량 이벤트 복원 시 성능 병목이 발생하므로 CQRS로 분리된 조회 모델이 필수적이다.
실천 포인트
의료·금융·전자상거래 같은 감사 추적이 필수인 도메인에서 Event Sourcing을 도입하면, 특정 시점의 데이터 상태로 시간 여행이 가능하고 버그 발생 원인(로직 오류 vs 사용자 입력 오류)을 명확히 구분할 수 있다. 구현 시 초기 상태 팩토리(seedFactory), EventStore, EventHandler, CommandExecutor, Rehydrator 5개 핵심 컴포넌트를 갖춰야 하며, 조회 성능 문제는 CQRS 패턴으로 읽기 전용 모델을 별도 유지해 해결한다.