11. PRG(Post/Redirect/Get)

์›น ๋ธŒ๋ผ์šฐ์ €์˜ โ€˜์ƒˆ๋กœ๊ณ ์นจโ€™์€ ๋งˆ์ง€๋ง‰์— ์„œ๋ฒ„์— ์ „์†กํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์ „์†กํ•œ๋‹ค. ์ด๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ๋  ๋•Œ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ˆ˜ํ–‰ ํ›„ ๋ทฐ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ด๋™์‹œํ‚ค๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.

์ถœ์ฒ˜: ๊น€์˜ํ•œ์˜ ์Šคํ”„๋งMVC (์ธํ”„๋Ÿฐ)

์˜ˆ๋ฅผ ๋“ค์–ด โ€˜์ƒํ’ˆ ๋“ฑ๋กโ€™์„ ํ•œ ์ดํ›„ ๊ทธ ์ƒํ’ˆ์˜ โ€˜์ƒ์„ธํŽ˜์ด์ง€โ€™๋กœ ๋ฐ”๋กœ ์ด๋™์‹œํ‚จ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด, ์‚ฌ์šฉ์ž๊ฐ€ โ€˜์ƒ์„ธํŽ˜์ด์ง€โ€™์—์„œ ์ƒˆ๋กœ๊ณ ์นจ์„ ๋ˆ„๋ฅผ ๊ฒฝ์šฐ, ๋งˆ์ง€๋ง‰์— ์ˆ˜ํ–‰ํ•œ ์ž‘์—…์ธ โ€˜์ƒํ’ˆ ๋“ฑ๋กโ€™์ด ์ค‘๋ณต์œผ๋กœ ์ˆ˜ํ–‰๋˜์–ด๋ฒ„๋ฆฐ๋‹ค.

  • ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹คโ€ฆ
 @PostMapping("/add")
 public String addItemV1(@ModelAttribute Item item) {

     //์ƒํ’ˆ ์ €์žฅ
     itemRepository.save(item);
     //๋ทฐ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ „์†ก
     return "basic/item";

}

๐Ÿ’ญ ย  โ€˜์ƒˆ๋กœ๊ณ ์นจ ๋ฌธ์ œโ€™ ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜์ง€ โ€ฆ ?

๐Ÿ’ก ย  ์ƒํ’ˆ ๋“ฑ๋ก ์ดํ›„์— ๋ทฐ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์ด๋™์‹œํ‚ค๋Š” ๊ฒƒ์ด ์•„๋‹Œ, redirect ํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค !

ํ•ด๋‹ต !

์ถœ์ฒ˜: ๊น€์˜ํ•œ์˜ ์Šคํ”„๋งMVC (์ธํ”„๋Ÿฐ)

redirect ๋กœ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•˜๊ฒŒ ๋˜๋ฉด, ์ƒˆ๋กœ๊ณ ์นจ์„ ํ–ˆ์„ ๋•Œ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ˆ˜ํ–‰ํ•œ ์ž‘์—…์ด GetMapping ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒํ’ˆ ๋“ฑ๋ก์ด ์ค‘๋ณต์œผ๋กœ ์ˆ˜ํ–‰๋˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋‹ค๋งŒ redirect ํ•˜๊ฒŒ๋˜๋ฉด request ์˜์—ญ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ ธ๋ฒ„๋ฆฐ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ๋Š” RedirectAttributes ์˜ addAttribute ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ž.

  • RedirectAttributes ๋Š” pathVariable, ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๊นŒ์ง€ ์ฒ˜๋ฆฌํ•ด ์ค€๋‹ค.

  • ๋˜ํ•œ ๊ฐ€์ ธ๊ฐˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ผํšŒ์„ฑ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” addFlashAttribute ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ ๋‹ด์•„๋‘” ๊ฐ’์€ ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•˜๋ฉด ํœ˜๋ฐœ๋˜์–ด ์‚ฌ๋ผ์ง„๋‹ค.

 @PostMapping("/add")
 public String addItemV2(@ModelAttribute Item item, RedirectAttributes redirectAttributes) {
     //์ƒํ’ˆ ์ €์žฅ
     Item savedItem = itemRepository.save(item);
     //redirectํ•  url์— ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ์•„์ดํ…œ id๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„ฃ๊ธฐ ์œ„ํ•ด itemId ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.
     redirectAttributes.addAttribute("itemId", savedItem.getId());
     return "redirect:/basic/items/{itemId}";

}