「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パターンを理解したら、次はこんなことを学ぶとさらに実践力が上がります!
- バリデーション(入力チェック)との組み合わせ
 - セッションやCookieと絡めた実装
 - Ajaxとの違いや使い分け(非同期 vs PRG)
 
Webアプリケーションの信頼性とユーザビリティを高めるために、PRGは必須の考え方です。
どんどん試して、体で覚えていきましょう!質問もお待ちしています!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
- 代表取締役
 - 
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。 
最新の投稿
山崎講師2025年11月2日Pythonの「なるほど!」と思えるユニークな機能④
山崎講師2025年11月2日Pythonの「なるほど!」と思えるユニークな機能③
山崎講師2025年11月2日Pythonの「なるほど!」と思えるユニークな機能②
山崎講師2025年11月2日Pythonの「なるほど!」と思えるユニークな機能①