Spring Bootにおける「model」と「session」の違いとは?初心者向けにやさしく解説!
こんにちは。ゆうせいです。
今回は、Spring BootのWebアプリケーション開発における「model」と「session」の使い分けについて、エンジニアとしてスタートを切ったばかりのあなたに向けて、わかりやすく解説していきます。
「model」と「session」って似ているように感じるけど、実は役割がまったく違うんです。
たとえるなら…
- modelは「今だけ使うカゴ」
- sessionは「しばらく預かってもらえるロッカー」
そんなイメージで読み進めてみてくださいね!
Modelとは?リクエスト単位の「一時的なデータ入れ物」
Modelの役割
Spring Bootのコントローラーでは、よくこんなふうにModel
を使います:
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("name", "Yusei");
return "hello";
}
このときのmodel
は、HTMLテンプレート(View)に一時的にデータを渡すためのものです。
つまり、1回のリクエスト・レスポンスの中だけで生きるデータの通い道なんですね。
特徴まとめ
項目 | 内容 |
---|---|
寿命 | リクエストが終わるまで |
保存場所 | メモリ上(サーバー側) |
使い道 | テンプレートにデータを渡す |
例え | 買い物中のカゴ |
Sessionとは?ユーザーごとに保持される「長持ちロッカー」
Sessionの役割
HttpSession
は、あるユーザーに属するデータを複数回のリクエストにまたがって保持するためのものです。
こんなコードで使われます:
@GetMapping("/login")
public String login(HttpSession session) {
session.setAttribute("userName", "Yusei");
return "home";
}
この例では、ログインしたユーザーの名前をセッションに入れています。これにより、別の画面に移動しても「ログインしたユーザーが誰か」を保持し続けられます。
特徴まとめ
項目 | 内容 |
---|---|
寿命 | ブラウザを閉じる or タイムアウトまで |
保存場所 | サーバー側(ユーザーごと) |
使い道 | ログイン情報、状態の保持など |
例え | ロッカーに荷物を預けておく感覚 |
ModelとSession、いつどっちを使う?
基本の考え方
- 一時的に画面にデータを渡したい ⇒ Model
- ユーザーの状態や情報を保持したい ⇒ Session
具体例で考えてみよう
例1:商品の詳細ページを表示する
→ モデルで十分。
@GetMapping("/product")
public String productDetail(Model model) {
model.addAttribute("product", productService.getProductById(1));
return "productDetail";
}
例2:ログイン状態を管理したい
→ セッションの出番!
@PostMapping("/login")
public String login(@RequestParam String userId, HttpSession session) {
User user = userService.findById(userId);
session.setAttribute("loginUser", user);
return "redirect:/mypage";
}
よくある勘違いと注意点
Modelに入れたデータは次の画面に残らない!
一見セッションみたいに感じるかもしれませんが、modelは次のリクエストでは消えてしまうため、ログイン情報やユーザーの状態管理には向きません。
セッションは使いすぎ注意!
セッションに大きなデータや無駄なデータを入れすぎると、メモリ負荷が増えてスケーラビリティが落ちることがあります。
必要最小限のデータだけにしておきましょう。
まとめ:このように使い分けよう!
目的 | 適切な選択肢 |
---|---|
一時的に画面にデータを表示したい | Model |
ユーザーのログイン状態を保持したい | Session |
ウィザード形式(ステップ入力)の情報保持 | Session |
次に学ぶべきステップ!
ここまで理解できたら、次は以下のステップに進んでみましょう!
@SessionAttributes
の使い方と違い- クッキー(Cookie)との違い
- セッション管理のセキュリティベストプラクティス
- フロントエンドとのデータ受け渡し(ThymeleafやReact)
もし「Sessionがうまく消えない」といったトラブルがあれば、session.invalidate()
を試すなど、セッションのライフサイクルにも注目してみてください。
他にもSpring Bootについて知りたいことがあれば、気軽に聞いてくださいね!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
