PRG
๋ POST
์์ฒญ์ผ๋ก ๋ฆฌ์์ค๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ ์ฌ์์ฒญ์ ๋ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ํจํด์
๋๋ค.
ํ ๊ฐ์ง ์ํฉ์ ์์๋ก ๋ค์ด๋ณผ๊ป์.
์๋ก๊ณ ์นจ
์ ์ํ์ด์ ๋ฅผ ์์๋ณด๊ธฐ ์ํด ์ ์์ฒญ์ ์๋ฒ ์ ์ฅ์์ ์๊ฐํด๋ณผ๊ป์.
GET /items/new-form
(ํผ์ ๋๋๋ง)POST /items
POST /items
์ด URL์ ์ ์งํ ์ฑ๋ก View๋ง์ ๋ฟ๋ ค์ฃผ์๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ์ URL์ ๋ณํ์ง ์์ต๋๋ค.POST /items
์ด ๋ฐ๋ณต์ ์ผ๋ก ์์ฒญ๋๋ ๊ฒ ์
๋๋ค.POST
์์ฒญ์ด ๋จ์ํ ๋ฑ๋ก ์์ฒญ์ด ์๋๊ณ ๊ฒฐ์ ์์ฒญ์ด๋ผ๊ณ ์๊ฐํด๋ด
์๋ค. ์๋ก๊ณ ์นจ์ ํ ๋๋ง๋ค ๊ฒฐ์ ๊ฐ ๋๋ ๊ฒ์
๋๋ค.. ๋์ฐํฉ๋๋ค..POST
์์ฒญ์ ๋ฉฑ๋ฑ(idempotent)ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ์์ฒญ์ ๋ํ ๋๋น๊ฐ ๋์ด์ผ ํฉ๋๋ค. ๋ฐ๋ฉด GET
์ ๊ฒฝ์ฐ ๋ฉฑ๋ฑํ๊ธฐ ๋๋ฌธ์ ์ฌ์์ฒญ์ด ์ค๋ ๊ฒฝ์ฐ ์ฌ๋ฌ ๋ฒ ์กฐํ๊ฐ ๋ ๋ฟ ์๋ฒ์ธก ๋ฆฌ์์ค์ ๋ณํ๋ฅผ ์ฃผ์ง๋ ์์ง์.PRG ํจํด์ ๋์ ํ์ฌ ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ
POST
์์ฒญ ์ดํ URL ์ ๋ณด๋ฅผ ๋ฐ๊ฟ์ฃผ์ง ์์๊ธฐ ๋๋ฌธ์
๋๋ค. URL ์ ๋ณด๋ฅผ ๋ฐ๊ฟ์ค์ผ ํฉ๋๋ค.Redirect
๋ฅผ ์ด์ฉํด ์ํ์ ์์ธ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ฃผ๋ GET /items/{itemId}
๋ก ์์ฒญ์ ์ฎ๊ฒจ์ค๋๋ค.POST
์์ฒญ ์ดํ URL์ /Items/{ItemID}
๊ฐ ๋๊ณ ํด๋น URL์ GET
์ผ๋ก ๋งคํ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ฉฑ๋ฑํ์ฌ ์ฌ์์ฒญ์ ๋ํด ๋ฌธ์ ๋ฅผ ๋ฐ์์ํค์ง ์์ต๋๋ค.POST
์์ฒญ์ ๋ํด ๊ฒฐ๊ณผ๋ฅผ Redirect
๋ฅผ ์ด์ฉํด GET
์์ฒญ์ผ๋ก ์ฎ๊ฒจ์ฃผ๋ ๊ฒ ์
๋๋ค.์๋ ์์ ๋ก Spring MVC์์ redirect
ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณผ๊ป์.
redirect:/hello
๋ฅผ ๋ฆฌํดํ๊ฒ ๋๋ฉด /hello
๋ก GET
๋ฐฉ์์ผ๋ก ์์ฒญํฉ๋๋ค. /test
์์ /hello
๋ก redirect
ํ๋ ๊ฒ ์
๋๋ค. /test
๋ก POST
์์ฒญ์ ok
๊ฐ ๋๋๋ง ๋๋ค๋ฉด redirect
๊ฐ ์๋ ๊ฒ ์
๋๋ค.@Slf4j
@Controller
public class TestController {
@PostMapping("/test")
public String test() {
log.info("POST /test ํธ์ถ");
return "redirect:/hello";
}
@ResponseBody
@GetMapping("/hello")
public String hello() {
log.info("GET /hello ํธ์ถ");
return "ok";
}
}
์์ ๋ฅผ ํตํด Spring mvc๊ฐ ์ง์ํ๋ redirect
์ ํธ์๊ธฐ๋ฅ์ ์ข ๋ ์์๋ณผ๊ป์.
Redirect
๋ก ๋ค๋ฅธ URL๋ก ์ด๋์ ์์ฒญ ํ๋ผ๋ฏธํฐ๋ฅผ ํจ๊ป ๋๊ธฐ๊ณ ์ถ์ ๊ฒฝ์ฐ์๋ RedirectAttributes
๋ฅผ ์ฌ์ฉํฉ๋๋ค.Model
์ attribute๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ฒ๋ผ ๊ฐ์ key-value
์์ผ๋ก ์ ์ฅํ๊ณ ํ์ํ๋ค๋ฉด redirect
์ URL์ Path Variable
๋ก ๋๊ฒจ์ค๋๋ค.์ํ์์ธ์ ๋ณด ํ์ด์ง
๋ฅผ ๋ฟ๋ ค์ฃผ๋ ๊ธฐ๋ฅ์ ํฉ๋๋ค.์ํ์์ธ์ ๋ณด ํ์ด์ง
์ URL์ GET /items/{itemId}
์ด๋ฏ๋ก redirect
์ ์ํ์ ID๋ฅผ ํฌํจ์์ผ์ฃผ์ด์ผ ํฉ๋๋ค.RedirectAttributes
์ ์ถ๊ฐํ ๊ฐ์ ๋๊ฐ์ง ๋ฐฉ์์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.redirect url
์ ํฌํจ์ํค๋ ๋ฐฉ๋ฒ์
๋๋ค.itemId
๊ฐ 10์ด๋ผ๋ฉด redirect url
์ items/10
์ด ๋๊ฒ ์ง์.success
๋ฅผ true๋ก ์ค์ ํ์ฌ RedirectAttributes
์ ๋ด์์ง๋ง ์์ง ์ฌ์ฉํ์ง๋ ์์์ต๋๋ค.RedirectAttributes
์ ๋ด์์ง๋ง ์ฌ์ฉ๋์ง ์์ ๊ฐ์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ก ๋ถ๊ฒ ๋ฉ๋๋ค./items/10?success=true
๊ฐ ๋๊ฒ ๋ค์. @PostMapping("/items")
public String addItem(
@ModelAttribute Item item,
RedirectAttributes redirectAttributes) {
Item savedItem = itemRepository.save(item);
redirectAttributes.addAttribute("itemId", savedItem.getId());
redirectAttributes.addAttribute("success",true);
return "redirect:/items/{itemId}";
}
์๋ ์์ ๋ ์ฌ์ฉ์๋ก๋ถํฐ ์ํ ๋ฑ๋ก ์ ๋ณด
๋ฅผ ์
๋ ฅ๋ฐ์ DB์ ์ฅํ๊ณ ์ํ ๋ฑ๋ก ์ ๋ณด
๋ฅผ Model
์ ๋ด์ ๋ฐ๋ก View๋ฅผ ๋๋๋งํ๋ ๋ฐฉ์์
๋๋ค.
item
์ด๋ผ๋ View๊น์ง ์ ์์ ์ผ๋ก ๋๋๋ง๋์๋ค๊ณ ๊ฐ์ ํด๋ณผ๊ป์. ํด๋ผ์ด์ธํธ์ ๋ธ๋ผ์ฐ์ ์ View๊ฐ ๋ฟ๋ ค์ก์ ๋ ์ด๋ค URL์ ๊ฐ๊ณ ์์๊น์?POST /items
๋ฅผ ๊ทธ๋๋ก ๊ฐ๊ณ ์๋ ์ํ์
๋๋ค. ์ฆ ๋ง์ง๋ง ์์ฒญ์ด POST /items
์ธ ๊ฒ ์
๋๋ค. ์ด ์ํ์์ ์๋ก๊ณ ์นจ์ ์ํํ๋ค๋ฉด ๋ง์ง๋ง URL์ธ POST /items
๊ฐ ๋ ์์ฒญ๋ ๊ฒ์
๋๋ค.@PostMapping("/items")
public String addItem(@ModelAttribute Item item, Model model) {
Item savedItem = itemRepository.save(item);
model.addAttribute("item", savedItem);
return "item";
}
์ธํ๋ฐ ๊น์ํ๋์ ์คํ๋ง MVC 1ํธ ์ ์๊ฐํ๊ณ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.