カテゴリ: Thymeleaf 更新日: 2026/02/18

Thymeleaf 変数スコープの種類と特徴まとめ|初心者でもわかるリクエストスコープとセッションスコープ

Thymeleaf 変数スコープの種類と特徴まとめ
Thymeleaf 変数スコープの種類と特徴まとめ

新人と先輩の会話形式で理解しよう

新人

「先輩、Thymeleafで画面にデータを表示する時に、スコープっていう言葉をよく聞くんですけど、これは何なんですか?」

先輩

「良い質問だね。Thymeleafのスコープというのは、変数をどの範囲で使えるかを決める仕組みなんだ。Spring MVCとThymeleafを組み合わせた時、データはControllerからViewへ渡されるけど、そのときに“どのスコープにデータを置くか”で、見える範囲が変わるんだよ。」

新人

「なるほど!じゃあ、スコープを使い分けることでデータの扱い方が変わるんですね?」

先輩

「その通り。特にThymeleafでは、リクエストスコープ・セッションスコープ・アプリケーションスコープの3種類がよく使われるから、それぞれの特徴をしっかり理解しておこう。」

1. Thymeleafのスコープとは?

1. Thymeleafのスコープとは?
1. Thymeleafのスコープとは?

Thymeleafのスコープとは、変数(データ)がどの範囲で有効かを示す仕組みです。Spring BootなどでThymeleafを使うとき、@Controllerから値をView(HTMLテンプレート)に渡すことが多いですよね。このとき、どのスコープに値を保存するかによって、そのデータがどこまでアクセスできるかが変わります。

たとえば、ユーザーがWebページにアクセスしてフォームを送信する場面を想像してみましょう。フォーム入力の結果を一時的に表示するだけなら、リクエストスコープで十分です。しかし、ログイン状態など複数ページにまたがって保持したいデータは、セッションスコープを使う必要があります。

SpringのModelオブジェクトを使うと、自動的にリクエストスコープでデータが管理されます。つまり、次のようなControllerコードを書けば、Thymeleaf側でその値を参照できるわけです。


@Controller
public class ScopeExampleController {

    @GetMapping("/scope")
    public String showScopeExample(Model model) {
        model.addAttribute("message", "リクエストスコープのサンプルです");
        return "scopeExample";
    }
}

この場合、messageという変数はリクエストスコープに格納され、Thymeleafテンプレートからアクセスできます。


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body>
    <p th:text="${message}">ここにメッセージが表示されます</p>
</body>
</html>

このようにThymeleafのスコープは、変数をどの範囲で利用できるかを制御する大切な要素です。リクエストスコープ・セッションスコープ・アプリケーションスコープなどを理解することで、より柔軟なデータ管理ができるようになります。

2. 変数スコープの必要性

2. 変数スコープの必要性
2. 変数スコープの必要性

では、なぜThymeleafで「変数スコープ」を理解する必要があるのでしょうか?実は、Webアプリケーションでは「いつ・どこで・どのデータが使えるか」を明確にしないと、意図しないデータの上書きや、情報の漏洩につながる可能性があるからです。

例えば、ユーザーがログインした情報を毎回入力させるのは不便ですよね。そのような場合、セッションスコープを使って「ログイン中のユーザー情報」を保存すれば、ページ間で保持できます。しかし、リクエストスコープを使ってしまうと、ページを移動した瞬間に情報が消えてしまいます。

逆に、セッションスコープをむやみに使いすぎると、不要な情報が残ってメモリを圧迫してしまうこともあります。そのため、状況に応じて適切なスコープを選択することが重要です。

また、Thymeleafのテンプレート内では、スコープに応じて変数の参照方法も異なります。通常は${変数名}で参照できますが、スコープを明示したい場合は次のように書けます。


<p th:text="${#request.getAttribute('message')}"></p>
<p th:text="${#session.getAttribute('user')}"></p>

このように、Thymeleafではスコープを明示することで、どこに保存されているデータかを明確にできます。これにより、変数の衝突や混乱を防ぐことができるのです。

