먼저 PRG 패턴이 뭔가요?
PRG 패턴은 Post/Redirect/Get의 줄임말로, 클라이언트가 POST 요청으로 데이터를 변경한 뒤 바로 결과 화면을 반환하지 않고, Redirect를 통해 GET 요청으로 결과 페이지를 다시 조회하게 만드는 웹 개발 패턴이다.
상품을 등록하면 상품이 조회되고 상품 상세로 가는 플로우를 예로 들어보자!!!!!
웹 브라우저의 새로고침은 마지막 요청을 다시 수행하는 개념이다.
상품을 등록하고 마지막 API는 POST로 상품을 저장할 것이고, 새로고침시 계속 중복 저장이 될 것이다.
그럼 이 중복 문제를 어떻게 해결할 수 있을까???
상품 등록 페이지에서 상품을 서버에 POST API 호출 후 저장한다. PRG 패턴을 적용하면 상품 상세 페이지로 리다이렉트 시키고 그 상품의 상품 상세 페이지를 조회한다. 그 후 새로고침을 하면 마지막 API인 GET API가 호출돼 상품 상세 페이지가 계속 조회될 것이다.
PRG 패턴을 적용할 때 리다이렉트 URL에 값을 전달해야 하는 경우가 있다.
예를 들어 상품을 등록한 뒤, 등록된 상품의 상세 페이지로 이동하려면 저장된 상품의 id가 필요하다.
@PostMapping("/add")
public String addItem(
@ModelAttribute Item item,
RedirectAttributes redirectAttributes) {
Item savedItem = itemRepository.save(item);
redirectAttributes.addAttribute("itemId", savedItem.getId());
return "redirect:/basic/items/{itemId}";
}