Study/Spring
PRG Post/Redirect/Get
lsh2613
2023. 8. 22. 03:38
Post Mapping 시 발생할 수 있는 문제로 등록폼에서 데이터를 가져와 디비나 로컬상에 저장하는 로직에서 쉽게 발견할 수 있다.
@PostMapping("/add")
public String addItemV3(@ModelAttribute Item item) {
itemRepository.save(item);
return "basic/item";
}
해당 메소드를 통해 데이터를 저장하는 데에 성공했다. 하지만 새로고침을 하면 어떻게 될까?
마지막 요청 리퀘스트를 다시 요청하기 때문에 기존 post 메소드로 이전에 작성했던 데이터를 그대로 다시 담아 request를 보낸다.
따라서 같은 데이터가 여러 개 생성됨을 확인할 수 있다.
즉 문제의 원인은 마지막 리퀘스트가 post이기 때문이다. 이를 Get으로 바꿔주기 위해 redirect로 변경해주면 해결된다.
@PostMapping("/add")
public String addItemV6(Item item, RedirectAttributes redirectAttributes) {
Item savedItem = itemRepository.save(item);
redirectAttributes.addAttribute("itemId", savedItem.getId());
redirectAttributes.addAttribute("status", true);
return "redirect:/basic/items/{itemId}";
}
추가로 RedirectAttributes redirectAttributes 매개변수 없이 바로
return "redirect:/basic/items/" + item.getId();
해도 되지만 변수를 직접 가져와 사용하는 것은 인코딩이 되지 않아 위험하다.
RedirectAttributes redirectAttributes을 사용하면 URL 인코딩도 해주고, pathVarible , 쿼리 파라미터까지 처리해준다.