リクエストスコープは短期的なデータ保持、セッションスコープはユーザー単位の中期保持、アプリケーションスコープは全体共有用の長期保持と考えると覚えやすいでしょう。

Thymeleaf スコープの理解は、Spring MVCとThymeleafを組み合わせた開発で避けて通れない重要なテーマです。初心者のうちは、まずリクエストスコープを中心に使いながら、必要に応じて他のスコープを試してみるのがおすすめです。

3. リクエストスコープの仕組みと使い方

3. リクエストスコープの仕組みと使い方
3. リクエストスコープの仕組みと使い方

Thymeleafで最もよく使われるスコープが「リクエストスコープ」です。リクエストスコープとは、ユーザーがWebページにアクセスしてからレスポンスを受け取るまでの間だけ有効なスコープのことです。つまり、1回のリクエスト処理中にだけデータが保持されます。Spring MVCでは、Modelオブジェクトを使って値を設定すると、自動的にリクエストスコープで扱われます。

新人

「先輩、リクエストスコープって一番よく使うんですか?」

先輩

「そうだね。フォーム入力の結果を一度だけ表示したり、検索結果を画面に出すときなんかに使うんだ。ページをリロードすると消えるのが特徴だよ。」

次の例では、ControllerクラスでModelを使ってメッセージを渡しています。このデータはリクエストスコープで保持され、Thymeleafのテンプレートで表示できます。


@Controller
public class RequestScopeController {

    @GetMapping("/hello")
    public String showMessage(Model model) {
        model.addAttribute("greeting", "こんにちは、Thymeleafのリクエストスコープです!");
        return "hello";
    }
}

上記のコードでは、greetingという変数がリクエストスコープに保存されます。Thymeleaf側でこの変数を使ってデータを表示するには、次のように書きます。


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body>
    <h3 th:text="${greeting}">メッセージがここに表示されます</h3>
</body>
</html>

このように、Thymeleaf リクエストスコープは、短期的なデータ表示に最適です。ページの遷移ごとに新しいリクエストが発生するため、不要なデータが残る心配もありません。ログイン情報のような永続的なデータではなく、一時的な表示データに使うのが基本です。

4. セッションスコープの使い方と注意点

4. セッションスコープの使い方と注意点
4. セッションスコープの使い方と注意点

次に紹介するのは「セッションスコープ」です。セッションスコープは、同じユーザーが複数のページを行き来する間もデータを保持できるスコープです。たとえばログイン情報やショッピングカートの中身など、ユーザー単位で継続的に使うデータを保持するときに便利です。

新人

「なるほど!じゃあ、ログイン中のユーザー情報なんかはセッションスコープで管理するんですね?」

先輩

「その通り。SpringではHttpSessionを使ってデータを格納できるよ。ただし、セッションスコープは便利だけど、使いすぎるとメモリを圧迫することがあるから注意が必要なんだ。」

セッションスコープを使うには、ControllerでHttpSessionオブジェクトを利用します。


@Controller
public class SessionScopeController {

    @GetMapping("/login")
    public String login(HttpSession session) {
        session.setAttribute("userName", "山田太郎");
        return "sessionExample";
    }

    @GetMapping("/mypage")
    public String myPage() {
        return "sessionExample";
    }
}

Thymeleafテンプレートでは、セッションスコープの値にアクセスするために、#sessionを使います。


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body>
    <p>ログインユーザー: <span th:text="${#session.getAttribute('userName')}"></span></p>
</body>
</html>

このように、セッションスコープに格納されたデータは、ログイン後のページでも継続して利用できます。ただし、ログアウト処理やセッションタイムアウト時にはデータが削除されるため、必ず破棄タイミングを意識して設計することが大切です。

また、セッションを使う場合は、スレッドセーフでないオブジェクトを共有しないように気をつけましょう。複数ユーザーが同時アクセスすると予期しない動作が起こることがあります。Thymeleaf セッションスコープはとても便利ですが、必要最小限の利用を心がけるのがポイントです。

