DDD のリポジトリ記事を追加しました
DDD における リポジトリ(Repository) について、基本的な役割を整理した解説ドキュメントと、Kotlin での実装例をまとめたドキュメントを追加しました。
リポジトリは、ドメインオブジェクトを保存したり、再び取り出したりするための窓口です。
ドメインモデルを DB や SQL の都合から切り離すうえで重要な部品ですが、DAO との違いや、どこまで検索処理を持たせるべきかで迷いやすい部分でもあります。
これまでの DDD 関連ドキュメントでは、値オブジェクト、エンティティ、ドメインサービスを中心に整理してきました。
一方で、ドメインサービスの記事の中では UserRepository や PartyRepository のようなリポジトリが登場しています。
そのため、先に「リポジトリとは何か」を独立した記事として整理しておくと、今後の集約やアプリケーションサービスの記事にもつなげやすいと考えました。
今回の記事では、リポジトリを単なる DB アクセス部品としてではなく、ドメインオブジェクトを取得・保存するためのインターフェース として扱う考え方をまとめています。
リポジトリの解説記事では、主に次の内容を扱っています。
- リポジトリとは何か
- なぜドメイン層と永続化の詳細を分けるのか
- DAO とリポジトリの違い
- DB レコードではなくドメインオブジェクトを返す理由
- 何でも検索できるクラスにしないための注意点
- リポジトリを集約ルート単位で扱う考え方
Kotlin での具体的なコード例は、実装例ドキュメントとして分けています。
特に、Repository を findByXxx が増え続ける便利な検索クラスにしないこと、更新に必要な取得と画面表示のための検索を分けて考えることを意識して書いています。
DDD の基本要素から順番に読む場合は、先に エンティティ と 値オブジェクト を読むと理解しやすいと思います。
そのうえで、ドメインオブジェクトを保存・取得する必要が出てきたときに、今回の リポジトリ の記事を読み、実装の形を確認したくなったら Kotlinでのリポジトリ実装例 に進む流れを想定しています。
また、リポジトリは今後まとめる予定の 集約 とも関係が深い概念です。
今回の記事では集約については軽く触れるだけにし、リポジトリを集約ルート単位で扱う理由は別の記事で改めて整理する予定です。
今後について
Section titled “今後について”リポジトリの記事を追加したことで、DDD の基本的な部品として、値オブジェクト、エンティティ、ドメインサービス、リポジトリまでを一通り確認できるようになりました。
次は、これらのドメインオブジェクトをどの範囲でまとめるかを考える 集約 について整理していく予定です。
また、読み取り処理と更新処理を分ける考え方である CQRS についても、リポジトリとは別のテーマとして今後まとめていきます。