320x100
320x100

CQRS (Command And Query Responsibility Segregation)

: 데이터 저장소로부터 읽기와 업데이트 작업을 분리하는 패턴

: 애플리케이션의 성능과 확장성, 보안성을 극대화 할 수 있음

: 지속적인 시스템 발전과 여러 요청으로 부터 들어온 복수의 업데이트 명령들에 대한 충돌 방지

 

 

 

 

 

전통적인 아키텍처에서의 문제점

: DB에서 데이터를 조회하고 업데이트 하는데 같은 데이터 모델을 사용

: 이로인해 간단한 CRUD에서는 문제가 없으나, 복잡한 애플리케이션의 경우 유지 보수가 어려워진다

: 읽기와 쓰기 작업에서 사용되는 데이터 표현들이 일치하지 않을 수 있다

 

- 해결 방법

: CQRS 패턴을 통해 읽기와 쓰기를 다른 모델로 분리

: 명령을 통해 데이터를 쓰고 쿼리를 통해 데이터를 읽음

: 명령은 데이터 중심이 아닌 수행할 작업 중심으로 작성해야하고, 비동기적으로 큐에 쌓인 후 수행

: 쿼리는 DB를 결코 수정하지 않는다

 

 

 

 

 

CQRS 구현

: 조회에 최적화된 DB 스키마를 가지거나 다른 타입의 데이터 저장소를 사용

 > ex) 쓰기는 RDBMS, 읽기는 몽고DB를 사용

: 쓰기 모델 DB에 수정 사항이 발생하면 이벤트를 발행하여 하나의 트랜잭션 내에서 데이터 저장소간 동기화 수행

 

- 어려움

: 구현이 복잡하다

: 업데이트 이벤트 발행을 위해 메시징 실패나 중복 메시지 등에 대한 처리 필요

: 데이터 일관성을 유지하기 어렵다 (딜레이를 고려해야함)

 

 

 

CQRS의 장점

- 독립적인 스케일링

: 읽기와 쓰기 각각에 대해 독립적인 확장이 가능하게 하며, 훨씬 적인 Lock 경합을 발생시킨다

 

- 최적화된 데이터 스키마

: 각각 기능에 최적화된 스키마를 사용

 

- 보안

: 읽기와 쓰기가 분리되어 보안 관리가 용이

 

- 관심사 분리

: 시스템의 유지 보수를 쉽고 유연하게 함

 

- 간단한 쿼리

: 읽기 저장소의 materialized view를 통해 복잡한 조인문을 사용하지 않을 수 있다

 

 

 

 

 

 

 

 

 

 

Reference

 

CQRS란 무엇인가?

이 글은 https://docs.microsoft.com/en-us/azure/architecture/patterns/cqrs 을 기반으로 작성되었으나 필자의 생각과 별도의 코드가 추가되었다. CQRS란 Command and Query Responsibility Segregation 의 약자로, 데이터 저장

mslim8803.tistory.com

 

A demo on Clean Architecture with CQRS and Repository Pattern in .NET Web API

Clean Architecture

medium.com

https://www.baeldung.com/cqrs-event-sourcing-java

 

300x250
728x90