5. アプリケーションスコープの利用場面

5. アプリケーションスコープの利用場面
5. アプリケーションスコープの利用場面

最後に「アプリケーションスコープ」について見てみましょう。アプリケーションスコープは、アプリ全体で共有されるスコープです。どのユーザーからのリクエストでも同じデータを参照できるため、サイト全体で共通して利用する設定値や統計情報の保持に向いています。

新人

「アプリケーションスコープは、どんなときに使うんですか?」

先輩

「例えば、サイト全体のアクセスカウントとか、定数設定の一覧を保持しておく場合に使うね。アプリ全体で1つだけのデータを共有したいときに役立つよ。」

アプリケーションスコープにデータを設定するには、ServletContextを使います。Spring MVCでも簡単に扱えます。


@Controller
public class ApplicationScopeController {

    @Autowired
    private ServletContext servletContext;

    @GetMapping("/init")
    public String initData() {
        servletContext.setAttribute("siteName", "Thymeleaf学習サイト");
        return "appExample";
    }

    @GetMapping("/info")
    public String showInfo() {
        return "appExample";
    }
}

Thymeleaf側では、#servletContextを使ってアプリケーションスコープの値にアクセスします。


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body>
    <p>サイト名: <span th:text="${#servletContext.getAttribute('siteName')}"></span></p>
</body>
</html>

このように、アプリケーションスコープはすべてのユーザーに共通のデータを保持できますが、書き換えには注意が必要です。ひとつのユーザーが更新すると、他のユーザーにも影響してしまうためです。そのため、主に定数や読み取り専用の情報を格納する用途で使うのが一般的です。

Thymeleaf アプリケーションスコープを正しく使うことで、全体的なデータの管理がシンプルになります。特に運用管理ページや設定情報の表示において有効です。開発時には、リクエストスコープ・セッションスコープ・アプリケーションスコープの違いを意識しながら設計すると、後のメンテナンスも容易になります。

6. スコープの使い分け方(どのスコープをいつ使うべきか)

6. スコープの使い分け方(どのスコープをいつ使うべきか)
6. スコープの使い分け方(どのスコープをいつ使うべきか)

新人

「先輩、ここまででリクエストスコープ、セッションスコープ、アプリケーションスコープの違いは分かってきたんですが、実際にどの場面でどれを使うべきか迷ってしまいそうです。」

先輩

「良い質問だね。これは開発現場でもよくある悩みなんだ。基本的な考え方として、“データをどのくらいの期間・どの範囲で保持したいか”でスコープを選ぶといいよ。」

たとえば、フォームの入力内容や検索結果のように「一度だけ表示すればいい」ものは、リクエストスコープを使います。これはページを更新すると消えるため、短期的なデータ保持に最適です。

一方で、ログイン情報やユーザーの状態を保持したい場合は、セッションスコープが便利です。ページ間を移動してもデータが残るため、ユーザー単位での継続的な利用に向いています。

そして、全ユーザー共通で使用する定数やサイト情報などは、アプリケーションスコープに格納します。サイト全体のアクセス数や固定設定などに適しています。

以下のように整理して覚えておくと良いでしょう。


【リクエストスコープ】
・一時的なデータの受け渡しに使う
・フォームやメッセージ表示などに最適

【セッションスコープ】
・ユーザー単位でデータを保持
・ログイン情報や状態管理に最適

【アプリケーションスコープ】
・全体共通データを保持
・設定情報や統計データに最適

スコープの選択を誤ると、意図しない動作を引き起こすことがあります。たとえば、本来リクエストスコープで十分なデータをセッションスコープに入れてしまうと、古い情報が残って再表示されることがあります。Thymeleaf スコープを正しく使い分けることは、バグの少ないWebアプリを作る第一歩なのです。

7. よくある間違いとデバッグ方法(変数が表示されない・スコープの混同など)

7. よくある間違いとデバッグ方法(変数が表示されない・スコープの混同など)
7. よくある間違いとデバッグ方法(変数が表示されない・スコープの混同など)

