Thymeleafのth:ifやth:switchはいつ使う?Controllerとテンプレートの適切な役割分担とは?
こんにちは。ゆうせいです。
Thymeleafのテンプレートエンジンでは、th:each
がリスト表示などに非常に役立ちますよね。一方で、th:if
やth:switch
のような条件分岐は、「Controllerでやった方がいいのでは?」という疑問を持つのも自然なことです。
ここでは、テンプレート側で条件分岐を書くメリットや、どんな場面で便利になるかを具体的に見ていきましょう!
Controllerで条件分岐するメリットと限界
まず、Controllerで分岐を済ませると以下のようなメリットがあります:
- ロジックが集中するため、テンプレートがシンプルになる
- テストしやすい
- 再利用性が高くなる
しかし、以下のようなケースではテンプレートでの条件分岐も有効です。
th:if
やth: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:switch
やth: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:each
、th:if
、th:switch
などの適材適所な使い方をマスターする- 実際の開発で「どちらに書いた方が読みやすいか」を意識して比べてみる
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
