Language/php

PRG 패턴

잘먹는 개발자 에단 2025. 1. 31. 16:10

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 요청이 다시 실행되지 않음 → 중복 저장 방지

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

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