新人

「先輩、テンプレートに書いた変数が表示されないことがあるんですが、どこが原因なんでしょうか?」

先輩

「それは、スコープの指定ミスや変数名の一致漏れがよくある原因だね。たとえば、Controllerで設定した変数がリクエストスコープにあるのに、Thymeleaf側でセッションスコープを見にいっているケースなんかが典型的だよ。」

Thymeleafで変数が表示されない場合、まず確認すべきポイントは次の3つです。

  • Controllerで設定したスコープと、テンプレートで参照しているスコープが一致しているか
  • 変数名のスペルミスや大文字小文字の違いがないか
  • データがnullの状態でテンプレートを表示していないか

特に、セッションスコープやアプリケーションスコープを扱う場合、Thymeleafでは明示的にスコープ名を指定する必要があります。


<!-- 正しいスコープ参照の例 -->
<p th:text="${#request.getAttribute('message')}"></p>
<p th:text="${#session.getAttribute('userName')}"></p>
<p th:text="${#servletContext.getAttribute('siteName')}"></p>

もし変数が表示されないときは、ブラウザのデベロッパーツールや、サーバー側のログを確認して、Controller側で値が正しく設定されているかを確かめましょう。Spring MVCでは、Modelの内容をデバッグ出力することで確認することもできます。


System.out.println(model.asMap());

このように、Thymeleaf スコープの混同や変数の渡し漏れは初心者に多いミスです。特にpleiadesでGradleプロジェクトを作成している場合、Controllerが正しいアノテーションで認識されているか(@Controllerが付与されているか)も確認しましょう。

新人

「確かに、@RestControllerを使っていたときは画面が表示されませんでした…」

先輩

「そうそう。今回はThymeleafでViewを返す構成だから、@Controllerを使わないとHTMLテンプレートを正しく返せないんだ。スコープ以前にそこが重要なポイントなんだよ。」

Thymeleaf スコープに関する不具合は、変数の範囲とアノテーションの組み合わせを見直すだけで解決するケースが多いです。焦らず一つずつ確認していきましょう。

8. Thymeleafでスコープを正しく理解するコツ

8. Thymeleafでスコープを正しく理解するコツ
8. Thymeleafでスコープを正しく理解するコツ

新人

「だいぶ理解できてきました!最後に、Thymeleafのスコープを正しく使うコツを教えてください。」

先輩

「一番のコツは、“どのデータを、どの範囲で使いたいのか”を意識することだね。それさえ整理できれば、自然とスコープの選択も正しくなるよ。」

Thymeleaf スコープを理解するには、次のポイントを覚えておくと良いでしょう。

  • リクエストスコープは一時的なデータ表示に
  • セッションスコープはユーザー単位の情報保持に
  • アプリケーションスコープは全体共有データに

また、変数が表示されないときは、焦らずスコープを確認し、Controllerの設定を見直しましょう。スコープを理解すると、Thymeleafのテンプレートがぐっと使いやすくなります。

Spring MVC+Thymeleafの開発では、スコープを正しく使うことがデータの受け渡しの基本です。pleiadesでGradleプロジェクトを組む場合でも、ControllerとViewの流れをしっかり意識していれば、スコープに関するトラブルはほとんど防げます。

最後に覚えておきたいのは、Thymeleaf スコープは単なる変数の置き場所ではなく、アプリケーション全体の「データの流れ」を設計するための重要な仕組みであるということです。正しいスコープ選択ができるようになると、コードの見通しが良くなり、保守もしやすくなります。

新人

「ありがとうございます!これで、どのスコープを使えばいいか迷わずに済みそうです!」

先輩

「その調子!Thymeleaf スコープを理解すれば、データの受け渡しがもっとスマートになるから、実際にプロジェクトでどんどん試していこう。」

こうしてThymeleaf スコープを正しく使い分ける力を身につければ、Spring MVCの開発効率が格段に上がります。リクエスト・セッション・アプリケーション、それぞれの特徴を意識して設計していきましょう。

