Day 77 · 3/5
🌳 고급 고급

CQRS가 뭔가요?

쉽게 이해하기

식당을 생각해보세요. 주방(쓰기)과 메뉴판(읽기)은 완전히 다른 형태죠. 주방에서는 레시피와 조리 과정이 중요하지만, 손님이 보는 메뉴판은 예쁜 사진과 간단한 설명만 있으면 돼요. CQRS는 이처럼 데이터를 쓸 때와 읽을 때 필요한 형태가 다르다는 점을 인정하고, 아예 분리하는 방식이에요.

핵심 정리

데이터를 읽는 모델과 쓰는 모델을 분리해서 각각 최적화하는 패턴이에요.

자세히 알아보기

CQRS는 Command Query Responsibility Segregation의 약자로, 데이터를 변경하는 작업(Command)과 조회하는 작업(Query)을 완전히 분리하는 아키텍처 패턴입니다. 기존에는 하나의 모델로 읽기와 쓰기를 모두 처리했지만, CQRS는 각각 다른 모델을 사용해요. 왜 분리할까요? 읽기와 쓰기는 요구사항이 완전히 다르기 때문이에요. 쓰기는 비즈니스 규칙 검증, 트랜잭션 보장, 데이터 일관성이 중요하지만, 읽기는 빠른 응답 속도와 복잡한 조인 쿼리가 중요하죠. 하나의 모델로 둘 다 만족시키려면 복잡해지고 비효율적이에요. CQRS를 적용하면 쓰기 모델은 정규화된 관계형 데이터베이스로, 읽기 모델은 비정규화된 NoSQL로 구성할 수 있어요. 예를 들어 주문 데이터는 PostgreSQL에 쓰지만, 대시보드 조회는 미리 집계해둔 Redis나 Elasticsearch에서 읽는 식이죠. 실무에서는 이벤트를 사용해서 쓰기 모델의 변경사항을 읽기 모델에 동기화해요. 하지만 이로 인해 읽기 모델이 약간 지연될 수 있고(Eventual Consistency), 시스템 복잡도가 크게 증가합니다. 그래서 읽기/쓰기 부하가 극단적으로 차이나거나, 복잡한 리포팅이 필요한 경우에만 사용하는 게 좋아요.