Skip to main content

Springプロジェクト作成とHello World

この章では、Spring Bootで実際にプロジェクトを作成し、ブラウザに「Hello World」を表示するまでの手順を学ぶ。 Springアプリがどのような構成になっているのか、最初に大まかな全体像を掴むことが目的である。

学習のゴール

  • Spring Initializrを使ってSpring Bootプロジェクトを作成できる
  • プロジェクトの基本的なディレクトリ構成を説明できる
  • @SpringBootApplication の役割を理解できる
  • pom.xml の基本的な役割を理解できる
  • コントローラを作成してブラウザに文字列を表示できる
  • @Controller@ResponseBody の違いを理解できる
  • Thymeleafテンプレートを使って画面を表示できる

Spring Initializrでのプロジェクト作成

Spring Bootプロジェクトは Spring Initializr(spring.io のサービス)という公式ウェブサービスを使って簡単に作成できる。 以下の設定で新しいプロジェクトを生成する。

項目設定値
ProjectMaven
LanguageJava
Spring Boot3.x.x(最新の安定版)
Groupcom.example
Artifactdemo
PackagingJar
Java21

依存関係(Dependencies) に以下を追加する。

  • Spring Web — HTTPリクエストの処理(必須)
  • Thymeleaf — HTMLテンプレートエンジン
  • Spring Boot DevTools — ファイル変更時の自動再起動(開発用)

「GENERATE」ボタンを押すと demo.zip がダウンロードされるので、解凍してIDEで開く。


プロジェクトの構成

Spring Initializrで生成したプロジェクトの構成を確認する。

demo/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/example/demo/
│ │ │ └── DemoApplication.java ← エントリポイント
│ │ └── resources/
│ │ ├── templates/ ← Thymeleafのテンプレート(HTMLファイル)
│ │ ├── static/ ← CSS・画像など静的ファイル
│ │ └── application.properties ← アプリ設定
│ └── test/
│ └── java/
│ └── com/example/demo/
│ └── DemoApplicationTests.java
└── pom.xml ← 依存関係の管理
コントローラを置く場所

コントローラは DemoApplication.java同じパッケージか、そのサブパッケージ に置く必要がある。 よく使われる慣習として controller/ サブパッケージを作成する。

com.example.demo/
├── DemoApplication.java ← @SpringBootApplication
└── controller/
└── HelloController.java ← コントローラはここに置く

DemoApplication.java:エントリポイント

Springアプリの起動クラスを確認する。生成直後から次のようなコードが入っている。

DemoApplication.javajava
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
  • @SpringBootApplication(6行目):このアノテーション1つで「Spring Bootアプリ」として動く設定がすべて有効になる
    • コンポーネントスキャン(@Controller などを自動検出する仕組み)が有効になる
    • 自動設定(MVC・DataSourceなど)が有効になる
  • SpringApplication.run(...)(10行目):アプリを起動し、組み込みのTomcatサーバーを立ち上げる
@SpringBootApplicationの中身

@SpringBootApplication は実は3つのアノテーションをまとめた省略形である。

アノテーション役割
@SpringBootConfigurationSpringの設定クラスとして認識させる
@EnableAutoConfigurationDB・MVCなどの自動設定を有効化
@ComponentScan同パッケージ以下の @Controller / @Service 等を自動検出

初学者は「@SpringBootApplication を付けたクラスが起動クラス」とだけ覚えればよい。


pom.xml:依存関係の管理

pom.xml(Project Object Model)は、このプロジェクトが使うライブラリ(依存関係)を管理するファイルである。

<dependencies>
<!-- Spring MVC(Webアプリの基盤) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- Thymeleaf(HTMLテンプレートエンジン) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
  • spring-boot-starter-web … Spring MVC + 組み込みTomcatが含まれる
  • spring-boot-starter-thymeleaf … ThymeleafのHTMLテンプレート機能が使えるようになる
starter(スターター)とは?

Spring Bootでは spring-boot-starter-xxx というパターンの依存関係を使う。 「starter」は関連するライブラリをまとめてくれる便利なパッケージである。 例えば spring-boot-starter-web 1つで、Spring MVC・内蔵Tomcat・JSONライブラリなど必要なものが全部入る。


Hello World:最初のコントローラ

src/main/java/com/example/demo/ の下に controller パッケージを作成し、次のコントローラクラスを作成する。

HelloController.javajava
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloController {
@GetMapping("/hello")
@ResponseBody
public String hello() {
return "Hello, Spring Boot!";
}
}
  • @Controller(7行目):このクラスをSpringのコントローラとして認識させる
  • @GetMapping("/hello")(10行目):/hello へのGETリクエストをこのメソッドで処理する
  • @ResponseBody(11行目):メソッドの戻り値をHTMLではなく、レスポンス本文としてそのまま返す
  • 戻り値 "Hello, Spring Boot!"(12行目):ブラウザに直接テキストとして表示される

アプリを起動して http://localhost:8080/hello にアクセスすると、「Hello, Spring Boot!」が表示される。

