「PRGパターン」って何?初心者にもわかりやすく!画面遷移とデータ再送信の謎を解決!

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

今回は新人エンジニアの方にぜひ知っておいてほしい、PRGパターン(Post/Redirect/Get)について解説します!

フォームを送信したあとに「再読み込みしますか?」と聞かれて困ったことはありませんか?
それ、PRGパターンを知らないと起きる“あるある”なんです。

この記事を読めば、なぜPRGが必要なのか、どうやって使うのかがスッキリわかるようになりますよ!


PRGパターンとは?

PRGとは:

Post → Redirect → Get

という3つの処理の流れの略です。

それぞれの意味は?

段階処理の内容
Postユーザーがフォームを送信する(POST)
Redirectサーバーが別のURLへリダイレクトを指示する
GetブラウザがそのURLへアクセスして画面を表示する(GET)

なぜPRGパターンが必要なの?

よくある問題:「フォーム再送信」

フォーム送信後、そのまま結果画面が表示されるようなコードを書いたことはありませんか?

@PostMapping("/register")
public String register(UserForm form) {
    userService.save(form);
    return "success"; // 結果画面に直接遷移
}

この場合、ユーザーが F5キーでページを更新すると、またPOSTが送信されてしまい、同じデータが二重に登録される 危険があります。

これが、「フォームの再送信」問題です。

解決法:リダイレクトをはさむ!

@PostMapping("/register")
public String register(UserForm form) {
    userService.save(form);
    return "redirect:/register/success";
}

こう書くことで、POST処理が終わったあとにGETリクエストで「成功画面」に遷移します。
その結果、F5キーを押してもGETが再実行されるだけなので、登録処理は再送信されません!


図解:通常のPOSTとPRGの違い

通常のPOST処理

[フォーム画面] --(POST)--> [処理して結果表示]
                           ↑ F5で再送信が発生!

PRGパターン

[フォーム画面] --(POST)--> [サーバーで保存]
                         --(リダイレクト)--> [GETで結果表示]
                                                 ↑ F5しても再送信なし!

実装のサンプルコード(Spring Boot)

// 入力画面(GET)
@GetMapping("/form")
public String form(Model model) {
    model.addAttribute("form", new UserForm());
    return "form";
}

// 登録処理(POST)
@PostMapping("/form")
public String register(@ModelAttribute UserForm form, RedirectAttributes redirectAttributes) {
    userService.save(form);
    redirectAttributes.addFlashAttribute("message", "登録に成功しました!");
    return "redirect:/form/success";
}

// 完了画面(GET)
@GetMapping("/form/success")
public String success() {
    return "success";
}

FlashAttributeって何?

addFlashAttribute は一時的にデータを保持してリダイレクト先に渡す機能です。

普通の Model.addAttribute を使うと、リダイレクト時に情報が消えてしまうので注意!


メリットとデメリットを整理!

メリット

  • フォームの再送信を防げる
  • URLが結果画面になるので、ブックマークしやすい
  • ユーザーにわかりやすい導線が作れる

デメリット

  • リダイレクト分、通信が1回増える
  • 少しコード量が増える

でも、ほとんどのWebアプリではメリットの方が圧倒的に大きいです!


PRGはどんな場面で使うの?

  • ユーザー登録や予約フォームなど「同じ処理が複数回走ると困る場面」
  • コメント投稿やレビューなど「一度だけ処理すればいい」アクション
  • ECサイトの注文確定処理

まとめ:PRGはWebの基本マナー!

  • PRGは「Post → Redirect → Get」の流れで、フォーム再送信を防ぐ設計パターン
  • Spring Bootでは redirect: を使って簡単に実装できる
  • データをリダイレクト先に渡すには RedirectAttributes を活用する
  • フォーム送信系の画面では必ずPRGを意識しよう!

今後の学習の指針

PRGパターンを理解したら、次はこんなことを学ぶとさらに実践力が上がります!

  1. バリデーション(入力チェック)との組み合わせ
  2. セッションやCookieと絡めた実装
  3. Ajaxとの違いや使い分け(非同期 vs PRG)

Webアプリケーションの信頼性とユーザビリティを高めるために、PRGは必須の考え方です。

どんどん試して、体で覚えていきましょう!質問もお待ちしています!

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

投稿者プロフィール

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