-
[SPRING] PRG(POST/REDIRECT/GET)Back-end/Spring 2022. 3. 21. 16:46
안녕하세요! 이번 포스팅은 코드 없이 PRG의 개념에 대해서 알아보겠습니다
위와 같은 상황이 있다고 가정해봅시다.
클라이언트는 상품 등록 Form에 가서 주문을 하고 버튼을 누르면 컨트롤러에서 요청을 받아서 DB에 insert를 해주고 주문한 상품의 고유번호를 받아서 상품 상세 페이지를 고객에게 보여줍니다.
이 상태에서 새로고침 버튼을 누르게 되면 계속해서 상품이 주문되는 것을 확인할 수 있는데 이것은 심각한 결과를 초래할 수도 있습니다.
웹 브라우저의 새로 고침은 마지막에 서버에 전송한 데이터를 다시 전송합니다.
상품 등록 폼에서 데이터를 입력하고 저장을 선택하면 POST로 상품 데이터를 전송하고 이 상태에서 새로 고침을 또 선택하면 마지막에 전송한 POST로 상품 데이터를 서버로 다시 전송하기 때문에 내용은 같고 고유번호만 다른 상품 데이터가 계속 쌓이게 됩니다.
어떻게 해결 할 수 있을까요?
위의 사진처럼 새로 고침 문제를 해결하려면 상품 저장 후에 뷰 템플릿으로 이동하는 것이 아니라 상품 상세화면으로 리다이렉트를 호출해주면 됩니다.
웹 브라우저는 리다이렉트의 영향으로 상품 저장 후에 실제 상품 상세 화면으로 다시 이동합니다. 따라서 마지막에 호출한 내용이 상품 상세 화면인 GET으로 이동하게 됩니다.
이후 새로 고침을 해도 상품 상세 화면으로 이동하게 되므로 새로 고침 문제를 해결할 수 있습니다.
이런 문제 해결 방식을 PRG(POST/REDIRECT/GET)라고 합니다.
주의
"redirect:/basic/items/" + item.getId()
redirect에서 +item.getId()처럼 URL에 변수를 더해서 사용하는 것은 URL 인코딩이 안되기 때문에 위험합니다.
다음과 같이 코드를 변경해줍니다.
RedirectAttributes
RedirectAttributes를 사용하면 URL 인코딩도 해주고 pathVariable, 쿼리 파라미터까지 처리해줍니다.
'Back-end > Spring' 카테고리의 다른 글
[Spring] 서블릿(Servlet)의 필터(Filter)기능 소개 (0) 2022.04.11 [Spring] 메시지, 국제화 (0) 2022.03.28 [Spring] HTTP 메시지 컨버터 (0) 2022.03.21 [Spring] HTTP 요청 파라미터(RequestParam, PathVariable, ModelAttribute, RequestBody, ResponseBody, RestController, HttpEntity) - 쿼리 파라미터, HTML Form (0) 2022.03.21 [Spring] HTTP 요청 - 기본, 헤더 조회 (0) 2022.03.21