본문 바로가기
Language/php

PRG 패턴

by 잘먹는 개발자 에단 2025. 1. 31.

1. PHP에서는 POST 요청 이후 새로고침이 된다.

 

php에서 같은 파일에 post 요청을 처리하는 코드가 있을 때, 폼을 제출하면 페이지가 새로고침된다.

왜냐하면

- 사용자가 입력한 데이터를 폼을 통해 post로 보낸다.

- php가 post 요청을 받아서 처리한다.

- 브라우저는 응답을 받고 페이지를 다시 로드한다.

 

2. 문제점 : 새로고침하면 같은 post 요청이 다시 실행된다. 

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // 사용자가 입력한 데이터 받기
    $data = $_POST["data"];

    // 데이터베이스에 저장하는 코드 (예제)
    echo "저장된 데이터: " . htmlspecialchars($data);
}
?>

<form method="post">
    <input type="text" name="data">
    <button type="submit">전송</button>
</form>

 

예를 들어 이런 코드가 있다고 해보자. 데이터베이스에 어떤 데이터를 저장하는 코드다.

이 코드는 잠재적인 문제가 있는데,

- 사용자가 폼을 입력하고 전송버튼을 누르면 post 요청이 서버로 간다.

- php가 데이터를 받아서 출력 ( 또는 저장 )

- 이 상태에서 새로고침하면 이전 post 요청이 다시 실행된다.

    ㄴ 즉, 데이터가 중복으로 저장될 가능성이 있다.

 

 

3. 해결방법 : PRG 패턴 ( POST - Redirect - GET ) 

 

이 문제를 해결하려면 PRG 해턴을 사용해야 한다.

 

** PRG 패턴이란?

- 사용자가 폼을 입력하고 전송 버튼을 누르면 POST 요청이 발생한다.

- php가 데이터를 처리한 후, header("Location:...")을 사용해 다시 같은 페이지로 이동한다. ( 리다이렉트 )

- 이제 페이지가 새로 로드되지만 GET 요청이기 때문에 POST 데이터가 다시 전송되지 않는다. 

 

이렇게 하면 새로고침해도 데이터가 중복 저장되지 않는다. 

 

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // 사용자가 입력한 데이터 받기
    $data = $_POST["data"];

    // 데이터베이스에 저장하는 코드 (예제)
    echo "저장된 데이터: " . htmlspecialchars($data);

    // POST → GET 으로 바꾸기 위해 리디렉트
    header("Location: " . $_SERVER['PHP_SELF']);
    exit(); // 이후 코드 실행 방지
}
?>

<form method="post">
    <input type="text" name="data">
    <button type="submit">전송</button>
</form>

 

 

 

1. 폼을 제출하면 POST 요청이 발생

사용자가 input에 입력한 값이 서버로 전송됨

2. PHP가 POST 데이터를 받아서 처리

여기선 그냥 출력하는 예제지만, 실제로는 데이터베이스에 저장할 수도 있음

3. header("Location: ...")로 현재 페이지를 다시 로드

이때 GET 요청으로 변경됨 → POST 요청이 다시 실행되지 않음!

4. exit();을 추가해 불필요한 코드 실행을 방지

header() 이후에도 코드가 실행되면 안 되기 때문!

 

 

✔ 새로고침해도 같은 POST 요청이 다시 실행되지 않음 → 중복 저장 방지

✔ 사용자 경험이 더 좋아짐 → “다시 제출하시겠습니까?” 알림이 안 뜸

✔ 데이터 처리가 깔끔하게 정리됨