반응형
PRG 패턴이란?
Post -> Redirect -> Get 패턴으로 만들어지는 것을 말하며, 권장되는 디자인 패턴 중 하나다.
PRG 패턴의 필요성
예를 들어 상품 판매 서비스를 운영하고 있다고 하자.
주문 페이지를 호출하고, Post 방식으로 결제를 처리할 경우 결제 완료 페이지에서 실수 혹은 의도적으로 새로고침을 하게 되면 서버에 전송했던 데이터를 다시 전송하게 되어 중복 결제 처리가 될 수 있다.
자세한 프로세스는 아래 포스팅을 참고하자
PRG 패턴을 사용하지 않으면 위와 같은 새로고침으로 인한 중복 요청 이슈도 있고, 요청 결과에 해당하는 페이지를 공유하는 것이 어려워진다는 문제점이 있다. 기본적으로 사용자는 URL만 가지고는 GET 방식의 요청 밖에 할 수 없어 POST 방식의 URL은 공유하더라도 다른 페이지로 이동하는 결과가 나타난다.
간단하게 PRG 패턴 적용 전, 후의소스를 비교해보자.
PRG 패턴 적용 전 소스
@Controller
class TestController {
@GetMapping("/order")
public String order(){
//주문 페이지 호출
return "order";
}
@PostMapping("/buy")
public String buy(){
// 결제 처리
return "result message"; //결제 처리 결과를 리턴
}
}
PRG 패턴 적용 전 소스
사용자가 결제를 하게 되면 'xxx.com/buy' 라는 url이 호출되며, 결제 프로세스가 진행되고, 결제 처리 결과가 리턴된다.
하지만 url은 'xxx.com/buy'로 동일하게 남아 있기 때문에 새로고침했을 경우 다시 결제 요청이 되며 중복 결제가 발생한다.
PRG 패턴 적용 후 소스
@Controller
class TestController {
@GetMapping("/order")
public String order(){
//주문 페이지 호출
return "order";
}
@PostMapping("/buy")
public String buy(){
// 결제 처리
return "redirect:/buy-result";
}
@GetMapping("/buy-result")
public String buyResult(){
//결제 결과 페이지 호출
return "buyResult";
}
}
728x90
반응형
'개발 > Web' 카테고리의 다른 글
[Spring] @Transactional이 적용되지 않을 경우(롤백이 안되는 이유) (0) | 2022.01.13 |
---|---|
[Web] redirect시 데이터 전달하는 방법 - RedirectAttributes (0) | 2022.01.07 |
[JBoss] 로깅 문제, 자체적으로 사용하는 로그 라이브러리 제외하기 (0) | 2021.12.31 |
[Spring Framework] CSRF 적용 (1) | 2021.12.14 |
하나의 tomcat에 같은 프로젝트 두개 이상 띄우기 : 'webapp.root' 에러 (0) | 2021.12.13 |
댓글