【初心者必見】Spring Bootの「return redirect:/game」と「return game」の違いを徹底解説!
こんにちは。ゆうせいです。
Spring Boot × ThymeleafでWebアプリケーションを作っていると、必ず一度は迷うポイントがあります。それが――
「
return "redirect:/game";
とreturn "game";
は何が違うの?」
という問題です。
見た目はとても似ている2つのコード。でも、実は動き方がまったく違うんです。
この違いを理解しないままアプリを作ると、予想外のエラーや不具合に悩まされることになりますよ!
この記事では、初心者の方でもわかりやすいように、図解・たとえ・具体例を交えてこの2つの使い分け方を解説します。
📘 まずは2つのコードの意味を整理しよう!
return "game";
これはテンプレート名を返すコードです。
Spring Bootでは、以下のようなテンプレートがあるとします:
src/main/resources/templates/game.html
このとき、return "game";
と書けば、そのまま game.html が表示されます。
return "redirect:/game";
これはリダイレクト命令です。
実行されると、ブラウザに対してこう指示します:
「いったん /game にアクセスし直して!」
つまり、今のリクエストを終了して、新しいリクエストを開始するのです。
🔍 たとえ話で理解しよう!
たとえるなら、こんな感じです:
方法 | たとえ |
---|---|
return "game" | 今いる部屋でそのまま作業を続ける |
return "redirect:/game" | 別の部屋(画面)に移動して、改めて作業を始める |
✅ 表で比較してみよう!
項目 | return "game" | return "redirect:/game" |
---|---|---|
動作 | そのままテンプレートへ遷移 | URLを再読み込み |
リクエスト数 | 1回 | 2回(リダイレクトあり) |
URL | 変わらない | 変わる(/game に) |
セッション再取得 | しない | 再取得される |
主な用途 | データを表示したいとき | 処理の後にURLを変えたいとき/再実行したいとき |
🔁 こんな時はどっちを使う?
return "game"
を使うべき場面
- ユーザーに何か情報を表示したいだけ
- 今のリクエスト中に完結している処理
- ゲーム画面を初めて表示するとき など
return "redirect:/game"
を使うべき場面
- フォーム送信後、ページをリロードしても再送信されないようにしたい(PRGパターン)
- セッションに保存したデータを使って、コントローラーのメソッドを再実行したいとき
- 状態の再初期化(例:ゲームをリスタート)など
🎮 実例で見てみよう:数当てゲーム
@GetMapping("/game/restart")
public String restart(HttpSession session) {
session.setAttribute("kazuate", new Kazuate());
return "redirect:/game"; // ← ここが大事!
}
このケースではリスタートのたびに /game
を再実行させたいので、リダイレクトが必要なんです。
これをもし return "game";
にしてしまうと、テンプレートは表示されるけれど、コントローラーの処理(セッションのチェックや初期化)が実行されません!
🔚 まとめ:新人エンジニアへのアドバイス
「見た目は似ていても、中身はまったく違う!目的に応じて使い分けよう」
目的 | 選ぶべきコード |
---|---|
表示だけなら | return "game"; |
URLをリセットしたい・処理を再実行したい | return "redirect:/game"; |
🎓 次のステップとして学ぶべきこと!
forward:
との違い(サーバー内部の転送)- PRG(Post-Redirect-Get)パターンの理解
RedirectAttributes
を使った一時データの渡し方- ユーザー体験をよくするためのリダイレクト設計
迷ったときは、「この遷移、リクエストを再実行する必要あるかな?」と自分に問いかけてみてくださいね。
リダイレクトとテンプレート表示の正しい使い分けができるようになると、あなたのWebアプリはぐっと安定して、意図通りに動くようになりますよ!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
