본문 바로가기
Spring Tutorial

[스프링MVC -상품 관리 웹 개발 7] PRG - Post/Redirect/Get

by 미소5 2023. 9. 1.

[스프링MVC 상품 관리 웹 페이지 5] 상품 등록 처리 - @ModelAttribute (tistory.com)

 

[스프링MVC 상품 관리 웹 페이지 5] 상품 등록 처리 - @ModelAttribute

[스프링MVC - 상품 관리 웹 페이지 만들기 4] 상품 등록 폼 (tistory.com) [스프링MVC - 상품 관리 웹 페이지 만들기 4] 상품 등록 폼 컨트롤러 로직 추가 /** 상품 등록 폼*/ @GetMapping("/add") public String addForm

joly156.tistory.com

상품 등록을 완료하고 웹 브라우저의 새로고침 버튼을 클릭하면. 상품이 계속해서 중복 등록되는 문제

  • 원인은?
    • 웹 브라우저의 새로 고침마지막에 서버에 전송한 데이터를 다시 전송한다.
    • 상품 등록 폼에서 데이터를 입력하고 저장을 선택하면 'POST /add' + 상품 데이터 를 서버로 전송한다. 이 상태에서 새로 고침을 또 선택하면 마지막에 전송한 'POST /add' + 상품 데이터 를 서버로 다시 전송하게 된다.  →내용은 같고, ID만 다른 상품 데이터가 계속 쌓이게 된다.

등록 후 새로 고침

 


  • 어떻게 해결할 수 있을까?
  • 새로 고침 문제를 해결하려면,  상품 저장 후에 뷰 템플릿으로 이동하는 것이 아니라, 상품 상세 화면으로 리다이렉트를 호출해주면 된다.
    • 웹 브라우저는 리다이렉트의 영향으로 상품 저장 후에 실제 상품 상세 화면으로 다시 이동한다. 따라서 마지막에 호출한 내용상품 상세 화면인 GET /items/{id} 가 되는 것이다. 

Redirect

 


  • 컨트롤러 로직 추가
/**
  * 상품 등록 처리 이후에 뷰 템플릿이 아니라 상품 상세 화면으로 리다이렉트 하도록.
  * 이런 문제 해결 방식을 PRG 라 한다.
  */
 @PostMapping("/add")
 public String addItemV5(Item item) {
     itemRepository.save(item);
     return "redirect:/basic/items/" + item.getId(); //상품상세화면으로 다시 이동
}

 

  • "redirect:/basic/items/" + item.getId() 에서 +item.getId() 처럼 URL에 변수를 더해서 사용하는 것은 URL 인코딩이 안되기 때문에 위험하다. → RedirectAttributes를 사용하자.

 

[스프링MVC 상품 관리 웹 페이지 8] RedirectAttributes (tistory.com)

 

[스프링MVC 상품 관리 웹 페이지 8] RedirectAttributes

[스프링MVC 상품 관리 웹 페이지 7] PRG - Post/Redirect/Get (tistory.com) [스프링MVC 상품 관리 웹 페이지 7] PRG - Post/Redirect/Get [스프링MVC 상품 관리 웹 페이지 5] 상품 등록 처리 - @ModelAttribute (tistory.com) [스

joly156.tistory.com

 



[스프링MVC 상품 관리 웹 페이지 1] 상품 도메인 개발 (tistory.com)

 

[스프링MVC 상품 관리 웹 페이지 1] 상품 도메인 개발

요구사항 상품 도메인 모델 상품 ID, 상품명, 가격, 수량 상품 관리 기능 상품 목록, 상품 상세, 상품 등록, 상품 수정 핵심 비즈니스 로직 (상품 도메인) 을 개발해보자. 상품 객체 //@Data @Getter @Sett

joly156.tistory.com

 

728x90
반응형