😽
コマンド・クエリ責務分離(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