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}";

}