アプリが起動しない場合

よくある原因:

  1. @SpringBootApplication が置かれているパッケージが間違っている DemoApplication.java@SpringBootApplication と同じパッケージか、その配下にコントローラを置く必要がある
  2. 8080ポートが使用中 他のアプリが8080番ポートを使っている場合は起動に失敗する。application.propertiesserver.port=8081 のように別のポートを指定する
  3. pom.xmlの依存関係が解決されていない IDEで「Maven再インポート」または mvn install を実行する

HTMLテンプレートを使ったページ表示

@ResponseBody を使うとテキストが返るだけだが、実際のWebアプリでは HTMLテンプレート を使って画面を作る。

コントローラの修正

先ほどの HelloController を次のように修正する。

HelloController.javajava
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("message", "Hello, Spring Boot!");
return "hello"; // templates/hello.html を表示する
}
}
  • @ResponseBody がない ため、戻り値はビュー名(テンプレートファイル名)として解釈される
  • Model:コントローラからテンプレートへ値を渡すための入れ物(詳細は後の章で学ぶ)
  • model.addAttribute("message", ...)(12行目):message という名前で値をテンプレートに渡す
  • return "hello"(13行目):src/main/resources/templates/hello.html を探して表示する

テンプレートの作成

src/main/resources/templates/hello.html を作成する。

hello.html
<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<h1>[[${message}]]</h1>
</body>
</html>
  • xmlns:th="http://www.thymeleaf.org" :ThymeleafのHTML属性を使えるようにする宣言
  • [[${message}]] :コントローラから渡された message の値を表示する(詳細は後の章で学ぶ)

再起動して http://localhost:8080/hello にアクセスすると、「Hello, Spring Boot!」が大きな見出しで表示される。

@ResponseBody と HTMLテンプレートの使い分け
方法使い所
@ResponseBody を使うJSONを返すREST APIを作るとき
テンプレートを返す(通常)HTMLページを表示するとき

本研修のSpring教材では主に「テンプレートを返す」方式を使う。


よくある質問

Q. 起動したが http://localhost:8080/hello でエラーになります。

A. 以下を確認する:

  1. コントローラファイルが DemoApplication.java と同じパッケージか、そのサブパッケージにあるか
  2. @Controller アノテーションが付いているか
  3. @GetMapping("/hello") のパスが正しいか

Q. @Controller@RestController の違いは何ですか?

A. @RestController@Controller + @ResponseBody を合わせたものである。 すべてのメソッドで自動的に @ResponseBody が適用されるため、JSONを返すREST APIを作るときに使う。 HTMLテンプレートを返す通常のWebアプリでは @Controller を使う。


Q. return "hello" と書いたとき、なぜ templates/hello.html が見つかるのですか?

A. Spring Boot + Thymeleafの組み合わせでは、 ViewResolver という仕組みがビュー名を解決する。 return "hello" と書くと、自動的に classpath:/templates/hello.html を探すよう設定されている。 (classpath: とは src/main/resources/ のこと)


Q. DevToolsを依存関係に追加するとどんな利点がありますか?

A. spring-boot-starter-devtools を追加すると、JavaファイルやHTMLファイルを保存したときに アプリが自動で再起動する。毎回手動で再起動する手間が省けるため、開発効率が上がる。 本番環境では自動的に無効化される。


本章のまとめ

  • Spring Initializrを使うと、プロジェクトの雛形を自動生成できる
  • @SpringBootApplication は起動クラスに1つだけ付けるアノテーションで、コンポーネントスキャンや自動設定を有効化する
  • pom.xml で依存ライブラリを管理する。 spring-boot-starter-xxx は関連ライブラリをまとめたもの
  • @Controller + @GetMapping でURLに対応する処理を定義できる
  • @ResponseBody を付けるとテキスト/JSONをそのまま返す。付けない場合はテンプレート名として解釈される
  • Model を通じてコントローラからテンプレートへ値を渡し、 [[${message}]] で表示できる
  • 次章では、コントローラとルーティングをより詳しく学ぶ

Spring Initializr(start.spring.io)の役割として、最も適切なものを選べ。

正解

C. Springプロジェクトの雛形(テンプレート)を自動生成するためのWebサービス

解説

Spring Initializr(start.spring.io)はSpringプロジェクトの雛形を自動生成するWebサービスである。

設定できる項目:

  • プロジェクトタイプ: Maven / Gradle
  • 言語: Java / Kotlin / Groovy
  • Spring Bootバージョン
  • 依存関係(Dependencies): Spring Web、Thymeleaf、Spring Data JPA など

「GENERATE」ボタンを押すとZIPファイルがダウンロードでき、すぐに開発を始められる。

Spring Bootアプリのエントリーポイントとなるクラスに付ける @SpringBootApplication の役割として、正しいものを選べ。

正解

A. Springアプリケーションのエントリーポイントとなるメインクラスに付けるアノテーションで、自動設定・コンポーネントスキャン・設定クラスの機能を一括で有効にする

