😽

コマンド・クエリ責務分離(CQRS)について

に公開

コマンド・クエリ責務分離(CQRS)とは

コマンド クエリ責任分離 (CQRS) は、データ ストアの読み取り操作と書き込み操作を別々のデータ モデルに分離する設計パターンです。 このアプローチにより、各モデルを個別に最適化し、アプリケーションのパフォーマンス、スケーラビリティ、セキュリティを向上させることができます。

引用:https://learn.microsoft.com/ja-jp/azure/architecture/patterns/cqrs

コードをコマンド(更新系)とクエリ(参照系)に分離することで、更新系・参照系それぞれに対する別々の最適化が可能になる。

CQRSの基本的な考え方は、「データを更新する責任」と「データを取得する責任」を別々のモデルや処理を分けることにある。

DDDの課題とCQRS導入の背景

問題

DDDでは、ドメインモデルを通じて状態の変化(コマンド)と取得(クエリ)を両立させようとする。しかし実際のアプリケーションでは画面表示の要件が複雑かつ、書き込みと全く異なるデータ構造を要求されることが多い。

CQRSによる解決

  • 書き込みはドメインモデルを通す
  • 読み取りはクエリ最適化されたDTOに委ねることで非対称性を明確にできる

具体的な構造例

.
└── my_project/
    ├── domain/
    │   ├── entity
    │   └── valueobject
    ├── infra/
    │   ├── repository
    │   └── queryrepository
    ├── query/
    │   └── dto
    ├── usecase
    └── webapi
  • query
    • データを取得するだけの処理をする場合に使用
    • queryrepositoryからデータを取得し、dtoを返す
  • usecase
    • データの登録・更新などの書き込み処理をする場合に使用
    • データの整合性を担保する必要があるため、entityやvalue objectを使用する
    • repositoryを使用し、entityを返す

Discussion