PRG 패턴(Post/Redirect/Get)이란?
PRG 패턴(Post/Redirect/Get) 은 웹 애플리케이션에서 폼 데이터 전송 후 새로고침 시 중복 요청되는 문제를 해결하기 위한 설계 패턴임.
주로 사용자 입력(form submit) 처리 후, 서버에서 직접 응답을 반환하지 않고 리다이렉트(redirect) 를 수행함으로써 중복 제출을 방지하는 방식임.
1. PRG 패턴이 필요한 이유
상황 예시
- 사용자가 상품 등록 폼을 작성하고 POST 요청으로 제출함
- 서버가 처리하고 성공 페이지를 그대로 렌더링함
- 사용자가 브라우저 새로고침(F5) 을 누르면 같은 POST 요청이 다시 전송됨
- 상품이 중복 등록됨 → 중복 처리 문제 발생
→ PRG 패턴은 이 문제를 리다이렉트를 통해 해결함
2. PRG 패턴의 흐름
[사용자] -- POST --> [서버] -- 리다이렉트 --> [사용자] -- GET --> [서버] -- 결과 화면
단계 설명
- 사용자가 POST 방식으로 폼 데이터를 서버에 전송함
- 서버는 데이터를 처리한 후 바로 응답하지 않고, 302 Redirect 응답을 보냄
- 브라우저는 이 응답에 따라 지정된 URL로 GET 요청을 다시 보냄
- 서버는 이 GET 요청에 대해 성공 결과 화면을 응답함
→ 이렇게 하면 새로고침(F5) 시에도 GET만 반복되므로 중복 전송이 발생하지 않음
3. Spring MVC에서 PRG 패턴 적용 방법
예시: 상품 등록
@PostMapping("/items")
public String createItem(@ModelAttribute Item item) {
itemService.save(item);
return "redirect:/items/" + item.getId();
}
- @PostMapping 으로 받은 폼 데이터를 저장한 뒤,
"redirect:/..." 형식으로 리다이렉트를 반환함 - 이후 GET /items/{id} 가 호출되어 상세 페이지가 렌더링됨
4. PRG 패턴의 장점
장점 | 설명 |
중복 요청 방지 | POST → 새로고침 시 같은 요청이 반복되지 않음 |
브라우저 히스토리 정리 | POST 응답이 아닌 GET 결과만 저장되어 히스토리 문제 없음 |
UX 향상 | 사용자 경험 개선 및 예측 가능한 흐름 제공 |
명확한 책임 분리 | POST: 처리 / GET: 조회 → 코드 구조 명확해짐 |
5. 주의할 점 및 한계
- 리다이렉트 후 GET 요청으로 넘어가기 때문에 모델 데이터를 그대로 전달할 수 없음
→ RedirectAttributes 를 사용하거나 세션/쿼리파라미터로 전달해야 함
@PostMapping("/items")
public String createItem(@ModelAttribute Item item, RedirectAttributes redirectAttributes) {
itemService.save(item);
redirectAttributes.addAttribute("id", item.getId());
return "redirect:/items/{id}";
}
- 단일 요청보다 네트워크 요청 횟수가 늘어남 (POST → Redirect → GET)
6. 실무 활용 사례
- 회원가입 후 마이페이지 이동
- 댓글 작성 후 게시글로 리다이렉트
- 장바구니 추가 후 상품 목록으로 이동
- 폼 데이터 처리 후 상세 페이지 진입
모든 "입력 후 처리" → "결과 화면" 패턴에 적용 가능함
정리
PRG 패턴(Post/Redirect/Get)은 웹에서 POST 요청 후 직접 응답을 하지 않고, GET 요청으로 리다이렉트하여 중복 요청 문제를 예방하는 패턴임.
Spring MVC에서는 redirect: 키워드로 간단히 구현할 수 있으며, 사용자 경험과 데이터 안정성 모두를 고려할 때 실무에서 매우 중요하게 다뤄지는 패턴임.
출처 : ChatGPT
'BE > Spring & Spring Boot' 카테고리의 다른 글
[Spring Boot] HttpClient (0) | 2025.05.12 |
---|---|
[Spring Boot] 웹소켓 하트비트 (0) | 2025.05.07 |
[Spring Boot] CommandLineRunner (0) | 2025.05.05 |
[Spring Boot] 퍼사드 패턴 (0) | 2025.05.02 |
[Spring Boot] E2E 테스트 (0) | 2025.04.29 |