Open4
CQRSを理解する

CQRSとは
CQRS(Command Query Responsibility Segregation)とは、 書き込み操作(コマンド)と読み取り操作(クエリ)の責務を分離します。これにより、それぞれのユースケースに最適な設計や最適化が可能となり、パフォーマンスとスケーラビリティが向上します。

Command + Handler(Query + Handler)の組み合わせにより、UseCaseごとの処理を定義する。
-
Command
- ユーザーの意図を表すオブジェクト ex.
CreateUserCommand
,UpdateUserCoomand
- ユーザーの意図を表すオブジェクト ex.
-
Command Handler
- 特定のCommandを受け取り、ビジネスロジックを実行
- 入力の検証、必要なDomainの取得などもこの中で行う
-
Query
- データを取得するためのシンプルなリクエスト
-
Query Handler / Query Service
- 特定のQueryを受け取り、データを取得
- 厳密なDomain Modelの再構築は必須ではない
- Projection(射影)を積極的に利用

ここまでの理解
-
Query はクライアントからのリクエストに合わせて、集約やジョインを行いながら、直接的にDBからデータを取得する
→ GraphQLのQueryにかなり近い責務を担う -
Commandは、適切なドメインモデリングを行いながら厳密な設計が必要
→ DDDの思想に寄る

Prisma x Zodを用いたアーキテクチャを考える場合、スキーマの定義をZodに寄せて、PrismaはDBへの保存のみを行うようにする。
Prismaのスキーマはそれはそれで最大限活用させていただきたいので、@default(uuid())
や@default(now())
、@updatedAt
はそのまま使いたい。
論点
- Zodで定義したスキーマとPrismaで自動生成する値の競合が起きないか
ex. Productはid,name, updatedAtを有するが、idとupdatedAtはPrismaで自動挿入したい