Post - Redirect - Get
- Post 요청 핸들러에서 HTML을 바로 return한다면 생기는 문제
- 새로 고침을 하게 되면 같은 Post 요청이 반복된다.
- Post 요청이므로 계속 새로운 Data가 입력된다.
- HTTP POST Method는 멱등성이 보장되지 않기 때문에 요청마다 새로운 데이터를 입력하게 된다.
- 해결 방법으로 PRG 패턴이 나온 것(Post - Redirect - Get)
- PRG 패턴
- redirect를 활용하여 마지막 Post 호출에 대한 내용을 Get에 대한 호출로 상세화면 등을 보여주는 URL로 리턴한다.
- 이렇게 GET 요청으로 끝나면, 새로고침을 하고 같은 요청을 계속 보내도 데이터의 변경이 없다.
- HTTP POST Method 이 외에 다른 Method는 멱등성을 보장한다.
RedirectAttributes
- RedirectAttributes를 사용하면 Get 요청에 대하여 attribute를 만들어서 사용할 수 있다.
@PostMapping("/add") public String addItem(Item item, RedirectAttributes redirectAttributes) { Item savedItem = itemRepository.save(item); redirectAttributes.addAttribute("itemId", savedItem.getId()); redirectAttributes.addAttribute("status", true); return "redirect:/basic/items/{itemId}"; }
- 요청 URL
http://localhost:8080/basic/items/3?status=true
- 파라미터
- 요청 URL에 status라는 파라메터를 넘겨준 것을 확인할 수 있다.
- URL 인코딩
- itemId가 PathVariable로 들어간 것을 확인할 수 있다.
- URL 인코딩도 해주고, PathVariable, 쿼리 파라미터까지 처리한다.
- 요청 URL
** 참고: 스프링 MVC - 백엔드 웹 개발 핵심 기술