devops

CQRS(Comman Query Responsibility Segregation) 본문

DevOps/AWS

CQRS(Comman Query Responsibility Segregation)

vata500 2022. 6. 20. 13:27
반응형

명령과 조회의 책임분리를 의미한다. 쉽게 말해서 명령과 조회를 처리하는 책임을 분리하는 것이 CQRS의 핵심이다.

CQRS는 초기 CQS에서 시작하여 확장했다.

CQS는 Command Query Separation의 약자다. 시스템에서 처리되는 명령과 조회를 정의하는 핵심 개념이자, 둘을 분리시키는 디자인 패턴이다. 명령은 상태를 변경하는 것이고, 조회는 상태를 반환하는 작업을 의미한다.

CQRS와 마이크로서비스

마이크로서비스의 핵심은 서비스별 DB를 각기 다르게 채택하는 것이다. 서비스 성능 향상을 위해 인스턴스를 스케일 아웃하여 여러개로 실행하면 빈번한 명령과 조회 작업으로 리소스 교착상태가 발생한다.

더구나 명령보다 조회 요청이 훨씬 많기 때문에 하나의 서비스 내에 모든 기능을 넣어두면, 조회 요청 빈도가 증가하여 명령기능도 확장해야해서 도메인의 복잡도가 높아진다. 그래서 CQRS는 요청을 명령(Create, Update, Delete)와 조회(Read)로 나누어 처리한다.

위 도식에서 단순히 모델을 나누는 형태로 명령과 조회를 분리할 수 있다. 그러나 데이터 저장소를 같이 사용하기 때문에 마이크로서비스 설계 철학과 부합하지 않는다.

물리적으로 명령과 조회 작업을 위한 저장소를 따로 준비할 수 있다. 이렇게 각각 분리하면 명령 요청의 부하를 줄이고 조회 대기 시간도 아낄 수 있다.


CQRS는 이벤트 소싱 패턴과 함께 사용되기도 한다. 메시지 브로커를 이용한 '이벤트 주도 아키텍처'는 이벤트로 상태가 변경되면 이를 데이터 모델로 처리하고 최종값을 반영하는 형태를 의미한다. 

하지만 '이벤트 소싱 패턴'은 데이터로 저장하는 것이 아니라, 상태 변경 이벤트 자체를 저장한다.

이럴 경우, 메시지 브로커와 데이터 저장소를 분리하지 않아도 되며, 데이터로 변경하는 복잡한 과정 없이 쓰기속도도 빠르고 이벤트에 따른 CRUD를 전부 처리할 필요없이 이벤트발생 / 조회 만 처리하면 되기 때문에 서비스 확장을 더 용이하게 할 수 있다.

즉, 이벤트는 한 번 발생한 후에 수정되지 않고 업데이트나 삭제없이 입력만 되는 개념이다. 저장소에 이런 이벤트를 저장(쓰기)해두고, 필요한 데이터가 생기는 시점에 축적된 이벤트를 조회(읽기)하면 되는 형태다.

이는 CQRS와 같은 맥락의 패턴을 가진다. 그래서 이벤트 소싱과 CQRS는 함께 사용하기 좋다.

반응형
Comments