Spring BootにおけるDTOの使い方は?ModelとHttpSessionの使い分け

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

Spring Bootを使ってWebアプリケーションを開発していると、「DTO(Data Transfer Object)」という言葉をよく目にすると思います。

では、このDTOはどこでどのように扱えばよいのでしょうか?

モデル(Model)に入れるのか、それともセッション(HttpSession)に入れるのか──この質問に答えながら、丁寧に解説していきます。


DTOとは何か?まずは基本から

DTOとは、データを転送するための専用オブジェクトです。

たとえば、以下のようなケースで使われます。

  • 入力フォームの内容をコントローラーに渡す
  • データベースから取得した情報を画面に表示する
  • REST APIのリクエストやレスポンスを受け渡す

DTOは「データだけを持つオブジェクト」で、ビジネスロジックを持たないという特徴があります。


ModelとHttpSessionの違いを理解しよう

Model(モデル)

Modelは、コントローラーからビュー(画面)へデータを渡すためのオブジェクトです。

特徴は次の通りです。

特徴説明
一時的1回のリクエストに対してだけ有効
軽量サーバー側のメモリを圧迫しない
主な用途入力フォームの初期表示、画面への出力など

イメージとしては、「一枚の紙に必要な情報だけを書いて、ビューに手渡す」ようなものです。


HttpSession(セッション)

HttpSessionは、ユーザーごとに状態を保持できる仕組みです。

こちらはリクエストをまたいで情報を持ち続けることができます。

特徴説明
永続的(セッションが切れるまで)ユーザーがアプリを使っている間、ずっと保持される
状態保持が可能ログイン情報、複数ページにわたる入力など
主な用途ログイン管理、ウィザード形式のフォームなど

これは「引き出し付きのロッカーに情報を入れて、必要なときに取り出す」ようなイメージです。


DTOはどちらに入れるべきか?

基本はModelに入れる!

一番よくあるのは、DTOをModelに入れて画面表示やフォーム送信に使うパターンです。

この方法のメリットは以下のとおりです。

  • 画面ごとに異なるデータを柔軟に表示できる
  • セッションに依存しないため、状態の管理が簡単
  • 不要な情報を溜め込まずに済む

ただし、状態を保持したい場合はHttpSessionに入れる!

例えばログイン後のユーザー情報をずっと保持したい場合や、3ページにわたる入力フォームの内容を一時的に保管したいときは、HttpSessionが適しています。


具体例で比較しよう!

【ModelにDTOを入れる場合】

例えば、ユーザー登録フォームを表示するコントローラ:

コントローラのコード

@GetMapping("/register")
public String showForm(Model model) {
    model.addAttribute("userDto", new UserDto());
    return "registerForm";
}

ここでは userDto をフォーム表示用に一時的に使っています。


【HttpSessionにDTOを入れる場合】

3ステップの入力フォームで、Step1の情報を保存したいケース:

コントローラのコード

@PostMapping("/step1")
public String step1(Step1Dto dto, HttpSession session) {
    session.setAttribute("step1", dto);
    return "redirect:/step2";
}

このように、Step2でもStep1の内容を引き続き使いたいときにはセッションが適しています。


使い分けのまとめ

シチュエーションDTOを入れる場所理由
単一ページで完結する表示や送信Model一時的なデータ渡しに向いている
複数ステップの入力処理やログイン管理HttpSessionリクエストをまたいで状態を保持できる

よくある誤解に注意!

「DTOは全部セッションに入れればいいのでは?」

いいえ、それはやめましょう。

セッションはメモリを使うため、乱用するとサーバーが重くなるリスクがあります。また、必要のないデータを長く持ち続けるとバグの原因にもなります。


最後に:今後の学習の指針

DTOとModel、HttpSessionの関係が理解できたら、次は以下のようなテーマに進んでみてください。

  • @ModelAttribute の役割と自動バインディング
  • SessionAttributesHttpSession の違い
  • フォームバリデーション(@ValidBindingResult
  • DTOとエンティティの設計分離

一つひとつ学んでいけば、より堅牢でメンテナンス性の高いWebアプリケーションが作れるようになりますよ!

質問があれば、なんでも聞いてくださいね!

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

投稿者プロフィール

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