Spring BootでView層をマスター!Thymeleafテンプレートの使い方【Spring Boot】

  • LINEで送る
Spring BootでView層をマスター!Thymeleafテンプレートの使い方

 「Controllerで処理はできたけど、画面にはどう出すの?」と悩んだことはありませんか?本記事では、Spring BootのMVC構成における「View層」の役割と、テンプレートエンジンThymeleafの基本的な使い方を解説します。HTMLとJavaをつなぐ仕組みを学ぶことで、静的なページから動的なWebアプリへと一歩進んだ開発ができるようになります。

💻 View層って何をする場所?

 Spring BootはMVCアーキテクチャ(Model-View-Controller)を採用しています。この中でView層は「画面表示」を担当します。アプリケーションにおいて、ユーザーが最初に目にするのは「画面」=Viewです。どれだけControllerやService層で正しい処理が行われていても、View層がしっかり設計されていなければ、ユーザーはその成果を確認することができません。View層はまさに「アプリの顔」となる重要なパートです。

MVCアーキテクチャ

 たとえば、Controllerでユーザー情報やメッセージなどのデータを準備しても、それをHTMLに表示する手段がなければ意味がありません。ここで登場するのがテンプレートエンジンであり、Spring BootではThymeleafが標準的に利用されます

 静的なHTMLファイルでは、表示内容は常に固定されてしまい、「ようこそ、太郎さん」のような個別メッセージを表示することはできません。しかし、Thymeleafを使えば、Controllerで渡したJavaのデータをHTMLに動的に埋め込むことができるため、ユーザーに応じた表示が簡単に実現できます。

 このように、View層は見た目の構築にとどまらず、Controllerとの連携を通じて、動的でインタラクティブなWebアプリケーションの鍵を握る存在なのです。

🌱 Thymeleafとは?Spring Bootに最適なテンプレートエンジン

 Thymeleafは、JavaアプリケーションとHTMLテンプレートを結びつけるためのテンプレートエンジンです。特にSpring Bootと組み合わせて使うことで、動的なWebページの作成が非常にスムーズになります。

 最大の特徴は、「HTMLに直接埋め込める構文でありながら、HTMLとして破綻しない」点です。たとえば、th:textth:each のような属性を使うことで、HTMLの見た目を壊さずに、Javaオブジェクトの内容を表示・繰り返し処理できます。

🌱 Thymeleafの主な特徴

  • HTMLファイルをそのままブラウザで表示可能:デザイナーとの分業にも適しており、モック作成や見た目の調整が容易です。
  • Springとの高い親和性spring-boot-starter-thymeleaf を導入するだけで、ViewResolverの設定も不要で即利用可能。
  • 式言語(OGNLベース)の表現力:変数参照、条件分岐、繰り返し、URL生成などがテンプレート内で簡潔に記述できます。
  • セキュリティへの配慮:出力はデフォルトでHTMLエスケープされるため、XSS対策も万全。
  • フラグメントによる部品化:共通のヘッダーやフッターなどを再利用可能にし、テンプレートの保守性が向上します。

✅ なぜThymeleafがSpring Bootに最適なのか?

  • Spring MVCにおけるViewResolverとして自動設定され、ほぼノー設定で動作する
  • @Controller でModelに詰めたデータをHTMLテンプレート上で自然に扱える
  • application.properties によってテンプレートの読み込み先やキャッシュ設定も柔軟に変更可能

 このように、ThymeleafはSpring BootでWebアプリケーションを作る際に、見た目とロジックの分離を実現しつつ、ユーザーに応じた柔軟な画面表示を可能にする頼れる存在です。

⚙️ プロジェクトにThymeleafを導入する

 Spring Initializrでプロジェクトを作成する際に「Thymeleaf」を依存関係として追加するのが最も簡単な方法です。Spring Initializrの画面で「Dependencies」の検索欄に「Thymeleaf」と入力し、表示された候補をクリックして追加しましょう。これにより、初期設定済みの状態でプロジェクトが作成されます。すでにプロジェクトがある場合は、以下のように手動で追加することもできます。

Mavenの場合(pom.xml)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

Gradleの場合(build.gradle)

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
}

 またThymeleafはapplication.propertiesやapplication.yamlで細かく設定することができます。以下はその設定内容です。

application.properties での設定

spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.cache=false

application.yaml での設定

spring:
  thymeleaf:
    prefix: classpath:/templates/
    suffix: .html
    mode: HTML
    encoding: UTF-8
    cache: false

 以下に、application.propertiesapplication.yaml で設定できる主な項目とその意味を表形式でまとめます:

