【新人向け】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
といった、スコープの使い分けも学んでみると面白いですよ!
気になることがあれば、またなんでも聞いてくださいね。
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
