팁 (조언)
이 콘텐츠는 .NET Docs 또는 오프라인으로 읽을 수 있는 다운로드 가능한 무료 PDF로 제공되는 컨테이너화된 .NET 애플리케이션용 .NET 마이크로 서비스 아키텍처인 eBook에서 발췌한 내용입니다.
CQRS는 데이터를 읽고 쓰기 위한 모델을 구분하는 아키텍처 패턴입니다. 관련 용어 CQS(명령 쿼리 분리) 는 원래 Bertrand Meyer가 그의 저서 Object-Oriented Software Construction에서 정의했습니다. 기본 개념은 시스템의 작업을 두 개의 명확하게 구분된 범주로 나눌 수 있다는 것입니다.
쿼리. 이러한 쿼리는 결과를 반환하고 시스템의 상태를 변경하지 않으며 부작용이 없습니다.
명령어 이러한 명령은 시스템의 상태를 변경합니다.
CQS는 간단한 개념입니다. 쿼리 또는 명령인 동일한 개체 내의 메서드에 관한 것입니다. 각 메서드는 상태를 반환하거나 상태를 변경하지만 둘 다 반환하지는 않습니다. 단일 리포지토리 패턴 개체도 CQS를 준수할 수 있습니다. CQS는 CQRS의 기본 원칙으로 간주될 수 있습니다.
CQRS(명령 및 쿼리 책임 분리) 는 Greg Young에 의해 도입되었으며 우디 다한과 다른 사람들이 강력하게 홍보했습니다. CQS 원칙을 기반으로 하지만 더 자세히 설명합니다. 명령 및 이벤트와 비동기 메시지를 기반으로 하는 패턴으로 간주될 수 있습니다. 대부분의 경우 CQRS는 쓰기(업데이트)와는 다른 읽기(쿼리)용 물리적 데이터베이스를 갖는 것과 같은 고급 시나리오와 관련이 있습니다. 또한 더욱 진화된 CQRS 시스템은 업데이트 데이터베이스에 대한Event-Sourcing(ES) 를 구현할 수 있으므로 현재 상태 데이터를 저장하는 대신 도메인 모델에만 이벤트를 저장합니다. 그러나 이 방법은 이 가이드에서 사용되지 않습니다. 이 가이드에서는 명령에서 쿼리를 분리하는 것으로 구성된 가장 간단한 CQRS 방법을 사용합니다.
CQRS의 분리 측면은 한 계층의 쿼리 작업과 다른 계층의 명령을 그룹화하여 수행됩니다. 각 계층에는 고유한 데이터 모델(모델이 반드시 다른 데이터베이스는 아님)이 있으며 패턴과 기술의 자체 조합을 사용하여 빌드됩니다. 더 중요한 것은 이 가이드에 사용된 예제(마이크로 서비스 순서 지정)와 같이 두 계층이 동일한 계층 또는 마이크로 서비스 내에 있을 수 있습니다. 또는 서로 다른 마이크로 서비스 또는 프로세스에서 구현하여 서로에 영향을 주지 않고 별도로 최적화하고 스케일 아웃할 수 있습니다.
CQRS는 다른 컨텍스트에 하나의 개체가 있는 읽기/쓰기 작업에 대해 두 개의 개체를 갖는 것을 의미합니다. 비정규화된 읽기 데이터베이스가 있어야 하는 이유가 있으며, 고급 CQRS 문헌에서 알아볼 수 있습니다. 그러나 여기서는 집계와 같은 DDD 패턴의 제약 조건으로 쿼리를 제한하는 대신 쿼리에 더 많은 유연성을 제공하는 것이 목표인 이 방법을 사용하지 않습니다.
이러한 종류의 서비스의 예로는 eShopOnContainers 참조 애플리케이션의 주문 마이크로서비스가 있습니다. 이 서비스는 간소화된 CQRS 접근 방식을 기반으로 마이크로 서비스를 구현합니다. 그림 7-2와 같이 단일 데이터 원본 또는 데이터베이스를 사용하지만 두 개의 논리 모델과 트랜잭션 도메인에 대한 DDD 패턴을 사용합니다.
그림 7-2. 간소화된 CQRS 및 DDD 기반 마이크로 서비스
논리적 "순서 지정" 마이크로 서비스에는 동일한 Docker 호스트일 수 있지만 그렇지 않아도 되는 Ordering 데이터베이스가 포함됩니다. 동일한 Docker 호스트에 데이터베이스를 두는 것은 개발에 좋지만 프로덕션에는 적합하지 않습니다.
애플리케이션 계층은 Web API 자체일 수 있습니다. 여기서 중요한 디자인 측면은 마이크로 서비스가 CQRS 패턴에 따라 명령, 도메인 모델 및 트랜잭션에서 쿼리 및 ViewModels(특히 클라이언트 애플리케이션용으로 만든 데이터 모델)를 분할했다는 것입니다. 이 방법은 이후 섹션에서 설명한 대로 트랜잭션 및 업데이트에만 적합한 DDD 패턴에서 오는 제한 및 제약 조건과 독립적으로 쿼리를 유지합니다.
추가 리소스
- 그렉 영. 이벤트 원본 시스템에서 버전 관리 (온라인 전자책을 무료로 읽을 수 있음)
https://leanpub.com/esversioning/read
.NET