Thymeleafのth:ifやth:switchはいつ使う?Controllerとテンプレートの適切な役割分担とは?


こんにちは。ゆうせいです。

Thymeleafのテンプレートエンジンでは、th:eachがリスト表示などに非常に役立ちますよね。一方で、th:ifth:switchのような条件分岐は、「Controllerでやった方がいいのでは?」という疑問を持つのも自然なことです。

ここでは、テンプレート側で条件分岐を書くメリットや、どんな場面で便利になるかを具体的に見ていきましょう!


Controllerで条件分岐するメリットと限界

まず、Controllerで分岐を済ませると以下のようなメリットがあります:

  • ロジックが集中するため、テンプレートがシンプルになる
  • テストしやすい
  • 再利用性が高くなる

しかし、以下のようなケースではテンプレートでの条件分岐も有効です。


th:ifth:unlessが便利なケース

1. 表示の可否だけを制御したいとき

たとえば「ログインしているときだけメニューを表示する」「在庫が0なら『在庫切れ』のラベルを表示する」など、UIだけに関係する分岐なら、テンプレートに任せるほうが直感的です。

<span th:if="${product.stock == 0}">在庫切れ</span>

Controllerで「在庫切れかどうか」をわざわざ判定してフラグを渡すのは冗長になることもあります。


2. 同じデータ構造をテンプレートで「ちょっとだけ」変える場合

以下のような場面です:

<span th:if="${user.role == 'ADMIN'}">管理者権限あり</span>
<span th:if="${user.role != 'ADMIN'}">一般ユーザー</span>

Controllerで文字列を分岐して渡してもいいですが、「テンプレートで完結する表示処理」なら、テンプレート側に任せるとコードの流れがスムーズになります。


th:switchth:caseが活躍するケース

th:switchはJavaのswitch文のように複数分岐する場合に便利です。たとえば、ステータスコードによってラベルを切り替える場面:

<div th:switch="${order.status}">
  <span th:case="'NEW'">新規</span>
  <span th:case="'SHIPPED'">発送済</span>
  <span th:case="'CANCELLED'">キャンセル</span>
  <span th:case="*">不明</span>
</div>

このような「数パターンしかない簡単なラベル分岐」なら、テンプレートだけで完結させた方が、Controller側をシンプルに保てます。


まとめ:使い分けのポイント

観点Controllerでやるべきテンプレートでやっても良い
ビジネスロジック×
表示制御
状態フラグの計算
ラベルや文言の分岐

例え話で理解しよう!

Controllerは「シェフ」、テンプレートは「盛り付け係」だと考えてください。

シェフ(Controller)は料理の味付けや材料の選定を行います。盛り付け係(テンプレート)は料理をどう見せるかを考える役目です。

料理の味(ロジック)はシェフに任せ、皿の上でどう見せるか(表示分岐)は盛り付け係が担当する。そんな役割分担が理想的です。


今後の学習の指針

Thymeleafを使いこなすためには、以下のポイントを押さえておくとよいでしょう:

  • Modelにどの程度情報を詰めるかを見極める
  • 表示ロジックとビジネスロジックの境界線を意識する
  • th:eachth:ifth:switchなどの適材適所な使い方をマスターする
  • 実際の開発で「どちらに書いた方が読みやすいか」を意識して比べてみる

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。