일시적인 리다이렉션이 꼭 필요한 경우에 사용
POST로 주문 후에 웹 브라우저를 새로고침하면 중복 주문 발생 가능
웹 브라우저의 새로고침은 마지막에 서버에 전송한 데이터를 다시 전송하는 것
상품 구매 후에 새로고침을 선택하면 마지막에 전송한 POST /buy + 상품 데이터를 서버로 다시 전송함
새로고침을 할 때마다 중복 구매가 수행될 것
POST로 주문 후에 주문 결과 화면을 GET 메서드로 리다이렉트하여 중복 주문 방지
➡️ 새로고침을 누르더라도 결과 화면만 GET으로 재요청 될 것
클라이언트 POST로 주문 요청
➡️ 주문 데이터 DB 저장
➡️ 요청에 대한 응답으로 Location 포함해서 전송
➡️ 클라이언트는 해당 URL로 자동 리다이렉트
➡️ 클라이언트는 GET으로 요청 보냄
➡️ 서버는 주문 데이터 DB에서 조회
➡️ 서버는 요청에 대한 응답 보냄
@PostMapping("/buy")
public String buyItems(Item item, RedirectAttributes redirectAttributes) {
//...
redirectAttributes.addAttribute("itemId", buyItem.getId());
redirectAttributes.addAttribute("status", true);
return "redirect:/item/{itemId};
// 리다이렉트 결과 : http://localhost:8080/item/itemId?status=true
"redirect:/item/" + item.getId(); 와 같은 형식으로 사용하게 되면
URL에 더해진 변수 부분은 URL 인코딩이 안되기 때문에 보안에 좋지 않음
따라서 RedirectAttributes를 사용
RedirectAttributes를 통해 URL 인코딩, pathVariable 바인딩, 쿼리 파라미터 처리 가능
컴퓨터 아이콘 제작자: Freepik - Flaticon
인프런 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 (김영한) 참조