HJW's IT Blog

PRG Pattern 은 왜 사용할까? 본문

개발 개념

PRG Pattern 은 왜 사용할까?

kiki1875 2025. 1. 16. 13:20

들어가며

HTTP Post 메서드는 기본적으로 멱등성(idempotence)이 보장되지 않는 메서드 이다. 여기서 멱등성이란 같은 요청이 여러번 반복되어 실행되더라도 결과가 변하지 않는 속성을 의미한다.

예를 들어 클라이언트가 웹 양식을 서버에 제출하고, 서버는 이에 대한 응답을 보냈다고 가정하자. 이 상태에서 클라이언트가 웹페이지를 새로고침 한다면 어떻게 될까?

바로 전과 같은 양식으로 동일한 데이터를 서버로 보낸다

위와 같은 상황이 발생하면, 동일한 개시글 업로드, 중복된 결재 등의 문제를 야기할 수 있다.

PRG Pattern 이란?

PRG 는 Post / Redirect / Get 의 약어이다. 위와 같은 상황에서 데이터 중복 문제를 방지하기 위한 디자인 패턴으로 흐름은 다음과 같다.

  1. 사용자가 POST 요청을 보낸다
  2. 서버는 데이터를 처리한 뒤 HTTP 302 redirect 응답을 보낸다
  3. Client 는 Get 요청으로 최종 결과 페이지를 요청하게 된다

 

이제 사용자가 새로고침을 하더라도, 이전 양식을 다시 보내는 것이 아닌, redirect 된 Get 요청을 다시 보내게 되는 것이다.

  @PostMapping("/add")
  public String addItemV3(@ModelAttribute Item item){
    itemRepository.save(item);
    return "basic/item";
  }

위 코드는 PRG 패턴을 적용하지 않은 코드이다. 해당 경로로 POST 요청이 들어오면, item 을 model 에 담아 명시된 경로의 view 를 렌더링 하는데, 이때 새로고침을 하게 되면, 동일한 데이터로 다시 POST 요청을 하게 된다. PRG 패턴을 적용하면 다음과 같다.

@PostMapping("/add")
public String addItemV5(Item item) {
 itemRepository.save(item);
 return "redirect:/basic/items/" + item.getId();
}

PRG Pattern 장점

PRG Patten 을 사용함으로써 얻을 수 있는 장점은 크게 3가지 이다.

  • 데이터 중복 방지
    • 이미 언급했지만, 이 패턴의 핵심은 동일 데이터를 서버로 여러번 보내는 상황을 원천적으로 차단하는데에 있다. POST 후 GET 을 통한 리다이렉션으로 클라이언트가 새로고침을 하더라도 POST 가 아닌 GET 으로 재요청을 보내는 것이다. 즉, 같은 데이터를 보내는 것이 방지되는 것이다.
  • 서버 안정성 향상
    • PRG 패턴은 서버 입장에서도 안정성을 가져다 준다. 만약 PRG 패턴이 없는 상황에서 클라이언트가 계속하여 새로고침을 누른다면, 새로고침 한번당 서버는 불필요한 데이터를 처리해야 한다.
  • 브라우저 동작과 UX 일관성
    • 사용자 입장에서도, 새로고침을 하였을 때, “이 데이터를 다시 제출하시겠습니가?” 라는 문구가 나온다면 혼란스러워 진다.