PRG, RedirectAttributes

수정이·2022년 7월 27일
0

Spring

목록 보기
11/16
post-thumbnail

PRG - Post/Redirect/Get

Post 등록 후 새로 고침


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

이 문제를 해결하기 위해 다음과 같은 방법을 사용한다.

Post 등록 후 Redirect Get


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

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

RedirectAttributes

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

@PostMapping("/add")
public String addItemV6(Item item, RedirectAttributes redirectAttributes) {
	Item savedItem = itemRepository.save(item);
	redirectAttributes.addAttribute("itemId", savedItem.getId());
	redirectAttributes.addAttribute("status", true);
	return "redirect:/basic/items/{itemId}";
}

실행해보면 http://localhost:8080/basic/items/3?status=true 과 같은 리다이렉트 결과가 나온다.

RedirectAttributes

RedirectAttributes 를 사용하면 URL 인코딩도 해주고, pathVariable 과 쿼리 파라미터까지 처리해준다.

  • `redirect:/basic/items/{itemId}
    • pathVariable 바인딩 : {itemId}
    • 나머지는 쿼리 파라미터로 처리 : ?status=true

참고

김영한님의 스프링 MVC 1편

profile
공부는 꾸준히... 글쓰기도 꾸준히...

0개의 댓글