Java/Spring初心者による、Spring初心者のためのブログ

エンジニア歴1年未満の初心者による学習ブログ。自分も初心者だからこそ初心者目線で書き綴っています。

【Spring初心者向け】Controller、Service、RepositoryとDispathcerServlet

今回は、Springの基本的な構造についてまとめます。

なお片仮名用語には念のため注釈をつけています。見なくても分かるよ!という方はスルーしてください。

 

 

1.はじめに

SpringMVCという名前がついていますが、実態はM・V・Cの3つだけで出来ているわけではありません 。

確かに、おおざっぱに考えるなら、Springの構造はM・V・Cの3つに分けられます。が、その3つの理解だけだと実務について行けないのも事実。

そこで、Springアプリケーションの構造を、もう少し詳しく見て行こうというのがこの記事の主旨です。

 

2.全体像

クライアントからリクエス*1が送られてきて、そのリクエストに沿った結果*2を返却するまでの、全体の処理の流れです。

通常、実務では、1つのリクエストに対して、以下のように多くの処理が行われることが普通です。

f:id:to_education:20190525160259p:plain

では、クライアントからリクエストが送られて以降の、各処理の流れの詳細を見ていきましょう。

 

3.各処理の詳細

①②事前処理、DispatcharServletの呼び出し

まずクライアントからリクエストが送られてきます。(①)

ただリクエストがすぐにControllerに行くわけではなく、

  • リクエストそのものをがっつり処理していくための、事前準備
  • リクエストに応じ、どのコントローラのメソッド*3に処理を飛ばすか選び、実際にそのコントローラを呼び出す。

ということをしています。(②)

詳しくは後日扱います。ここでは、Controllerの処理の前に、準備が行われるんだな~程度に、頭の片隅に置いておいてもらえればOKです。 

 

③④Controller⇒Serviceの呼び出し

いよいよControllerが呼び出され、メイン処理が始まります。(③)

といっても、Controller自身がメイン処理をすべて実行するのではありません。実行司令官のような役割を果たします。具体的には、Serviceという、実際に処理をしてくれるオブジェクトを呼び出します。(④)

Serviceは、基本的にとある処理の実行に特化したクラスとして実装されることが多いので、1つのControllerが複数のServiceを呼び出すこともよくあります。

 

イメージはこんなかんじ。Controllerが司令官、Serviceが実行者のような役割。

f:id:to_education:20190522232908p:plain

 

⑤⑥Serivice⇒Repositoryの呼び出しとDBアクセス

通常、Repository(リポジトリ)はDBアクセスを担う専門担当として、Serviceから呼び出されます。*4(⑤)

RepositoryはSeriviceからの呼び出しを受けて、データベースにアクセスするためのSQLを実行します。(⑥)

f:id:to_education:20190524192143p:plain

 

なお上の図にはRepository、Serviceがそれぞれ1つしか書かれていませんが、大きなプロジェクトでは基本的にどちらも複数存在しています。そのため、各Serviceが、必要なDBアクセス処理をしてくれるRepositoryを呼び出します。

f:id:to_education:20190524193320p:plain

 

⑦⑧DB⇒Repository⇒Serviceへの結果返却

ここからは、呼び出された結果を上位層に返却していく流れとなります。

先ほどとは逆の順をたどっていきます。

f:id:to_education:20190524194001p:plain

まずDBからは、SQL命令文の実行結果をRepositoryに返します。(⑦)

例えば男性会員のレコードを探してくるようSQLで求められたとすると、返される値は男性会員のデータとなります。

その後Repositoryは、DBから得た結果を、呼び出し元であるServiceに返します。(⑧) 

 

⑨Service⇒Controllerへ結果返却

Serviceは更に、Repositoryから得た結果(つまりDBアクセスの結果)や、Service自身が行った処理の結果などを、呼び出し元であるControllerに返していきます。(⑨)

f:id:to_education:20190524194639p:plain 

⑩Controller⇒DispathcerServlet

Controllerは、Serviceから受け取った結果とともに、次にクライアントに映し出すViewの名称*5の名称を、DispathcerServletに返却します。(⑩)

f:id:to_education:20190525154745p:plain

 

⑪View名解決

DispathcerServletは、Controllerから受け取ったView名称をもとに、クライアントに返すべきViewを見つけます。(⑪)

このViewがクライアントに返却され、画面に映し出されるものとなります。

f:id:to_education:20190525155208p:plain

 

⑫⑬後始末とクライアントへの結果(レスポンス)返却

さて、最初に、メイン処理とは別に、事前準備の処理を行っていたのを覚えているでしょうか。最後も最初と同様、メイン処理を全て終えた後に、後処理が行われます。(⑫)

こちらも詳細は後日別の記事で紹介します。今は、全ての処理終了後、レスポンス返却前に後処理が行われるんだな~と思っておいてください。

後処理まで無事に終了したら、リクエストに対する結果(View)が、やっとクライアントに返されます。(⑬)

 

4.さいごに

今回紹介したように、クライアントからリクエストが送られてきて、それに対するレスポンスを返却するまでには、長い道のりをたどります。

それぞれの処理の詳細は、順次、記事にしていく予定です。

*1:リクエスト:このページが見たい、「送信」ボタンを押したい等の、ユーザーの要望だと考えてください

*2:結果(レスポンス):次のページを表示する、送信完了の文字を出す等、ユーザーの要望に対する対応の結果だと考えてください

*3:メソッド:プログラムが行う処理内容

*4:

Repository(リポジトリ)とは、データベースにアクセスするときに呼び出されるものですが、RepositoryはDBアクセスの必要条件ではありません。


旧来のアプリケーションではRepositoryが存在せず、Serviceが直接データベースにアクセスする役割も担っていました。

ただそれだと、Serviceの役割が大きすぎて負荷がかかってしまいます。 

負荷を分散させるために、Seriviceを2つに分けて、
・DBアクセス以外の色んな処理を行うパート
・DBアクセスを行うパートを呼び出す処理も行う(現在Serviceと呼ばれている部分)
DBアクセスを行うパート(Repository)

という2つのパートが存在しているわけです。

*5:View名:厳密には色々ありますが、ここでは画面のことだと思ってください。例えばもともと次のページを開きたいというリクエストがあったなら、次のページの画面の名称(例:gamen01)などです