CQRS Pattern
Command Query Responsibility Segregation: 데이터 쓰기(Command)와 읽기(Query) 모델을 물리적으로 분리하는 아키텍처 패턴. Write Model의 이벤트를 구독하여 Read Model을 동기화하는 비동기 프로세스. 결과적...
sys.entry
M
Me
hyunyoun's Blog
system-architecture-distributed-systems1 min read
CQRS Pattern
Command Query Responsibility Segregation: 데이터 쓰기(Command)와 읽기(Query) 모델을 물리적으로 분리하는 아키텍처 패턴.
핵심 분리
CODE
Client
├── Command → Write Model (이벤트 저장소 / 정규화 DB)
└── Query → Read Model (비정규화 캐시 / 검색 인덱스)
Write Model: 도메인 불변식(Invariant) 검증에 최적화. 정규화, 트랜잭션 중심.
Read Model: 조회 성능에 최적화. 비정규화된 Materialized View. 스키마를 쿼리 요구사항에 맞게 자유롭게 설계.
Projection
Write Model의 이벤트를 구독하여 Read Model을 동기화하는 비동기 프로세스. 결과적 일관성(Eventual Consistency) 허용.
언제 쓰는가
- 읽기 부하가 쓰기보다 압도적으로 높을 때 (일반적 웹 서비스)
- 동일 데이터를 다양한 형태로 조회해야 할 때 (대시보드, 검색, 리포트)
- 이벤트 소싱과 결합하여 완전한 감사 추적이 필요할 때
주의점
- 읽기/쓰기 모델 간 동기화 지연 → 사용자가 방금 작성한 데이터가 즉시 안 보일 수 있음
- 두 모델 유지로 시스템 복잡도 증가 → 단순 CRUD 서비스에는 과설계
연결 노트
- ZK-Event-Sourcing — CQRS의 Write Model로 Event Store를 사용하는 일반적 조합
- ZK-Microservices-Decomposition — 마이크로서비스별 독립 Read Model 운용
- ZK-SLI-SLO-Error-Budget — Eventual Consistency 허용 범위를 SLO로 정의