


この記事で分かること
- Controller Service Repositoryの違い
- Controller Service Repositoryの役割
- 三層アーキテクチャについて
一番最初にぶつかる壁であり、基本的な部分でもあるので、頑張ってわかりやすく解説しますね!
結論|Controller・Service・Repositoryの違い
結論としてはそれぞれ役割が違います。
- Controller:画面やリクエストからの入力を受け取り、処理結果を返す役割
- Service:Controllerから処理を受け取り、業務処理をまとめることが多い
- Repository:主にデータの取得・保存など、データアクセスを担当する層
俗にいう「三層アーキテクチャ」と言ってシステムやアプリケーションを「見た目」「機能」「データ」の3つの構造に分けて構築する考え方になります。

同じような考え方に「MVCモデル」というのがあるんですが、こっちがフロント面に違い部分の概念に対して「三層アーキテクチャ」はバックエンド側の概念の視点になります。
「三層アーキテクチャ」のメリット
・保守性の向上
・分業作業の向上
・拡張性・独立性の向上
三層に分けることで、システムの可読性が上がり、単純に保守がしやすくなります。
また役割を分けることで複数人で同じクラスを触らなくて済む恩恵もあります。
役割が独立していることで、エラーやバグの発生した際に、原因特定がしやすいだけでなくシステムの拡張をした際の既存処理への影響も減らすことができます!
実際の処理の流れを見てみよう
実際の流れを見た方が早いと思うので早速見てみましょう!
まずはこの動きを見てください。
パッケージ構成はこんな感じです。
src
└─ main
├─ java
│ └─ com
│ └─ example
│ └─ sample
│ ├─ controller
│ │ └─ IndexController.java
│ ├─ entity
│ │ └─ User.java
│ ├─ form
│ │ └─ UserForm.java
│ ├─ repository
│ │ └─ UserRepository.java
│ ├─ service
│ │ └─ IndexService.java
│ └─ SampleApplication.java
│
└─ resources
├─ static
│ └─ css
│ └─ style.css
├─ templates
│ └─ index.html
└─ application.properties
処理の流れを説明
処理の流れを説明するとこんな感じになります!
- 登録情報の一覧表示
- 新規登録処理
主にこの二つを一連の流れでやってます。





処理が複雑になると、Service内で複数の処理を呼び出したり、複数のDBや外部APIを利用したりしますが、分解すると大体この流れが多いです。
もちろん、例外はあるので絶対ではないですが、大体これが基本になると思います。
どこに何を書けばいい?
では実際の処理の流れをデバックしながら解説します。

まずは、ユーザー登録画面から、値を入力していき、「登録ボタン」を押下します。
そうすると、入力値がコントローラーが側にバインドされます!

早速コントローラー側に値が来ているのが、画像からわかりますね!
そのまま、受け取った値をサービス側に渡していきます。

サービス側では、画面から受け取った値をDB登録用に、FormクラスからEntityクラスに詰め替えを行ってます。
そして、詰め替えたものをリポジトリに渡し、DBに登録してもらいます。
※今回リポジトリは「JPA」を使用しています!

登録が完了し、コントローラーに戻ってきました。
リターンとして、「/index」にリダイレクトします。
ここまでで、登録処理は完了です。

ここからは、登録されている一覧情報を取得し画面に出力する流れになります。
先ほど「/index」にリダイレクトしたため、コントローラー側の「@GetMapping("/index")」が記載されているメソッドの処理が動きます。
まずは、先ほど登録したユーザーも含めて登録済みのユーザーを一覧で取得します。

登録済みのユーザー一覧を実際に取得するサービス側に処理が移りました。
リポジトリ側からDBに登録済みのすべてのユーザーの情報をリストで取得します。
取得が出来たら、画面表示用のformクラスに一個一個詰め替えをしていきます。

詰め替えが完了し、先ほど登録したユーザー情報も詰め替えられているのが確認できます。

コントローラーに戻ってきました。
画面表示に必要な情報を設定し、表示用のHTMLを最後にリターンします。

画面が更新されて、登録した内容が表示されました!
ここまでが実際の処理の流れになります。
初心者が迷いやすいポイント
始めの時は、どのクラスがなんの役割を持っているのかが混乱しやすいですし、正直役割以外のところに処理を記述しても動きます。

例えば、コントローラにサービスの処理を直接書いても動きますし、コントローラーから直接リポジトリを呼び出すこともあります。
正直、割と慣れなところも結構あります(笑)
迷いやすいポイント
・とりあえずなんでもコントローラーに書いてしまう。
・同じような処理を何度も作ってしまう。
この辺はあるあるだとおもうので、なんか処理が長いなーとか、さっきも同じような処理書いたなと思ったときは、一度処理の見直しをするといいかもしれません。
ただ、お仕事をする現場のお作法ごとに作りも違うので、何が正解というのもないのが現状なんですよね。
なので、基本は職場の使い方が現状そこでの正解になります。
しかし、その判断が難しい場合は、まずはこの記事で紹介した流れをベースに自分の環境とどこが違うのか見比べてみてください!
また、他の人はどう作っているのかをまねてみるのも正解に近ずくと思います!
まとめ
今回は、Spring Bootでよく使われる「Controller・Service・Repositoryの役割の違い」について紹介しました!
最初は、
「ControllerとServiceって何が違うの?」
「Repositoryはどこで使うの?」
「結局どこに何を書けばいいの?」
と迷いやすいと思います。
ざっくり整理すると、
- Controller:画面やリクエストを受け取る
- Service:実際の処理や業務ロジックをまとめる
- Repository:データベースとのやり取りを担当する
という役割で考えると分かりやすいです。
最初から完璧にレイヤー構成を理解しようとしなくても大丈夫です。
実際にコードを書きながら、
「この処理はControllerじゃなくてServiceかな?」
「DBアクセスだからRepositoryだな」
と少しずつ分けられるようになっていけばOKです!
私自身も最初は、
「とりあえずControllerに全部書けば動くじゃん!」
くらいの感覚でした(笑)
でも、処理が増えてくると、役割ごとに分ける意味がだんだん分かってきます。
Spring Bootを勉強し始めたばかりの方は、まずは、、、
Controller → Service → Repository → DB
という基本的な流れだけでも覚えておくと、今後かなり理解しやすくなると思います!
少しでも理解が深まったらうれしいです!