こんにちは。ステックアップアカデミー講師のかびらです。現役のITエンジニアであり、かつAFP保持者として、このチャンネルを通して、ITエンジニアとフリーランスに必要な、ITとお金に関する情報を配信しています。
前回に引き続き、本日も「誰もが一度はつまずく、Spring Bootを解説」シリーズの第3回目をお届けします。このシリーズでは、私も含め誰もが共通してつまずきやすいポイントを、Javaのスキルや経験が浅い若手エンジニアでも簡単に理解できるよう、極力難しい用語を使わずに解説しています。今回のテーマは、Spring Bootでよく使用される「アノテーション」です。アノテーションは種類が豊富にあるため、このテーマはいくつかのパートに分けて詳しく解説していきます。今回はアノテーション編のパート1です。
コントローラーアノテーション
はじめに、@Controllerアノテーションとそれに関連するアノテーションについて解説します。前回の記事でも触れたように、Springフレームワークの目指すプログラム構成を理解することは、@Controllerアノテーションの理解に大変重要です。詳細な説明は今回は省きますが、より深く理解したい方は前回の記事をご参照いただければと思います。ここではその概要を簡単におさらいします。
Springフレームワークのプログラム構成は主に4つの層に分けられます。それらはプレゼン層、アプリ層、ドメイン層、そしてインフラ層の4つです。各層はそれぞれ特定の役割を持っています。簡単に説明すると、プレゼン層はUIを提供し、アプリ層はビジネスロジックを呼び出し、ドメイン層はビジネスロジック自体を実装し、インフラ層はデータベースやファイルへのアクセスを担当します。そして、それぞれの層には、対応するアノテーションが存在します。これら対応するアノテーションについては、前回の記事で紹介しました。本章で説明するのは、アプリ層に位置する@Controllerアノテーションについてです。
@Controllerアノテーション
@Controllerアノテーションの役割について説明します。@Controllerアノテーションは、クラスに付与することで利用できます。このアノテーションは上述した通り、アプリ層に位置し、適切なビジネスロジックを呼び出すことが主な役割となります。以下に、より具体的な動作を説明します。
- @Controllerアノテーションを付与したクラスはまず、クライアントから送られてきたリクエストを受け取ります。
- 次に、その受け取ったリクエストに基づき、適切なビジネスロジックを呼び出します。
- 最後に、ビジネスロジックから得られた結果をレスポンスデータとしてクライアントに返却します。
これが@Controllerアノテーションを用いたクラスの基本的な役割となります。
@RequestMappingアノテーション
つづいて、@Controllerアノテーションと密接に関連しているもう一つの重要なアノテーション、@RequestMappingアノテーションについて説明します。@RequestMappingアノテーションは、コントローラークラス内のメソッドに付与します。@RequestMappingアノテーションが付与されたメソッドは、その指定値に基づき、特定のHTTPリクエストのURLとメソッドをマッピングすることができます。具体例として、「http://localhost:8080/Controller/」というURLに対するリクエストがあると、エンドポイントに「/Controller」が指定されている「mainMethod1」メソッドが呼び出されます。
@GetMappingアノテーション/@PostMappingアノテーション
@RequestMappingアノテーションは非常に便利ですが、実はより簡潔に記述する方法があります。たとえば、@RequestMappingアノテーションを使用してGETメソッドを実現する際には、引数のmethod属性でGETを明示的に指定します。しかし、このような場合には@GetMappingアノテーションを使用することで、より簡潔に記述できます。書き方としては、@GetMappingアノテーションの引数にエンドポイントを指定するだけです。同様に、POSTメソッドの処理を簡潔に記述するためには、@PostMappingアノテーションが用意されています。その使用方法は@GetMappingアノテーションと全く同じです。
@Autowiredアノテーション
つぎに、@Autowiredアノテーションについて説明しましょう。@Autowiredアノテーションは、クラスのメンバ変数に付与します。これは、@Componentアノテーション、@Serviceアノテーション、@RepositoryアノテーションなどのアノテーションでBean化されたクラスを他のクラスに注入するために使用されます。このアノテーションにより注入されたクラスは、その後のメソッド内で自由に使用できます。
レストコントローラーアノテーション
次に、レストコントローラーアノテーションについて解説します。プログラム構成のイメージを再度見てみましょう。この章では、アプリ層に位置する@RestControllerアノテーションについて解説します。
@RestControllerアノテーション
@RestControllerアノテーションは@Controllerアノテーションと同様に、クラスに付与することで利用できます。大まかに見ると、@RestControllerアノテーションは@Controllerアノテーションとほぼ同じ役割を果たします。しかし、細部に目を向けるといくつか違いが見られます。ここでは、その違いについて解説します。
@ControllerアノテーションRestControllerアノテーションの違い
まず、@Controllerアノテーションと@RestControllerアノテーションを比較しながら、それぞれの違いを見ていきましょう。@Controllerアノテーションの主な役割は、「主にHTMLページなどのビューを生成する」ことです。一方、@RestControllerアノテーションは、「HTTPレスポンスのボディとしてデータを返す」ことです。
次に、それぞれの役割を詳しくイメージで説明します。@Controllerアノテーションは、クライアントからのリクエストを受け取ると、HTMLを作成する要素であるモデルを生成します。モデルには、特定のHTMLを作るために必要なデータが格納されます。その後、このモデルをHTMLを作る役割を果たすビュー(Template)に引き渡します。ビューのTemplate側では、引き渡されたモデルの情報を元にHTMLを作成し、それをクライアントに返却します。このような一連の処理が@Controllerアノテーションを使った処理フローです。Spring Bootでは、一般的にテンプレートとしてThymeleafと呼ばれるツールが使われます。
一方、@RestControllerアノテーションは、クライアントからのリクエストを受け取ると、そのままクライアントに返すデータを生成し、それを直接返却します。@Controllerアノテーションとの主な違いは、@Controllerアノテーションでは一度モデルを作成し、ビューでHTMLを作った後にクライアントに返却するのに対し、@RestControllerアノテーションは、レスポンスデータを生成し、それをそのまま返却するという点です。
@Controllerアノテーションの処理フロー
それでは、各アノテーションの処理フローを、実際のコード例と共に詳しく見ていきましょう。まずは@Controllerアノテーションの処理フローからです。
@Controllerアノテーションはクライアントからのリクエストを受け取り、適切なビジネスロジックを呼び出し、ビュー(Template)に引き渡すためのモデルを生成します。このコード例では、モデルに”message”というキーで、textの値を設定しています。そして、生成したモデルとビューの名前を一緒に返却します。
生成されたモデルは、ビューのTemplateに引き渡され、HTMLのTemplateに書かれたコードに基づいてモデルのデータがHTMLに埋め込まれます。このコード例では、@Controllerアノテーションのモデルで設定した”message”というキーを指定し、その値をHTMLのTemplateに埋め込んでいます。
以上の処理により完成したHTMLは、ビューからクライアントに返却されます。これが@Controllerアノテーションを用いた処理フローの概要です。
@RestControllerアノテーションの処理フロー
つぎに、@RestControllerアノテーションの処理フローを見ていきましょう。
クライアントからのリクエストを受け取った@RestControllerアノテーションは、適切なビジネスロジックを呼び出し、その結果をレスポンスデータとして生成します。そして、そのデータをクライアントに直接返却します。このコード例から、@Controllerアノテーションと異なり、モデルを生成せずに直接データを返却していることがわかります。
@RestControllerアノテーションでは、HTMLを生成するビューを介さずに、直接レスポンスデータを生成し、返却することが可能です。@RestControllerアノテーションが使われる典型的な用途としては、レスポンスデータとして、JSONやXMLなどの形式でデータを返却したい場合に利用されます。
@ResponseBodyアノテーション
ここまで、@Controllerアノテーションと@RestControllerアノテーションの違いを詳しく見てきました。しかし、実は、@Controllerアノテーションクラスに@ResponseBodyアノテーションを付与することで、@RestControllerアノテーションと同じ動作をさせることも可能です。もちろん、@Controllerアノテーションと@ResponseBodyアノテーションを2つ指定するよりも、@RestControllerアノテーション1つを指定した方がシンプルです。しかし、この事実は一つの知識として覚えておくと良いでしょう。
さいごに
今回の記事はここまでです。Spring Bootを使用し始めたものの、多くのアノテーションが理解しきれずに困っている方々の参考になったことと思います。今回説明できなかったアノテーションについては、次回の記事で解説予定です。一緒に学び進めていきましょう。今回もまた一つ賢くなりましたね!次回の記事もぜひご覧ください。お読みいただき、ありがとうございました!
ページ中央より少し下の「@Controllerアノテーションの処理フロー」の
イメージタイトルが”レストコントローラーアノテーション”になっています。
内容的にここは”レスト”は要らないっぽい?
ご指摘ありがとうございます!
話の流れ的にレストコントローラの説明の中で登場しているので、レストコントローラにしているものだと思います。
(作ったのが結構前なので正確には覚えておらず…すみません…)
いずれ改訂版を作ろうかと検討していますので、構成も含めてその件も見直そうと思います…!
ありがとうございました!