【新人向け】Springでsessionからmodelに乗せ換えるべきか否か?

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


model.addAttributeは本当に必要?ビューで${session.cart}と書けるのでは?

こんな疑問、開発中に出てきたことはありませんか?

<li th:each="item : ${session.cart}">
    <span th:text="${item.name}"></span>
</li>

このように、テンプレート(たとえばThymeleaf)でセッションに保存されたオブジェクトを${session.cart}のように直接参照すれば、コントローラーでいちいちmodel.addAttributeを呼び出す必要がないのでは?という考え方です。

実は、その通りです。この方法も使えます。


session.cartをテンプレートで直接使うとはどういうこと?

テンプレートエンジンの多く(特にThymeleaf)は、リクエストスコープやセッションスコープにある変数を直接参照できます。これは、テンプレートの変数解決の仕組みによるものです。

h3: Thymeleafではどう解決されるか?

Thymeleafでは以下のようにスコープを指定してアクセスできます:

  • ${cart} → リクエストスコープ(=Modelに追加されたもの)
  • ${session.cart} → セッションスコープ
  • ${application.xxx} → アプリケーションスコープ

ですので、セッションに直接保存されているカートを使いたいなら、model.addAttribute("cart", ...)を省略しても問題ありません


でも、model.addAttributeとどちらを使うべき?

どちらも可能ですが、それぞれに向き・不向きがあります。

session.cartを直接使う場合のメリットとデメリット

項目内容
メリットコントローラーの記述を簡潔にできる。不要なmodel.addAttributeを省ける。
デメリットテンプレートのロジックがやや複雑になる。session.cartと書かないと参照できない。ビューがセッションスコープに依存する。

model.addAttributeを使う場合のメリットとデメリット

項目内容
メリットテンプレート側がcartとだけ書けば済む。どこから来たかを意識せず書けるので、メンテナンス性が良い。
デメリット毎回のコントローラーに記述が必要になる。冗長に見える場合も。

どちらが「正解」なのか?

実はどちらも間違いではありません。ただし、以下のような基準で使い分けるのが良いです。

  • ビューの中で「セッション依存の変数です」と明示したい場合:${session.cart}で直接アクセス
  • テンプレートをシンプルに保ちたい、ビューからスコープを意識させたくないmodel.addAttributeで渡す

例えるなら…

  • session.cart → 冷蔵庫から直接材料を取ってくる料理人(ビューが「どこにあるか」を知っている)
  • model.addAttribute("cart", ...) → キッチンの台に材料をあらかじめ並べてくれるアシスタント(ビューは「そこにあるもの」を使うだけ)

実際のプロジェクトではどうすべき?

現場では以下のような方針がおすすめです:

  • 小規模・一人開発なら${session.cart}でも十分OK
  • 複数人開発、またはテンプレートを複数画面で再利用するなら、モデルスコープに明示的に渡す方式(model.addAttribute)が堅実

結論

  • セッションからcartをテンプレートで使うには、model.addAttribute使ってもいいし、使わなくてもいい
  • ${session.cart}で直接テンプレートに書いても動作に問題はない
  • 設計方針に応じて、ビューの責任範囲を明確にすることが大切!

今後の学習の指針

  • Thymeleafのスコープ解決ルールについてもっと深掘りしてみましょう
  • サーバー側(Java)の責務とビュー側(HTMLテンプレート)の責務をどう分けるかを考えると、より柔軟な設計ができます
  • FlashAttributesRedirectAttributesといった、スコープの使い分けも学んでみると面白いですよ!

気になることがあれば、またなんでも聞いてくださいね。

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

投稿者プロフィール

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