【新人向け】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テンプレート)の責務をどう分けるかを考えると、より柔軟な設計ができます
 FlashAttributesやRedirectAttributesといった、スコープの使い分けも学んでみると面白いですよ!
気になることがあれば、またなんでも聞いてくださいね。
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
- 代表取締役
 - 
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。 
最新の投稿
山崎講師2025年11月2日Pythonの「なるほど!」と思えるユニークな機能④
山崎講師2025年11月2日Pythonの「なるほど!」と思えるユニークな機能③
山崎講師2025年11月2日Pythonの「なるほど!」と思えるユニークな機能②
山崎講師2025年11月2日Pythonの「なるほど!」と思えるユニークな機能①