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