PRG 패턴
PRG는 사용자가 데이터를 제출(POST)한 후, 결과 페이지를 직접 보여주는 대신 다른 URL로 리다이렉트(redirect)하여 GET 요청을 수행하는 설계 패턴입니다. 이 과정은 크게 세 단계로 나뉩니다.
- POST 요청 : 사용자가 데이터를 제출합니다. 예를 들어, 폼(form)을 통해 상품 주문 정보를 서버로 전송합니다.
- 리다이렉트(redirect) : 서버는 데이터를 처리한 뒤 클라이언트(사용자의 브라우저)에게 다른 URL로 이동하라고 응답합니다.
- 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";
}
주의 사항
- 리다이렉트 URL에서 중요한 데이터 노출 방지
- 리다이렉트 URL에 민감한 정보를 포함하지 마세요.
- 쿼리 파라미터로 데이터를 전달하는 방식(ex. /order/confirmation?orderId=123)대신 세션이나 RedirectAttributes를 사용하세요.
- 세션 (Session) : 서버 간의 지속적인 데이터 저장 및 상태 유지
- RedirectAttributes : 리다이렉트 이후 잠깐 데이터를 전달
- 플래시 데이터의 유효성 : 플래시 데이터는 한 번의 요청에서만 사용할 수 있습니다. 이후 요청에서는 사라집니다.
출처
OpenAI의 ChatGPT (https://openai.com)
반응형
'Java Framework > Spring Boot' 카테고리의 다른 글
[Spring Boot] JpaRepository Optional (0) | 2025.03.02 |
---|---|
[Spring Boot] Thymeleaf 템플릿 상속 (Template Inheritance) (0) | 2025.02.06 |
[Spring Boot] DTO(Data Transfer Object) (0) | 2024.12.17 |
[Spring Boot] Thymeleaf 속성 (0) | 2024.12.16 |
[Spring Boot] 템플릿 엔진 (Template Engines) (1) | 2024.12.15 |