プロパティ名意味デフォルト値補足
spring.thymeleaf.prefixテンプレートファイルのディレクトリパスclasspath:/templates/カスタムパスに変更可能
spring.thymeleaf.suffixテンプレートファイルの拡張子.html.xhtml なども指定可能
spring.thymeleaf.modeテンプレートモード(解析方法)HTMLLEGACYHTML5, XML, TEXT なども指定可能
spring.thymeleaf.encoding文字エンコーディングUTF-8特に理由がなければUTF-8推奨
spring.thymeleaf.cacheテンプレートのキャッシュ使用有無true開発中は false にすると便利
spring.thymeleaf.enabledThymeleafを有効にするかtrue無効にするとテンプレートは処理されない
spring.thymeleaf.check-template-locationテンプレートパスの存在確認true存在しないと起動時に警告

 これらを適切に設定することで、開発効率やアプリケーションの柔軟性が大きく向上します。

 Thymeleafのテンプレートファイルは src/main/resources/templates/ 配下に配置します。このパスはSpring Bootのデフォルト設定で、自動的にViewとして解釈されます。

🔰 Thymeleafの超基本的な使い方!

 Spring BootとThymeleafを使って、ControllerのデータをHTMLテンプレートに埋め込む基本の流れを見ていきましょう。ここでは「こんにちは、○○さん!」と名前を出力するシンプルな例を使います。○○さんの部分はコントローラーから動的にThymeleafに渡してみます。

Controller クラスの実装

@Controller
public class HelloController {
    @GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("name", "太郎");
        return "hello"; // resources/templates/hello.html を表示
    }
}

 このコードでは、Model オブジェクトに name という属性を追加し、それを hello.html テンプレートに渡しています。

 model.addAttribute("name", "太郎") という記述は、テンプレートに渡すデータを準備している部分です。第一引数がテンプレートで使用される変数名(ここでは name)、第二引数がその変数に対応する値(ここでは “太郎”)です。Thymeleafのテンプレートでは ${name} と書くことで、この値を参照することができます。この仕組みにより、Controllerからテンプレートへのデータ連携が非常に簡単かつ明示的に行えます。

HTMLテンプレート (hello.html)

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Hello</title>
</head>
<body>
    <h1 th:text="'こんにちは、' + ${name} + 'さん!'"></h1>
</body>
</html>

 このテンプレートでは、th:text 属性を使って、Controllerから受け取った name の値をHTMLに表示しています。

ブラウザでの表示

 上記のコードを実行してブラウザで http://localhost:8080/hello にアクセスすると、次のような出力が表示されます:

Thymeleaf実行画面サンプル

💡 th:text の意味

Thymeleafの th:text は、タグの中身を置き換える属性です。

  • <h1 th:text="'Hello ' + ${name}">placeholder</h1> と書けば、<h1>Hello 太郎</h1> として出力されます。
  • 単なる ${name} だけでなく、文字列との結合や条件式も記述できます。

 その他にもThymeleafの構文はいくつもあります。Thymeleafのチートシートも用意指定いるので参考にしてみてください。

 このように、Thymeleafの構文を使えば、HTMLファイルを壊すことなく動的なコンテンツ表示が可能になります。

⚠️⚠️⚠️よくある間違いとその対策⚠️⚠️⚠️

❌ 反例:Modelを使わずに文字列を返す

@GetMapping("/bad")
public String bad() {
    return "<h1>Hello</h1>"; // View名として解釈されてしまう
}

→ 文字列を返してしまうと、それがテンプレート名と解釈され、存在しないテンプレートとしてエラーになる。

✅ 正しい方法:Modelでデータを渡してテンプレートを返す

@GetMapping("/good")
public String good(Model model) {
    model.addAttribute("message", "Welcome");
    return "welcome";
}

❌ 反例:テンプレートファイルが templates フォルダ外にある

src/main/resources/public/hello.html

→ Spring Bootは templates フォルダをテンプレート探索パスとしているため、ここに置かれていないと認識されない。

✅ 正しい方法:正しい場所にテンプレートを配置する

src/main/resources/templates/hello.html

❌ 反例:th:text を使わずに ${} を直接書く

<p>${name}</p> <!-- これはプレーンテキストとして扱われる -->

→ これはテンプレートとして処理されず、そのまま文字列が表示される。

✅ 正しい方法:Thymeleafの属性で埋め込む

<p th:text="${name}"></p>

❌ 反例:文字エンコーディングの設定漏れ

テンプレートやControllerに日本語を含む場合、エンコーディングの不一致で文字化けが発生する。

✅ 正しい方法:UTF-8を明示する

  • HTMLに <meta charset="UTF-8">
  • application.propertiesspring.thymeleaf.encoding=UTF-8
  • Javaファイルを UTF-8 で保存

 こうした間違いは初心者にありがちですが、一度理解してしまえば確実に回避できます。

まとめ

 Thymeleafは、Spring Bootに自然に組み込めるテンプレートエンジンで、View層の構築を強力にサポートします。Controllerで処理したJavaのデータを、HTMLでわかりやすく出力できることで、MVCの分離が明確になり、保守性の高いアプリケーション開発が可能になります。

 Thymeleafの基礎を押さえることで、画面とロジックがつながり、Webアプリ開発の楽しさがぐっと広がるはずです。

 次回は、ThymeleafによるHTML出力から一歩進んで、JSON形式を用いたREST APIの基本構成について解説します。入力と出力の仕組みを理解することで、より柔軟で実用的なWebアプリケーション開発へとつなげていきましょう。

最新の投稿

SNSでもご購読できます。

コメントを残す