はじめに
ドメイン駆動設計でモデリング〜設計〜サンプルプログラム・テストコード作成
までを一通りやってみての気づきや重要ポイントをまとめました。
今回はCQRSにフォーカスしてまとめています。
松岡さんの「サンプルコード&FAQ」「モデリング/実装ガイド」、
自分の理解をまとめた記事です。(その点お含みおきください)
CQRSとは??使い所やメリットデメリットは??
CQRSは参照と更新でモデルを分割するアーキテクチャです。
複数集約にまたがる参照を行う際、
DDDではこれらの問題があります。
- 複数集約から戻り値の型への詰め替えがごちゃごちゃして読みにくい
- 余計な値取得によるパフォーマンス劣化
- 複数集約にまたがる条件でのページングができない
集約とリポジトリに関して、
以下の記事にまとめているので必要であれば
ご覧ください。
そこで、更新モデル(ドメインオブジェクトや値オブジェクト)とは別に、
参照のユースケース専用に参照モデルを用意することで、
元々集約を跨ぐため複雑だったデータ取得がシンプルになったり、
クエリのパフォーマンスを改善できたり、
複数集約にまたがる条件でのページングができたりします。
ドメイン駆動設計でCQRSのサンプルコードとテストコード
CQRSを利用したサンプルコードを作成したので紹介します。
今回の題材は、
ユーザを指定してユーザ情報とそのユーザの支払い情報リストをセットで取得
という想定でCQRSを導入しました。(支払、ユーザの集約跨ぎで参照のイメージ)
モデリングに関して、
以下の記事にまとめているので必要であれば
ご覧ください。
ドメイン駆動設計のモデリング練習|データベーススペシャリストの過去問を題材に
CQRSのクエリサービスのサンプルコード
ユースケース層にインタフェースを作成しました。
インフラ層に具体的なDB操作を実装しました。
参照用モデルは1ユースケースに特化するのが基本で、
ドメイン知識を持たないのでドメイン層ではなくユースケース層に書き、
DBの具体的な操作に関しては、
リポジトリと同じくインフラ層に書きます。
CQRSのクエリサービスのテストコード
インフラ層のテストコードを書きました。
(が、後で本を読むとユースケースのテストコードこそ書くべきだったぽいです、、、)
ドメイン駆動設計でCQRSを導入したサンプルコードを作成してみての感想や気付き
自分の最初のドメイン駆動設計への印象だと、
性能が破綻するだろうな・・・
性能が全てのようなシステムの場合は導入すべきではないな。
と元々感じていたのですが、
ドメイン駆動設計でもCQRSを利用して性能で問題が発生しても対応できる。
ということが分かり、ドメイン駆動設計導入のハードルが自分の中で下がりました。
一方で、
なんでもかんでも参照系のユースケース用に参照モデルを作りまくったり、
(部分的に必要に応じで導入すればよい)
参照系の複数のユースケース間で無理やり参照モデルを使いまわそうと
最小公倍数的な何でも入るモデルを作るはやめましょう。
といようなことを本で述べられていましたが、
ユースケース特化でCQRSの参照モデルを作るのと、
必要な箇所のみ最低限で作る。
という使い方をすべきだと思いました。