解説

@SpringBootApplication は以下の3つのアノテーションをまとめたものである。

  • @SpringBootConfiguration: Springの設定クラスであることを示す
  • @EnableAutoConfiguration: クラスパスに基づいてSpringを自動設定する
  • @ComponentScan: 同パッケージ以下のコンポーネントを自動検出する

このアノテーションを付けたクラスに main メソッドを記述し、SpringApplication.run() を呼び出すことでSpringアプリが起動する。

Spring Bootプロジェクトの標準的なディレクトリ構成として、正しいものを選べ。

正解

D. `src/main/java/` にJavaのソースコードを配置し、`src/main/resources/templates/` にThymeleafのHTMLテンプレートを配置する

解説

Spring Bootプロジェクトの標準的なディレクトリ構成:

src/
└── main/
    ├── java/com/example/demo/
    │   ├── DemoApplication.java  (メインクラス)
    │   ├── controller/           (コントローラクラス)
    │   ├── service/              (サービスクラス)
    │   └── mapper/               (MyBatisマッパー)
    └── resources/
        ├── templates/            (ThymeleafのHTMLテンプレート)
        ├── static/               (CSS・JavaScript・画像)
        ├── application.properties(設定ファイル)
        └── schema.sql / data.sql (DB初期化)

Spring BootプロジェクトにおけるpOM.xmlの役割として、最も適切なものを選べ。

正解

B. Mavenプロジェクトの設定ファイルで、プロジェクト情報・使用するライブラリ(依存関係)・ビルド設定などを記述するXMLファイル

解説

pom.xml はMaven(Javaのビルドツール)のプロジェクト設定ファイルである。

主な記述内容:

  • プロジェクト情報: groupId、artifactId、version
  • 依存関係 (<dependencies>): 使用するライブラリ(Spring Web、Thymeleaf、MyBatisなど)
  • Javaバージョン: <java.version>17</java.version> など
  • ビルド設定: プラグイン設定など

<dependencies> タグ内にライブラリを追加するだけで、Mavenが自動的にダウンロードして使えるようになる。

@Controller
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
}

上記のコントローラで /hello にアクセスしたとき、何が起きるかを選べ。

正解

C. `/hello` にアクセスすると `templates/hello.html` というThymeleafテンプレートが描画される

解説

@Controller アノテーションが付いたクラスのメソッドが String を返す場合、その文字列はビュー名として扱われる。

Springは src/main/resources/templates/ 配下の同名のHTMLファイルをThymeleafで描画してレスポンスとして返す。

  • return "hello"templates/hello.html を描画
  • return "user/list"templates/user/list.html を描画

もし @ResponseBody が付いていれば、文字列がそのままレスポンスのボディになる。

以下の2つのコントローラメソッドの動作の違いとして、正しいものを選べ。

// メソッドA:@ResponseBodyなし
@GetMapping("/a")
public String methodA() {
return "hello";
}

// メソッドB:@ResponseBodyあり
@GetMapping("/b")
@ResponseBody
public String methodB() {
return "hello";
}

正解

B. `@ResponseBody`なしはビュー名として解釈されHTMLが返され、`@ResponseBody`ありは返り値の文字列がそのままHTTPレスポンスのボディとして返される

解説

@Controller のメソッドの返り値の扱いは @ResponseBody の有無で変わる。

  • @ResponseBodyなし: 返り値の文字列がビュー名として扱われ、対応するHTMLテンプレートが描画される
  • @ResponseBodyあり: 返り値がそのままHTTPレスポンスのボディに書き込まれる

@RestController@Controller + @ResponseBody をまとめたアノテーションで、REST APIのコントローラ作成に使う。

/home にアクセスしたとき templates/home.html を表示するコントローラを完成させよ。

public class HomeController {
public String home() { return
; } }

解答例
@Controller public class HomeController { @GetMapping("/home") public String home() { return "home"; } }
解説

基本的なSpringMVCコントローラの構成:

  1. @Controller: クラスをSpringMVCのコントローラとして登録する
  2. @GetMapping("/home"): /home へのGETリクエストをこのメソッドに対応付ける
  3. return "home": templates/home.html を描画することを示すビュー名

@Controller が付いたクラスはSpringが起動時に自動検出し、Beanとして管理する。

コントローラで "name" というキーで "Spring" をViewに渡し、HTMLで表示するコードを完成させよ。

コントローラ(Java)

("name", "Spring");

テンプレート(HTML)

<p
>ここに名前が表示される</p>

解答例
model.addAttribute("name", "Spring"); <p th:text="${name}"></p>
解説

コントローラからViewへのデータ受け渡しの手順:

  1. コントローラで model.addAttribute("キー", 値) を呼び出してデータを登録する
  2. ThymeleafのHTMLで th:text="${キー}" を使ってデータを表示する

th:text 属性は要素のテキストコンテンツをモデルの値で置き換える。 HTMLエスケープが自動的に行われるため、XSS対策にもなる。