본문 바로가기
SW 아키텍처

[웹 지식] CQRS 아키텍처 패턴

by 클레어몬트 2025. 4. 18.

ㅇCQRS(Command Query Responsibility Segregation): 명령과 조회 책임 분리


즉, 데이터를 읽는 작업(Query)데이터를 변경하는 작업(Command)분리해서 처리하는 아키텍처 패턴이다!

 

전통적인 시스템에서는 하나의 모델이 읽기와 쓰기(조회와 갱신)를 모두 담당한다. 하지만 시스템이 커지면 읽기

와 쓰기의 목적과 패턴이 달라지는 경우가 많다. 이때! CQRS를 적용하면 읽기 전용 모델 쓰기 전용 모델 분리함으로써 성능, 확장성, 유지보수성 측면에서 유리하다.

CQRS의 핵심 원칙

 

CQRS를 사용하는 이유!

  • 읽기/쓰기 작업의 부하가 불균형한 경우
    → 조회는 많고 변경은 적은 경우, 조회 모델만 최적화 가능
  • 확장성
    → 쓰기 작업은 작고 안정적인 DB, 읽기는 빠른 캐시나 리드 레플리카로 구성
  • 복잡한 도메인 모델 분리
    → 쓰기 작업은 도메인 로직이 복잡하지만, 조회는 단순한 DTO로 구성 가능
  • 성능 최적화
    → 읽기 전용 DB는 별도로 튜닝 가능

 

그러면 CQRS를 언제 사용하면 좋을까?

[적합한 경우]

  • 읽기 요청이 많은 경우(e.g. 쇼핑몰, 뉴스 사이트)
  • 대규모 트래픽을 처리해야 할 때
  • 읽기와 쓰기의 사용량이 현저히 다를 때
  • 데이터 일관성보다 성능이 더 중요할 때
  • 고성능 API가 필요할 때
  • 복잡한 도메인 모델이 존재할 때

[부적합한 경우]

  • 소규모 프로젝트
  • 시스템이 단순하고, 복잡도를 감당할 이유가 없을 때
  • 데이터 일관성이 실시간으로 엄격히 보장되어야 할 때

 

[CQRS 구조 예시]

[사용자 요청]
      ↓
[Command API] → [Command Model] → [Write DB]
      ↑
[Query API]   ← [Query Model]   ← [Read DB]

 

 

- 쓰기와 읽기를 완전히 분리된 구조로 구성

- Read DB는 Write DB의 데이터를 비동기적으로 복제하거나 이벤트 기반으로 동기화

 

 

CQRS 아키텍처 패턴을 학습하면서, 단순히 '읽기'와 '쓰기'를 분리하는 것 이상의 의미를 갖고 있다는 점을 알게 되었다. 기존에는 하나의 모델로 모든 요청을 처리하는 것이 당연하다고 생각했지만, 실제로 시스템이 커질수록 복잡성과 성능 문제가 발생할 수 있다는 점에서 CQRS의 필요성을 실감했다.

특히, 조회는 빠르고 유연해야 하며, 명령은 엄격하고 안정적이어야 한다는 원칙이 설계에 그대로 반영된다는 것이 인상 깊었다. 또한, 읽기 모델과 쓰기 모델을 분리함으로써 확장성유지보수 측면에서도 더 유리하다는 것을 느꼈다.

 

실제 서비스에 바로 적용하기에는 고려해야 할 점도 많지만, 복잡한 도메인에서 높은 확장성과 성능을 요구하는 시스템이라면 충분히 도입을 고민해볼 가치가 있는 아키텍처라고 생각한다..!

 
 

#SK, #SKALA, #SKALA1기