쌓고 쌓다

PRG(Post-Redirect-Get) 패턴 본문

프로그래밍/spring

PRG(Post-Redirect-Get) 패턴

승민아 2023. 8. 15. 15:29

문제 발생!

먼저 가상으로 발생한 문제를 보자.

@PostMapping("add")
public String addItem(@ModelAttribute Item item) {
    itemRepository.save(item);
    return "basic/item";
}

폼 데이터와 함께 POST 요청이 들어왔다.

이 item을 저장하고 Model에 item을 담아 상품 상세 페이지를 보여준다.

 

상품 상세

이때 내부호출로. Model에 담아 렌더링하여 보여주는 방식이라 URL은 그대로 유지된다.

 

 

여기서 새로고침을 반복하면 

상품이 계속적으로 추가되어 상품ID가 증가하는 모습이 보인다.

위의 addItem 메서드에 문제가 있는것이다.

 

문제 발생 구조 (출처: 인프런-김영한)

상품 폼을 작성하고 POST 요청을 보냈다.

그리고 서버 내부호출로 렌더링된 상품 상세 페이지를 응답으로 받게된다.

 

이때 웹 브라우저의 새로고침을 누르면 마지막으로 보낸 요청인 데이터 전송을 다시 수행하게 된다.

그래서 새로고침마다 상품이 계속 등록되어 추가되는것이다.

PRG 패턴으로 이 문제를 해결해보자.

PRG(Post, Redirect, Get) 적용

상품을 POST 보내면 Redirect로 상품 상세 페이지를 GET 요청하게 바꾸자.

이것이 PRG 패턴이다.

 

PRG 패턴 적용

@PostMapping("add")
public String addItemV5(Item item) {
    itemRepository.save(item);
    return "redirect:/basic/items/" + item.getId(); // PRG 적용
}

이제 redirect로 /basic/items/{id}로 리다이렉션을 하기에

새로고침을해도 POST 요청이 아닌 "/basic/items/{id}"로 GET 요청을 보낸다.

Comments