Java Framework/Spring Boot

[Spring Boot] PRG 패턴

annovation 2024. 12. 20. 12:55

PRG 패턴

PRG는 사용자가 데이터를 제출(POST)한 후, 결과 페이지를 직접 보여주는 대신 다른 URL로 리다이렉트(redirect)하여 GET 요청을 수행하는 설계 패턴입니다. 이 과정은 크게 세 단계로 나뉩니다.

  1. POST 요청 : 사용자가 데이터를 제출합니다. 예를 들어, 폼(form)을 통해 상품 주문 정보를 서버로 전송합니다.
  2. 리다이렉트(redirect) : 서버는 데이터를 처리한 뒤 클라이언트(사용자의 브라우저)에게 다른 URL로 이동하라고 응답합니다.
  3. GET 요청 : 클라이언트는 리다이렉트된 URL에 접근하여 결과 페이지를 봅니다.

왜 필요할까요?

  • 중복 데이터 처리 방지 : 사용자가 새로고침할 때마다 동일한 POST 요청이 반복되지 않도록 합니다.
  • 사용자 경험 개선 : 잘못된 새로고침으로 인해 발생할 수 있는 혼란(ex. "결제가 여러 번 처리되었습니다")을 예방합니다.
  • URL 공유 가능 : 결과 페이지가 GET 요청으로 구성되어 있어, 사용자가 해당 URL을 북마크하거나 공유할 수 있습니다.

예시

1. POST 요청 처리

사용자가 주문 폼을 제출하면 서버는 POST 요청을 처리하고 데이터를 저장합니다. 처리 후에는 리다이렉트 URL을 클라이언트에 반환합니다.

@PostMapping("/order")
public String submitOrder(OrderRequest orderRequest, RedirectAttributes redirectAttributes) {
    // 1. 주문 데이터 저장
    Order order = orderService.createOrder(orderRequest);

    // 2. 결과 메시지 설정 (리다이렉트 URL에 전달)
    redirectAttributes.addFlashAttribute("message", "주문이 성공적으로 완료되었습니다!");

    // 3. 리다이렉트
    return "redirect:/order/confirmation";
}
  • RedirectAttributes : 리다이렉트 시 임시 데이터를 전달할 때 사용합니다. 이 데이터는 GET 요청에서만 유효합니다.

2. GET 요청 처리

리다이렉트된 URL로 접속한 사용자는 결과 페이지를 확인합니다.

@GetMapping("/order/confirmation")
public String showConfirmationPage(Model model) {
    // 결과 메시지와 주문 확인 페이지를 렌더링
    return "orderConfirmation";
}

주의 사항 

  1. 리다이렉트 URL에서 중요한 데이터 노출 방지
    • 리다이렉트 URL에 민감한 정보를 포함하지 마세요.
    • 쿼리 파라미터로 데이터를 전달하는 방식(ex. /order/confirmation?orderId=123)대신 세션이나 RedirectAttributes를 사용하세요.
      • 세션 (Session) : 서버 간의 지속적인 데이터 저장 및 상태 유지
      • RedirectAttributes : 리다이렉트 이후 잠깐 데이터를 전달
  2. 플래시 데이터의 유효성 : 플래시 데이터는 한 번의 요청에서만 사용할 수 있습니다. 이후 요청에서는 사라집니다.

출처

OpenAI ChatGPT (https://openai.com)

 

반응형