リポジトリとは?
はじめに
コミュニティ参加者の方から質問があったリポジトリについて書いていきます。
今回はリポジトリ層に対する認識があっているのかを知りたい
という意見から会話が始まりました。
普段使っているものでも人によって認識がズレていることがありますが、今回はその共有ができました。
目次
- リポジトリ層とは
- CRUD 機能
- リポジトリとリポジトリ層
- インフラストラクチャ層
- まとめ
1. リポジトリとは
「リポジトリ」と言ってもいろんなリポジトリがある
- Git リポジトリ
- アーキテクチャ
- ディレクトリ構造
[議論内容]
リポジトリ層の責務とは?
-
CRUD 機能の部分をリポジトリが行っている
-
「モデルを操作している」は違和感ある。モデルに対して何かするのがリポジトリ層
-
そもそもリポジトリとリポジトリ層の違いって何?
→ リポジトリ層は、ディレクトリ構造
-
アーキテクチャが変わったとして、Model って役割は変わる? = 変わらないので責務は決まっている
→ リポジトリ層は状況によって Model と混合されるし、使わなくてもできる
-
インフラストラクチャ層の中にリポジトリ層が組み込まれている
-
インフラストラクチャ層って何?
→ 外部接続を担うところ
2. CRUD 機能
CRUD機能とは、ほぼ全てのソフトウェアが有する4つの永続的な基本機能の頭文字をそれぞれ並べた用語のことをいう。
その4つの機能とは、Create(生成)、Read(読み取り)、Update(更新)、Delete(削除)を指す。
-
Model ってデータがあるが、アプリ内部・アプリ外部にあった時に操作できるのか?
→ 内部ならできる。外部ならできない = リポジトリ層は Model だと一概には言えない
-
リポジトリ層は外部とのインターフェースを担っているが、その相手は気にしなくてもいいのでは?
→ READ, DELETE 等の管理はしていない
リポジトリ層はドメイン駆動開発でやっていると出てくる考え
API が複数絡むことがありそうな時に、API との接続先を繋ぐもの = リポジトリ層
3. リポジトリとリポジトリ層
「リポジトリ」とは
Serviceに対して、Entityのライフサイクルを制御するための操作(Repositoryインタフェース)を提供する。
Entity のライフサイクルを制御するための操作は、Entity オブジェクトへの CRUD 操作となる。
Entityを永続化する処理(Repositoryインタフェースの実装クラス)を提供する。
> TERASOLUNA Server Framework for Java/3.2.4.1.Repository の役割
「リポジトリ層」とは
ドメイン駆動開発で出てくる概念の 1 つ
一般的に「リポジトリ」とはデータの「保管庫」を表します。ソースコードリポジトリであれば Git や Apache Subversion が有名ですが、DDD におけるリポジトリは、
エンティティや値 オブジェクトから構成される集約の格納と取得を担当します。リポジトリは、クライアントへ集約を提供し、背後のデータベースとのやり取りを隠ぺいします。
外部とのインターフェース(接続部分)を担っている
CRUD 機能自体を持つわけではなく接続先の管理がされている
例) VM と DB・API の接続において、インターフェースとしてリポジトリ層がある場合
DB の変更や API の仕様変更などがあったときに、リポジトリの向き先を変えるだけで他への影響を気にせずに対応可能となる
4. インフラストラクチャ層
「インフラストラクチャ層」とは?
ドメイン層(Repository インタフェース)の実装を提供する
データストア(RDBMS や、NoSQL などのデータを格納する場所)への永続化や、メッセージの送信などを担う
外部との接続そのものを行う
実際に CURD 処理操作を行っているところ
5. まとめ
- 外部との接続を行うとき、インターフェース(接続部分)としてのリポジトリ層があることによって接続先の管理が行える
- リポジトリ層とは複数の API を使用する際、仕様に変更に柔軟に対応できるように調整する役割を担っている
- CRUD 操作自体はインフラストラクチャ層で行われる
Discussion