「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は必須の考え方です。
どんどん試して、体で覚えていきましょう!質問もお待ちしています!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
