핵심 인사이트 (3줄 요약)
- 본질: CQRS(Command Query Responsibility Segregation)는 데이터 저장소에 대한 변경(Command, 쓰기)과 조회(Query, 읽기)의 책임을 분리하는 아키텍처 패턴이다.
- 가치: 읽기와 쓰기의 성능 요구사항이 다를 때 각각 최적화된 모델과 DB를 사용하여 시스템의 성능과 확장성을 극대화한다.
- 판단 포인트: 복잡한 비즈니스 로직(쓰기)과 빈번하고 다양한 형태의 화면 출력(읽기)이 엉켜 성능 병목이 발생할 때, 두 모델을 물리적으로 분리하여 해결한다.
Ⅰ. 개요 및 필요성
전통적인 CRUD 모델은 하나의 데이터 모델(Entity)로 저장과 조회를 모두 처리한다. 하지만 서비스가 커지면 문제는 발생한다. 조회를 위해 수많은 테이블을 조인(Join)하다 보니 성능이 떨어지고, 조회 전용 코드가 비즈니스 로직에 섞여 코드가 지저분해진다. CQRS는 이를 해결하기 위해 "상태를 바꾸는 행위(Command)"와 "상태를 보여주는 행위(Query)"를 아예 별개의 객체나 DB로 나눈다. 쓰기는 무겁고 견고하게, 읽기는 가볍고 빠르게 처리하는 전략이다.
📢 섹션 요약 비유: CQRS는 '주방과 홀이 분리된 식당'이다. 요리(쓰기)는 주방에서 복잡하게 하고, 서빙(읽기)은 홀 카운터에서 미리 준비된 메뉴판을 보고 빠르게 처리하는 것과 같다.
Ⅱ. 아키텍처 및 핵심 원리
CQRS의 단계별 분리 수준
- 모델 분리 (Level 1):
- 같은 DB를 쓰지만, 코드 레벨에서 Command 모델과 Query 모델을 분리한다.
- DB 분리 (Level 2):
- 쓰기용 DB(RDBMS)와 읽기용 DB(NoSQL, Cache)를 물리적으로 나눈다.
- 쓰기 DB에서 발생한 이벤트를 읽기 DB로 동기화(Projection)한다.
핵심 동작 원리
[사용자 요청]
│
├─▶ [Command Model] ─▶ [Write DB (RDBMS)] ──┐
│ │ (Event Sync)
└─▶ [Query Model] ◀── [Read DB (NoSQL)] ◀───┘
- Command: 상태 변경(Insert, Update, Delete). 반환값 없음(Void).
- Query: 데이터 조회(Select). 상태 변경 없음.
📢 섹션 요약 비유: 읽기 모델은 '신문의 요약본'이다. 신문 기사가 쓰일 때는 수많은 취재와 편집(쓰기)이 필요하지만, 독자는 요약된 헤드라인(읽기 모델)만 보고 정보를 빨리 파악한다.
Ⅲ. 비교 및 연결
일반 CRUD vs CQRS
| 비교 항목 | 일반 CRUD (Single Model) | CQRS (Segregated Model) |
|---|---|---|
| 데이터 정합성 | 강한 일관성 (트랜잭션 즉시 반영) | 최종적 일관성 (동기화 지연 가능성) |
| 성능 최적화 | 한계가 있음 (읽기/쓰기 충돌) | 각각 독립적 최적화 가능 (매우 빠름) |
| 구현 복잡도 | 낮음 (익숙한 방식) | 높음 (이벤트 처리, DB 관리 필요) |
| 적합한 시스템 | 단순한 게시판, 내부 관리툴 | 고성능 웹 서비스, 복잡한 도메인 시스템 |
📢 섹션 요약 비유: 일반 CRUD는 책 한 권으로 공부와 시험을 다 하는 것이고, CQRS는 공부용 기본서와 시험용 요약 노트를 따로 만들어서 시험(조회)만 빨리 보는 것이다.
Ⅳ. 실무 적용 및 기술사 판단
기술사 핵심 포인트:
- 이벤트 소싱 (Event Sourcing) 결합: 데이터의 모든 변경을 이벤트로 저장하고 이를 읽기 모델로 변환(Projection)하는 방식이 CQRS의 가장 강력한 파트너다.
- 일관성 갭 (Consistency Gap): 쓰기 DB와 읽기 DB 사이의 동기화 시간차(Lag)를 비즈니스적으로 어떻게 허용할 것인지(최종 일관성) 결정해야 한다.
- 폴리글랏 퍼시스턴스: 쓰기는 데이터 정합성이 좋은 PostgreSQL을, 읽기는 검색에 강한 Elasticsearch나 Redis를 사용하는 등 목적에 맞는 DB 선택이 가능하다.
📢 섹션 요약 비유: CQRS는 '분업의 미학'이다. 무거운 짐을 옮기는 사람(쓰기)과 길을 안내하는 사람(읽기)을 따로 두어 전체적인 이동 속도를 높이는 전략이다.
Ⅴ. 기대효과 및 결론
CQRS는 현대적인 대규모 분산 시스템에서 필수적인 아키텍처다. "읽기 성능을 위해 비즈니스 모델을 희생하지 마라"는 DDD의 원칙을 가장 잘 실현하는 방법이기도 하다. 기술사 시험에서는 단순한 조회 분리를 넘어, 이벤트 기반의 비동기 동기화 메커니즘과 이로 인한 데이터 최종 일관성 문제를 어떻게 관리할 것인지 논리적으로 전개하는 것이 합격의 열쇠다.
📢 섹션 요약 비유: CQRS는 IT 세상의 '전용 차선'이다. 버스(쓰기)와 승용차(읽기)를 나누어 도로가 막히지 않고 모두가 제 속도를 낼 수 있게 만든다.
📌 관련 개념 맵
| 개념 | 연관 키워드 | 관계 |
|---|---|---|
| 프로젝션 (Projection) | 읽기 모델 생성, 동기화 | 쓰기 데이터를 읽기 편한 형태로 변환하는 과정 |
| 이벤트 소싱 | 변경 이력 저장, 재생 | CQRS와 결합하여 강력한 데이터 추적성 제공 |
| 최종적 일관성 | BASE, 동기화 지연 | CQRS 도입 시 반드시 고려해야 할 정합성 모델 |
| NoSQL | MongoDB, Elasticsearch | 읽기 성능 최적화를 위해 자주 쓰이는 읽기 전용 DB |
👶 어린이를 위한 3줄 비유 설명
- 일기를 쓰는 공책과, 일기를 읽어주는 아나운서를 따로 두는 방법이에요.
- 쓰는 건 꼼꼼하게 하고, 읽는 건 미리 요약해서 아주 빠르게 대답해줘요.
- 사람들이 한꺼번에 질문을 많이 해도 미리 준비된 대답 덕분에 막히지 않아요.