- Spring MVC Redirect, PRG2022년 05월 06일
- starryeye
- 작성자
- 2022.05.06.:11
반응형Redirect
클라이언트가 서버로 어떤 요청(A)을 보냈을 경우,
서버가 특정 로직의 결과로 B로 다시 요청을 보내라고 지시하는 것을 의미 한다.
(서버 : 클라이언트야 URL 바꿔라!)
PRG 방식
Post / Redirect / Get 을 의미 한다.
웹 클라이언트(브라우저)에서 서버로 상품을 등록하는 기능을 예시로 들겠다.
(등록 하면, 상품의 상세 뷰가 보인다.)
<로직>
클라이언트가 Post 메서드 방식으로 서버로 요청을 보내며 상품 등록을 한다.
-> 상품 등록(저장) 컨트롤러가 호출된다.
-> 컨트롤러에서 상품이 실제 DB에 저장이된다.
-> 상품 상세 뷰를 클라이언트에게 보여준다.
<문제점>
클라이언트에서 정상적으로 상품 등록을 마치고 상품 상세 뷰 화면에서 새로고침을 한다.
-> 상품이 중복되어 또 등록된다. (상품 등록 컨트롤러가 재 호출됨)
<이유>
웹 클라이언트에서는 상품 등록 컨트롤러가 호출되는 순간부터 상품 상세 뷰가 나올때 까지,
URL이 변경되지 않았다.
(웹 브라우저에서는 마지막 요청 URL(상품 저장 URL)이 남는다.)
(새로고침은 마지막으로 했던 요청을 다시 하는 것이다.)
<해결>
PRG 방식 도입
상품 등록 컨트롤러에서 상품 상세 뷰를 리턴할 때, 리다이렉트를 사용한다.
리다이렉트로 상품 상세 뷰를 GET 하는 URL을 적용한다.
-> 새로고침을 해도 상품 상세 뷰를 GET하는 요청이 다시 수행된다.
RedirectAttributes
리다이렉트 시, 여러 속성을 넣을 수 있는 객체이다.
컨트롤러에 파라미터로 RedirectAttributes 객체를 받는다.
addAttribute로 Model 객체처럼 사용한다. (key, value)
return 에 "redirect:/ ~~ " 로 사용된다.
RedirectAttributes 객체에 넣은 key가 return에 존재한다면 그 자리에 그대로 들어간다.
(경로 변수로 바인딩 된다.)
만약 위 예시의 status 처럼 없다면, 쿼리파라미터 형식으로 들어간다.
(위 예시 결과, http://localhost:8080/basic/items/3?status=true)
<주의>
return "redirect:/basic/items/" + item.getId() 처럼 사용한다면..
-> 여기서는 id가 int 라 상관 없지만, 문자가 들어가거나 하면 URL 인코딩이 안되기 때문에 위험하다.
-> 하지만, RedirectAttributes를 사용하면 이러한 문제가 해결된다.
<타임리프>
RedirectAttributes 예시에서 쿼리파라미터로 status, true를 넘겼다.
타임리프에서는 Http 요청 URL 쿼리 파라미터를 워낙 많이 쓰기 때문에 위 예시 처럼 지원이 된다.
(model에 따로 넣지 않아도 param key로 받을 수 있다.)
th:if=${param.status} th:text="~~"
-> 쿼리파라미터에 status 키가 존재하고 해당 value가 true 이면 th:text 출력하겠다.
반응형'Spring > MVC' 카테고리의 다른 글
Spring MVC 마스터하기 Validation 2 (0) 2022.05.08 Spring MVC 마스터하기 Validation 1 (0) 2022.05.08 Spring MVC 마스터하기 4 (0) 2022.04.24 Spring MVC 마스터하기 3 (응답 부분) (0) 2022.04.22 Spring MVC 마스터하기 2 (요청 부분) (0) 2022.04.19 다음글이전글이전 글이 없습니다.댓글