Open4

CQRSを理解する

マッケイマッケイ

CQRSとは

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


CQRS実践入門 [ドメイン駆動設計 ]

マッケイマッケイ

Command + Handler(Query + Handler)の組み合わせにより、UseCaseごとの処理を定義する。

  • Command

    • ユーザーの意図を表すオブジェクト ex. CreateUserCommand, UpdateUserCoomand
  • 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で自動挿入したい