Spring PRG 패턴 (Post/Redirect/Get)

YUNU·2023년 11월 3일
0

스프링

목록 보기
31/33
post-thumbnail

📒 PRG 패턴

일시적인 리다이렉션이 꼭 필요한 경우에 사용

🔹 문제 상황

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편 - 백엔드 웹 개발 핵심 기술 (김영한) 참조

profile
DDeo99

0개의 댓글