JAVA/Design Pattern

[디자인패턴] PRG (Post -> Redirect -> Get) pattern 이란?

빅콜팝 2022. 10. 23. 16:21
728x90
반응형

PRG 패턴은 POST > Redirect > Get 패턴으로 개발되는 것을 의미하며
개발 시 사용되도록 권장하고 있는 디자인 패턴이다.
PRG 패턴을 사용함으로써 사용자의 뒤로 가기, 새로고침으로 인한 중복 입력을 방지할 수 있다.

 

PRG 패턴 적용 전

 


사용자가 상품 주문을 수행한 주문 완료 페이지에서 새로고침을 수행할 경우
마지막 요청인 POST 주문입력 요청이 수행되어,
사용자가 새로고침을 수행할 때마다 DB에 저장되는 문제가 발생하게 된다.

 

PRG 패턴 적용 후

 


상품 주문 후 서버에서 주문 조회 페이지에 대한 Redirect를 수행하게 되어,
사용자가 주문 완료 페이지에서 새로고침을 하더라도 마지막 요청이 상품 조회 GET 요청이기 때문에
주문이 아닌 주문 조회 화면(GET)만 보여지게 된다.

 

 

PRG 패턴 전용 전

@GetMapping("/order")
public String order(){
    // 주문 페이지 이동
    return "order";
}

@ResponseBody
@PostMapping("/payment")
public String payment(){
    // 결제 처리
    return "success"; // 결제 결과 리턴
}


PRG 패턴 전용 후

@GetMapping("/order")
public String order(){
    // 주문 페이지 이동
    return "order";
}

@PostMapping("/payment")
public String payment(){
    // 결제 처리
    return "redirect:/paymentResult";
}

@GetMapping("/paymentResult")
public String paymentResult(){
    // 주문 완료 페이지 이동
    return "paymentResult";
}

 

 

RedirectAttributes

위의 예시처럼 주문 완료 페이지로 넘겨 주문이 완료 되었다는 것을 클라이언트가 인지하게 할 수도 있지만,
스프링에서 제공하는 Session을 사용하는 RedirectAttributes를 사용하면 메시지를 출력하여 알려줄 수도 있다.

 

//컨트롤러
@PostMapping("/payment")
public String buyItem(RedirectAttributes redirectAttributes) {
	redirectAttributes.addAttribute("status", true);
    return "redirect:/paymentResult";
}
//뷰 템플릿 (thymeleaf)
<h2 th:if="${param.status}" th:text="'주문 완료'"></h2>


위의 예시처럼 addAttribute를 통하여 status를 전달하면 쿼리 파라미터를 담아 전달이 된다
뷰 템플릿에서 조건문을 사용하여 쿼리값을 확인하고 웹페이지에 메시지를 추가해서 클라이언트에게 응답한다

728x90
반응형

'JAVA > Design Pattern' 카테고리의 다른 글

[디자인 패턴] 자바의 싱글톤 패턴 (static)  (0) 2022.11.04