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
の役割と自動バインディングSessionAttributes
とHttpSession
の違い- フォームバリデーション(
@Valid
とBindingResult
) - DTOとエンティティの設計分離
一つひとつ学んでいけば、より堅牢でメンテナンス性の高いWebアプリケーションが作れるようになりますよ!
質問があれば、なんでも聞いてくださいね!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール

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