티스토리 뷰
PRG패턴이 사용되는 이유와 방법에 대해서 살펴보고자 한다
PRG (Post/Redirect/Get) 패턴이 필요한 이유
만약 사용자가 상품을 구매하는 서비스를 이용하고 있다고 가정해보자
구매 이후에 클라이언트가 실수 혹은 의도적으로 새로고침을 한 경우에
웹 브라우저의 특성상 새로고침은 마지막으로 서버에 전송한 데이터를 다시 전송하게 된다
이때 아래와 같이 설계가 되어 있다면 새로고침 시에 구매 데이터가 한번 더 전송이 되어 중복 구매를 하게 되는 것이다
PRG (Post/Redirect/Get) 패턴
단어 그대로 Post -> Redirect -> Get 패턴으로 만들어지는 것을 PRG 패턴이라고 한다
위의 예시와 같은 상황에서 새로고침을 하였을 경우에 발생하는 문제를 해결하기 위해 사용한다
해결방법은 생각보다 매우 단순한데 아래와 같이 구매 완료 페이지로 Redirect 시켜 버리는 것이다
이렇게 되면 클라이언트는 아무리 새로고침을 하더라도 구매 완료라는 페이지(GET)만 보이기 때문에
기존에 구매 데이터를 다시 전송하는 일을 방지할 수 있다
RedirectAttributes
위의 예시처럼 구매 완료 페이지로 넘겨 구매가 완료 되었다는 것을 클라이언트가 인지하게 할 수도 있지만
스프링에서 제공하는 RedirectAttributes를 사용하면 메시지를 출력하여 알려줄 수도 있다
//컨트롤러
@PostMapping("/buy")
public String buyItem(RedirectAttributes redirectAttributes) {
redirectAttributes.addAttribute("status", true);
return "redirect:/example/thanks";
}
//뷰 템플릿 (thymeleaf)
<h2 th:if="${param.status}" th:text="'구매 완료'"></h2>
위의 예시처럼 addAttribute를 통하여 status를 전달하면 쿼리 파라미터를 담아 전달이 된다
뷰 템플릿에서 조건문을 사용하여 쿼리값을 확인하고 웹페이지에 메시지를 추가해서 클라이언트에게 응답한다
핵심정리
사용자가 새로고침을 할 경우에 웹 브라우저는 마지막에 보낸 데이터를 다시 서버 쪽으로 전송한다
이때 사용자가 마지막으로 전송한 데이터가 상품 등록, 구매 같은 데이터였다면
중복 등록, 구매 같은 문제가 발생한다
이때 PRG패턴을 사용하여
클라이언트가 해당 데이터를 전송하고 난 뒤에 Redirect로 GET을 수행하는 페이지로 넘어가게 설계하여
실수로 새로고침을 하더라도 의도치 않은 데이터가 다시 전송되는 것을 방지 할 수 있다
개인 학습을 위해 작성되는 글입니다.
제가 잘못 알고 있는 점에 대한 지적 / 더 나은 방향에 대한 댓글을 환영합니다.
참조 링크:
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
https://it-eldorado.tistory.com/68
'Spring > Spring MVC' 카테고리의 다른 글
[Spring MVC] Validation & Error Messages(검증 & 에러 메세지) (0) | 2021.09.07 |
---|---|
[Spring MVC] Message & Locale (0) | 2021.09.03 |
[Spring MVC] HTTP Response (HTTP 응답) (0) | 2021.08.30 |
[Spring MVC] HTTP Request Data(HTTP 요청 조회) (0) | 2021.08.30 |
[Spring MVC] HTTP Message Converters (HTTP 메시지 컨버터) (0) | 2021.08.28 |
- Total
- Today
- Yesterday
- 제이쿼리 인접 관계 선택자
- maenco
- DTO와 VO의 차이
- ExceptionHandlerExceptionResolver
- Spring API Error
- Session
- cookie
- 세션
- http
- Spring Container
- application/x-www-form-urlencoded
- 제이쿼리 탐색선택자
- spring
- ResponseStatusExeceptionResolver
- Spring MVC
- OOP
- DefaultHandlerExceptionResolver
- @ResponseStatus
- 쿠키
- 맨코
- Cache
- Spring TypeConverter
- jQuery 직접 선택자
- 캐시
- 제이쿼리 기본 선택자
- 제이쿼리란
- 제이쿼리 직접 선택자
- 제이쿼리 위치탐색선택자
- @ExceptionHandlere
- uri
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |