このページでは、インテグレーション層(特にデータ層)の実装であるリポジトリーをSpringBootを使ってコーディングする方法を説明します。
リポジトリーの役割
リポジトリーの本来の役割はオブジェクトを保存したり取り出したりすることです。多くの開発プロジェクトでは保存先はMySQLなどのデータベースを利用します。そのため、一般的にリポジトリーと言えば、データベース操作をテーブルごとにまとめる役割を果たします。
リポジトリーの処理の流れは基本的にこのようになります。
# | 処理 |
1 | サービスから値を受け取る(呼び出される) |
2 | SQLを実行する |
3 | SQLの結果をサービスに返す |
リポジトリー層というと、いわゆるSpringBootの@Repositoryを想起してしまいますが、本来インテグレーション層というのは、外部リソースと接続するための層です。
そのため、DB接続のためのリポジトリー以外にも、主に外部APIやAWSとの接続はこの層に部品として配置します。
例えば、
HogeAPIと連携する場合は、HogeAccessorインターフェースを、
AWSのS3と接続する場合は、S3Accessorインターフェースを作る、
というのがよく見られます。
リポジトリー/Daoの作成単位
リポジトリーやDaoはテーブル単位で作ります。
リポジトリーはDBを表現する層なので、DB構成=カラム構成を元に作られるべきだからです。
サービス単位では作らないようにしてください。
サービス単位に作ってしまうと、Aaaというテーブルが、どこから読み書きされているかGrepして検索しないといけなくなり、非常に面倒です。
リポジトリー単位に作っていると、Aaaというテーブルの読み書きは
・AaaRepository
・AaaDao
に集約されているため、AaaDaoのメソッドの呼び出し元を辿れば、Aaaテーブルへの読み書きをしている箇所がすぐにわかります。
このことは当たり前のことなのですが、保守しやすさに非常に影響しますので、リポジトリーやDaoはテーブル単位で作るということをしっかり守ってください。
Accessorの作成単位
外部APIへの接続部品であるAccessorは、外部API単位で作ります。
HogeというAPIに、
・/foo
・/bar
という複数のエンドポイントがある場合も、
HogeAccessorというインターフェースを作成し、同一インターフェースの中に/fooを呼ぶメソッド、/barを呼ぶメソッドを定義します。