티스토리 뷰

반응형

CQRS 패턴이란?

CQRS는 Command Query Responsibility Segregation의 약자로 "명령 조회 책임 분리" 라는 뜻을 갖고 있다. 이는 애플리케이션을 구성하는 아키텍처 패턴 중 하나로 명령과 조회에 대한 책임을 분리하여 아키텍처를 구성하는 것이다. 그럼 왜 그렇게 해야하는지 알아보자

Why?

일반적인 애플리케이션은 데이터를 연결된 데이터베이스에 레코드로써 생성하거나 조회하거나 갱신 삭제를 한다. 그리고 이렇게 애플리케이션이 데이터를 레코드로 저장하는 과정에서 데이터는 특정한 모델로 다뤄진다. 예를 들어 주문 내역이라는 데이터는 애플리케이션 내에서 id, 주문 상품, 일시 등으로 속성을 지니는 하나의 클래스 모델로써 다뤄지고 DB에는 레코드로써 저장되어 조회 갱신 삭제될 수 있다.

하지만 이러한 모델들은 요구사항이 변경됨에 따라 때로는 거대해지거나 변질되기 마련인데 본 필자도 현재 엄청난 요구사항으로 인해 비즈니스 모델이 복잡하여 이 패턴을 고려하게 된 것이다.

동일한 모델로 CRUD 명령이 처리되는 애플리케이션의 아키텍처이다.

위 그림과 같이 간단한 비즈니스 모델이라면 굳이 나눌 필요 없이 하나의 모델에서 처리하는 것이 가능하다. 하지만 이것이 점점 복잡해지거나 변질된다면? 기존 데이터는 변젤된 모델을 재가공 해야 한다. 결국 모델이 변화함에 따라 실질적으로 데이터를 저장, 갱신, 삭제에 필요한 모델과 조회하여 사용하는 모델 간 차이가 발생하게 되는데 개발자들은 이를 해결하기위해 저장 갱신 삭제에 필요한 모델과 조회하여 사용하는 모델 간 차이가 발생하게 되고 이를 분리하여 관리하기 시작했다. 그렇게 탄생한 것이 CQRS 패턴이다.

명령과 모델이 분리되어 있다.

패턴이 사용되는 경우

다음 시나리오에 대해서 CQRS를 고려해야 한다.

 

  • 많은 사용자가 동일한 데이터에 병렬로 액세스하는 공동 작업 도메인입니다. CQRS를 사용하면 도메인 수준에서 병합 충돌을 최소화하기에 충분한 세분성으로 명령을 정의할 수 있으며, 발생하는 충돌은 명령에 의해 병합될 수 있습니다.
  • 특히 읽기 수가 쓰기 수보다 훨씬 큰 경우 데이터 읽기의 성능을 데이터 쓰기 성능과 별도로 미세 조정 해야 하는 시나리오이다. 이 시나리오에서는 읽기 모델을 스케일 아웃할 수 있지만 몇 개의 인스턴스에서만 쓰기 모델을 실행할 수 있다.
  • 시스템이 시간이 지나면서 진화할 것으로 예상되어 여러 버전의 모델을 포함할 수 있거나 비즈니스 규칙이 정기적으로 변하는 시나리오

이외에도 여러 시나리오가 존재하는데 https://docs.microsoft.com/ko-kr/azure/architecture/patterns/cqrs 을 참고하기 바란다.

CQRS 패턴은 어떻게 구현할까?

마틴 파울러에 의하면 CQRS가 다음과 같은 아키텍처 패턴과 방법론을 파생하거나 필요로 한다고 한다.

  • 이벤트 형태로 구현된 프로그래밍 모델
  • Event Sourcing
  • Eventual Consistency
  • Domain Driven Design

RDBMS와 NoSQL간 데이터 이동은 kafka와 MQ 같은 메시지 큐가 적용될 수 있다.

다음은 우아한 형제들에서 구현된 CQRS 패턴에 의한 아키텍처 사진이다. 명령과 조회에 대한 책임이 애플리케이션 레벨에서 분리되었다.

Reference.

https://always-kimkim.tistory.com/entry/cqrs-pattern

https://docs.microsoft.com/ko-kr/azure/architecture/patterns/cqrs

 

CQRS 패턴 알아보기

들어가며  Event Driven Architecture에 대한 경험이 있으시거나, 혹은 그것에 관심이 있으신 분이라면 종종 CQRS라는 단어를 듣게 됩니다. 저 또한 종종 들었습니다. 하지만 정확하게 CQRS가 어떤 것인지

always-kimkim.tistory.com

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함