第4章 初めてのSpringアプリケーション

4.2 HelloWorldアプリケーションの説明

4.1で作成したアプリケーションをもとに、Springの処理が実際どのような流れで動作しているのかを説明していきます。

4.2.1 ブラウザに結果が返されるまで

図4.2-1でブラウザからリクエストを受け、メッセージがブラウザに返されるまでの流れを示します。


図 4.2 1:メッセージ表示処理までのフロー

1

ブラウザから「http://localhost:8080/hello」へのリクエストを受ける。HTTPリクエストとして(プロジェクト作成時に自動で組み込まれている)Webサーバーに渡り、Webサーバーは対応するサーブレットとしてSpringの「SpringBasicApplication」(プロジェクト名によってクラス名は異なる)に処理を依頼する。

2

SpringBasicApplicationは、@RestControllerアノテーションが記述されている全てのクラスを参照し、リクエストされたURL「/hello」に対応するメソッドを@GetMappingアノテーションをもとに探す。以下の定義が見つかるため、対応するメソッドが「helloWorld」であることが分かる。

  @GetMapping("/hello")
  public String helloWorld() {
    …
  }
  
3

リクエストされたURLに対応する「helloWorld」メソッドを実行し、文字列を返す。

4

3で返された文字列がブラウザに返される。

以上がHelloWorldアプリケーションを実行した時の流れになります。

4.2.2 SpringBasicApplicationクラス

Eclipseで作成したSpringスタータープロジェクトには、Javaのソースコードファイルが1つ、最初から用意されています。STSのパッケージエクスプローラーから、「src/main/java」フォルダを展開してみましょう。
その中に「jp.co.f1.spring」パッケージがあり、更にその中に「SpringBasicApplication.java」というソースコードファイルが用意されているのがわかります。

【ファイル名:SpringBasicApplication.java】
  package jp.co.f1.spring;

  import org.springframework.boot.SpringApplication;
  import org.springframework.boot.autoconfigure.SpringBootApplication;

  @SpringBootApplication
  public class SpringBasicApplication {

    public static void main(String[] args) {
      SpringApplication.run(SpringBasicApplication.class, args);
    }
  }
  

よく見ると、一般的なクラスであることがわかるかと思います。特にクラスを継承しているわけでもなく、mainメソッドが1つあるだけのシンプルなソースコードです。が、アノテーションのおかげで、少し違うものに見えますね。

以下、説明を行っていきます。

  @SpringBootApplication
  public class SpringBasicApplication {
    …
  }
  

6行目に付いている「@SpringBootApplication」というアノテーションは、このクラスがSpring Bootのアプリケーションクラスであることを示します。
詳細は、もう少しSpring Bootについて理解しないと説明しづらいのですが、Spring Bootでは、設定ファイルなどを用意する代わりに、アノテーションを記述しておくだけで、プログラムで利用するコンポーネントをすべて自動的に読み込んで使えるようにする機能が用意されています。

@SpringBootApplicationは、その機能を利用しています。このアノテーションを付けておくことで、Spring Bootは、ほかに設定ファイルなどを一切書かなくとも、「SpringBasicApplicationというクラスがSpring Bootで起動する」ということを知ることができるのです。

mainメソッドで実行しているのは、1文だけのごく単純なものです。
「SpringApplication」というクラスの「run」メソッドを実行する処理です。

  public static void main(String[] args) {
    SpringApplication.run(SpringBasicApplication.class, args);
  }
  

このSpringApplicationクラスは、文字通りSpring Bootのアプリケーションクラスです。
このクラスに、Spring Bootアプリケーションとしての基本的な機能がまとめられています。ここで実行している「run」は、アプリケーションを起動するためのメソッドです。
引数には、実行するクラスのClassインスタンスと、パラメータとして渡すデータを用意します。ここでは、SpringBasicApplicationクラスをそのまま起動するクラスとして設定し、呼び出しています。

■まとめ

SpringBasicApplicationには、@SpringBootApplicationアノテーションが付いているほかは、何もSpring Bootのアプリケーションらしいものはありません。このようなクラスを引数に指定した時は、Spring Bootはデフォルトの設定をそのまま使ってアプリケーションを実行します。

