BE/Spring & Spring Boot

[Spring Boot] PRG 패턴

baek-dev 2025. 5. 6. 13:11

PRG 패턴(Post/Redirect/Get)이란?

PRG 패턴(Post/Redirect/Get) 은 웹 애플리케이션에서 폼 데이터 전송 후 새로고침 시 중복 요청되는 문제를 해결하기 위한 설계 패턴임.
주로 사용자 입력(form submit) 처리 후, 서버에서 직접 응답을 반환하지 않고 리다이렉트(redirect) 를 수행함으로써 중복 제출을 방지하는 방식임.


1. PRG 패턴이 필요한 이유

상황 예시

  1. 사용자가 상품 등록 폼을 작성하고 POST 요청으로 제출함
  2. 서버가 처리하고 성공 페이지를 그대로 렌더링
  3. 사용자가 브라우저 새로고침(F5) 을 누르면 같은 POST 요청이 다시 전송
  4. 상품이 중복 등록됨 → 중복 처리 문제 발생

→ PRG 패턴은 이 문제를 리다이렉트를 통해 해결함


2. PRG 패턴의 흐름

[사용자] -- POST --> [서버] -- 리다이렉트 --> [사용자] -- GET --> [서버] -- 결과 화면

단계 설명

  1. 사용자가 POST 방식으로 폼 데이터를 서버에 전송함
  2. 서버는 데이터를 처리한 후 바로 응답하지 않고, 302 Redirect 응답을 보냄
  3. 브라우저는 이 응답에 따라 지정된 URL로 GET 요청을 다시 보냄
  4. 서버는 이 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