Repository
Repositoryは、ドメインオブジェクトの集合のようなインターフェースで、ドメインモデルとデータマッピングの間を仲介します。単にSQLやORMを別クラスへ移しただけのものではありません。
採用する場面
- 永続化の詳細から独立させたい複雑なドメインモデルや集約がある
- 同じドメインオブジェクトの取得条件や保存規則が複数箇所で重複する
- 保存前後に守る不変条件やtransaction境界がある
- 利用側がテーブルや外部ストレージではなく、ドメインの概念として対象を扱う
単純なCRUD、画面表示用の読み取り、集計、検索は、ORMや専用クエリを直接使う方が明確なことがあります。すべてのテーブルに機械的なRepositoryを作りません。
実装方針
- Repositoryの単位はテーブルではなく、整合性を守るドメイン上のまとまりで決める
- メソッド名は汎用CRUDへ固定せず、利用側が必要とする意図を表す
- ORMの行、query builder、外部SDKの型をRepositoryの外へ漏らさない
- 画面用DTOや分析クエリを、更新用Repositoryへ無制限に追加しない
- 同時更新を扱う場合は、version、条件付き更新、transactionなどの競合方針を明示する
テスト容易性だけを理由にRepositoryを追加しません。I/O境界を差し替える必要がある場合は、まず利用側が必要とする最小の契約を確認します。