まとめ

まとめ
まとめ

ここまで、Thymeleafにおける変数スコープの種類とその活用方法について詳しく解説してきました。Spring BootとThymeleafを組み合わせて開発を進める上で、変数の有効範囲(スコープ)を正しく理解することは、単に値を画面に表示させるだけでなく、システムのパフォーマンスやセキュリティを維持するためにも極めて重要です。

各スコープの役割と特徴の総復習

Webアプリケーションにおけるデータのライフサイクルは、ユーザーの操作に直結しています。改めて、今回学習した3つの主要なスコープを振り返ってみましょう。

  • リクエストスコープ(Request Scope): 1つのHTTPリクエストに対して有効な範囲。Spring MVCでModelModelAndViewへ追加したデータがこれに該当します。画面遷移(リダイレクト)を挟むとデータが消えるため、その場限りの表示用データに適しています。
  • セッションスコープ(Session Scope): 同一ユーザーのブラウザセッションが持続している間、有効な範囲。ログインユーザーのIDやカート情報など、複数の画面をまたいで保持したいデータに利用します。
  • アプリケーションスコープ(Application Scope): アプリケーションが起動してから終了するまで、全ユーザーで共有される範囲。システム設定値や全体統計など、不変かつ共通の情報を扱う際に威力を発揮します。

実践的な実装サンプル:スコープの使い分け

実際の現場では、これらを一つのController内で複合的に利用することが多々あります。以下に、複数のスコープを組み合わせてデータをセットする実装例を記載します。


@Controller
@RequestMapping("/study")
public class SummaryScopeController {

    @Autowired
    private ServletContext servletContext;

    @GetMapping("/check")
    public String checkScopes(HttpServletRequest request, HttpSession session, Model model) {
        
        // 1. リクエストスコープ:このリクエストのレスポンスが返るまで有効
        model.addAttribute("requestMsg", "これはリクエストスコープのデータです(1回使い切り)");
        
        // 2. セッションスコープ:ブラウザを閉じるかタイムアウトまで有効
        session.setAttribute("sessionUser", "学習中ユーザーA");
        
        // 3. アプリケーションスコープ:サーバーが動いている間、全員がアクセス可能
        if (servletContext.getAttribute("appStatus") == null) {
            servletContext.setAttribute("appStatus", "サーバー稼働中(全ユーザー共通)");
        }
        
        return "summaryView";
    }
}