より本格的にSpring Bootを使いこなすようになると、さまざまな設定情報を記述したクラスを定義してSpringApplication.runの引数に指定するようになるでしょう。が、今のところは、とりあえず「@SpringBootApplicationアノテーションをつけたクラスをそのまま引数指定すればいい」と考えておきましょう。

4.2.3 コントローラーとWebページ

4.2.2でアプリケーションクラスについてはわかりました。このクラスが用意されていることで、プロジェクトがアプリケーションとして起動できるようになっていたのですね。
が、これだけでは実際にブラウザからアクセスしてもエラーになってしまいます。これは、アプリケーションは用意されていても、実際に表示するページが存在しないからです。

Spring Bootでは、Webアプリケーションは「MVCアーキテクチャー」と呼ばれる考え方に基づいて設計されます。既に触れましたが、アプリケーションを「Model」「View」「Controller」という役割に分けて構築していく考え方です。

これらの中で、最初に用意しなければならないのが「コントローラー」(Controller)でしょう。コントローラーは、アプリケーションの制御を担当します。この「アプリケーションの制御」とは、具体的には「特定のアドレスにアクセスした時に実行される処理」を意味します。

Spring Bootには、「URLマッピング」と呼ばれる機能が内蔵されています。特定のURLと処理を関連付ける機能です。これにより、あるURLにアクセスすると、コントローラーに用意されているメソッドが呼び出されるような仕組みを作ることができます。
つまり、コントローラーを作れば、そこに用意してあるメソッドに割り当てられたURLにアクセスした時の処理が用意できる(つまり、そのアドレスにアクセスできるようになる)というわけです。

4.2.4 HelloControllerクラス

先ほど作成したHelloControllerクラスも、特殊なクラスを継承したり実装したりしているわけでもない、ごくシンプルなクラスです。ただし、アプリケーションのクラスと同様、専用のアノテーションが付けられています。
クラスに用意されているのは、6行目の「@RestController」というアノテーションです。
このアノテーションは、文字通りこのクラスが「RestController」であることを示します。

【ファイル名:HelloController.java】
  package jp.co.f1.spring.helloworld;

  import org.springframework.web.bind.annotation.RestController;
  import org.springframework.web.bind.annotation.GetMapping;

  @RestController
  public class HelloController {

    // 「/hello」へアクセスがあった場合
    @GetMapping("/hello")
    public String helloWorld() {
      // 文字列を返す
      return "Hello Spring-Boot World!!";
    }

  }
  

RestControllerが出力するページは、Webアプリケーションの一般的なページ(HTMLのソースコードを送信するページ)に比べると、シンプルです。RESTのサービスは、たいていはHTMLを使わず、ただの文字列として情報を送信するだけですので、HTMLベースのWebページより簡単に作成できます。

まずは、このRestControllerクラスを例にして、コントローラー利用の基本を覚えていくことにしましょう。

このクラスには、「helloWorld」というメソッドが1つだけ用意されています。そして「@GetMapping」というアノテーションで10行目に以下のように記述されています。

  // 「/hello」へアクセスがあった場合
  @GetMapping("/hello")
  public String helloWorld() {
    …
  }
  

「リクエストマッピング」は、既に簡単に触れましたが、サーバーが受け付けるURLと処理を関連付ける(マッピング)仕組みです。用意されるメソッドごとに「これは○○というアドレス用」という具合に関連付けを用意し、サーバーにアクセスがあったら、そのアドレスに割り当てられているメソッドが自動的に呼び出され、実行されるようにします。

このリクエストマッピングの設定を行うのが、@GetMappingや@PostMappingアノテーションです。引数に指定したアドレスにアクセスがあると、アノテーションが付けられているメソッドが自動的に実行されます。 サンプルでは、(“/hello”)と引数が指定してありますね。これにより、”/hello”というアドレス(ここでは、http://localhost:8080/hello)にアクセスがあると、このhelloWorldメソッドが実行されるようになっていた、というわけです。

■まとめ

1 @RestControllerアノテーションを付けたクラスはRestControllerとして利用される。
2 @GetMappingアノテーションの引数と同じURLにアクセスがあった場合、そのメソッドが実行される。

上記設定を行うことで、アプリケーションクラスがコントローラーを参照し、リクエストに合った各メソッドを呼び分けることができるようになります。
Springを利用する上で最も重要になる部分なため、各設定方法は確実に覚えておいてください。

NEXT>> 4.3 簡易ログインアプリケーション作成(@RequestParam版)