Thymeleaf側での表示は、以下のようにスコープを意識した記述を行います。特にセッションやアプリケーション変数を直接参照する場合は、暗黙オブジェクト(#session#servletContext)を活用するのがスマートです。


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>スコープ確認まとめ</title>
</head>
<body>
    <div class="container">
        <h3>スコープ別データ表示</h3>
        <ul>
            <li>リクエスト: <span th:text="${requestMsg}"></span></li>
            
            <li>セッション: <span th:text="${session.sessionUser}"></span></li>
            
            <li>アプリ共通: <span th:text="${application.appStatus}"></span></li>
        </ul>
    </div>
</body>
</html>

エンジニアとして意識すべき設計のポイント

初心者のうちは「データが消えて困るから、とりあえず全部セッションに入れよう」と考えがちですが、これは非常に危険な落とし穴です。セッションスコープに大量のデータを詰め込むと、アクセス数が増えた際にサーバーのメモリを激しく消費し、最終的にシステムがダウンする原因になります。

また、アプリケーションスコープは「誰でも書き換えられる共有の箱」であることを忘れてはいけません。スレッドセーフ(多人数が同時に触っても壊れないこと)を意識した設計が求められるため、基本的には「読み取り専用の設定値」などを置く場所として限定的に使うのがプロの技です。

適切なスコープを選択できるようになると、不必要なデータの重複が減り、デバッグも容易になります。何より、データの生存期間がコード上で明確になるため、後からプロジェクトに参加したメンバーにとっても読みやすい高品質なソースコードになります。

先生と生徒の振り返り会話

生徒

「先生、まとめまで読んでようやくスコープの使い分けが整理できてきました。要するに、そのデータが『いつまで生きていてほしいか』という寿命を考えるのがコツなんですね。」

先生

「その通り!まさにデータのライフサイクル(寿命)管理だね。例えば、検索フォームの検索キーワードをセッションに入れっぱなしにすると、別の検索をしたい時にも前のキーワードが残っていて使いにくい……なんていう小さなバグの温床にもなるんだよ。」

生徒

「あ、それは経験があります!リクエストスコープで十分なものは、出し惜しみせずリクエストで完結させるのが、メモリにもユーザーにも優しい設計なんですね。」

先生

「素晴らしい気づきだ。Spring BootのModelは非常に強力だけど、裏側でリクエストスコープを使っていることを意識するだけで、テンプレートの書き方も変わってくるはずだよ。ちなみに、URLの末尾にパラメータを付けてリダイレクト先に渡すRedirectAttributesなんていう応用技もあるから、基本が定着したらぜひ調べてみてね。」

生徒

「新しい課題ですね。まずは今回教わった3つのスコープを完璧に使いこなして、無駄のないスマートなWebアプリを作れるように頑張ります!」

先生

「その意気だよ。特に大規模な開発になるほど、このスコープ管理の差が保守性に大きく響いてくるんだ。しっかり身につけていこう。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Thymeleaf(タイムリーフ)の変数スコープとは具体的にどのような意味ですか?

Thymeleafのスコープとは、設定した変数やデータが「どの範囲まで有効で、どこまでアクセスできるか」を決める仕組みのことです。JavaのSpring BootなどのフレームワークでWebアプリケーションを開発する際、コントローラーで作ったデータをHTML(View)に渡しますが、そのデータの有効期限や共有範囲を制御するためにリクエストスコープ、セッションスコープ、アプリケーションスコープといった種類を使い分けます。
コメント
コメント投稿は、ログインしてください

まだ口コミはありません。

カテゴリの一覧へ
新着記事
New1
Springの基本
Spring Bootの@ConfigurationPropertiesScanとは?設定クラス自動検出の仕組みを解説
New2
SpringのAPI開発(REST & GraphQL)
Spring Boot GraphQLでResolverを理解しよう!初心者でもわかるデータ取得の基本
New3
SpringのAPI開発(REST & GraphQL)
Spring Boot GraphQL入門!Query・Mutation・Subscriptionの基本を初心者向けに解説
New4
SpringのDB操作
JPQLのパラメータバインド(:name / ?1)の使い方を完全解説!初心者でも迷わない基本の考え方
人気記事
No.1
Java&Spring記事人気No1
Thymeleaf
Thymeleaf とは?初心者向けにThymeleafの基本を徹底解説
No.2
Java&Spring記事人気No2
SpringのWeb開発(Spring MVC)
DispatcherServletの仕組みを理解する!初心者向け完全ガイド
No.3
Java&Spring記事人気No3
Springの基本
Spring Bootのデフォルトログ設定を徹底解説(Logback / SLF4J)
No.4
Java&Spring記事人気No4
SpringのDB操作
JPAの標準クエリメソッド(findById, findAll)を完全解説!初心者でもわかるデータ取得の基本
No.5
Java&Spring記事人気No5
SpringのWeb開発(Spring MVC)
Spring Bootでの@GetMappingと@PostMappingの基本を完全解説!初心者でも理解できる使い方
No.6
Java&Spring記事人気No6
Spring認証(Spring Security)
セッション管理の基本(@SessionAttributes)を完全解説!初心者でもわかるセッションの仕組み
No.7
Java&Spring記事人気No7
SpringのWeb開発(Spring MVC)
@Controller と @RestController の違いを完全解説!初心者向けSpring MVC入門
No.8
Java&Spring記事人気No8
SpringのWeb開発(Spring MVC)
ループ処理(th:each)の基本を完全ガイド!Thymeafの繰り返し処理の使い方