코드이그나이터4 컨트롤러 다루기 - 5 - POST 데이터 읽기

고은연·2021년 3월 8일
1

본 챕터의 코드는 https://github.com/koeunyeon/ci4/tree/request_post_read 에서 보실 수 있습니다.

POST 데이터 읽기

웹 개발에서는 리소스의 조회를 요청하는 GET 외에도 리소스의 변경을 요청하는 POST 요청도 자주 쓰입니다. 이번 챕터에서는 POST 데이터를 읽는 방법을 확인해 보겠습니다.
흐름은 아래와 같습니다.


데이터를 입력할 폼 화면을 만들어 보겠습니다.
먼저 Sample 컨트롤러에 아래의 메소드를 추가합니다.
/app/Controllers/Sample.php

public function postform(): string
{
    return View("/postForm");
}

컨트롤러에서 /postForm 뷰를 반환했으므로 postForm.php뷰 파일도 생성하겠습니다.
app/Views/postForm.php

<form method="post" action="/sample/postinput"> <!-- // (1) -->
    <p>name : <input type="text" name="name" /></p> <!-- // (2) -->
    <p>age : <input type="text" name="age" /></p> <!-- // (3) -->
    <p><input type="submit" value="입력" /></p> <!-- // (4) -->
</form> <!-- // (5) -->

(1) <form 태그를 통해 <form태그 내부의 태그 값이 서버로 전송될 때 HTTP 메소드를 POST로 선언(method="POST")합니다. 회원가입 버튼이 클릭되면 name, age 두 속성이 서버로 전송됩니다.

<form method="post" action="/sample/postinput">

action 속성은 서버의 URL을 나타냅니다. 위 코드에서는 명시적으로 /sample/postinput 페이지를 지정했습니다.
만약 action 속성이 생략될 경우 현재 페이지가 됩니다. 즉 현재 주소가 /sample/postform URL 이라면 /sample/postform 주소로 <form 태그 내부의 값을 전달하겠다는 의미가 됩니다.

(2) name 입력창을 나타내기 위해 <input type="text" 태그를 사용합니다.

<p>name : <input type="text" name="name" /></p>

name 속성은 서버로 전달되는 가 됩니다. 만약 사용자가 name입력란에 "ci4"라고 입력했다면, 서버로 전송시에 name=ci4 형태로 전달됩니다.

(3) age 입력창을 나타내기 위해 <input type="text" 태그를 사용합니다. 만약 age 입력란에 "5"라고 입력했다면 서버로 POST 데이터가 전달될 때 age=5 형태로 전달됩니다.

<p>age : <input type="text" name="age" /></p>

(4) <input type="submit" 태그는 클릭하면 서버로 데이터를 제출(submit) 하는 버튼 태그입니다. value 속성은 버튼의 글자를 나타냅니다.

<p><input type="submit" value="입력" /></p>

(5) </form> 태그를 닫았습니다.

</form>

폼 태그 안의 값만 서버로 전달되므로 (5) 이후의 값이 설정되어 있어도 서버로 전달되지 않습니다.
폼 태그 안의 값이 서버에 전달될 때는 POST 데이터이므로 HTTP 본문(body)에 실려 전달됩니다. 형태는 아래와 같습니다.

name=ci4&age=5

GET과 동일한 규격으로 전달되지만 주소창을 통해 전달되는 대신 HTTP 본문에 실려 전달된다는 점이 다릅니다.


마지막으로 HTML 폼에서 호출한 URL /sample/postinput을 처리할 수 있도록 컨트롤러에 메소드를 추가합니다.
/app/Controllers/Sample.php

public function postinput(): void // (1)
{
    $input_data = $this->request->getPost(); // (2)
    var_export($input_data); // (3)
}

(1) /postform 화면에서 전달받은 데이터를 처리하는 엔드포인트입니다. void 는 "반환값이 없다."라는 의미입니다.

(2) 코드이그나이터4에서 POST 데이터는 $this->request->getPost()로 읽을 수 있습니다. 기존 PHP에 익숙하다면 $_POST 변수를 떠올리면 됩니다.

(3) var_export 내장 함수로 입력받은 값을 출력해 봅니다. PHP 언어의 특성상 출력은 브라우저로 전달됩니다.


http://localhost:8080/sample/postform URL에 접속해서 확인해 보겠습니다.

이름과 나이를 입력하고 입력 버튼을 클릭해 봅시다.

profile
중년 아저씨. 10 + n년차 백엔드 개발자. 스타트업과 창업, 솔로프리너와 1인 기업에 관심 많아요.

1개의 댓글

comment-user-thumbnail
2022년 10월 13일

그대로 따라해보았는데.. 안되네요 ㅠㅠ ..
혹시나 제 소스랑 달라서 안되는건가 보려고 소스받아서 확인해보고있는데
혹시 Routers는 따로 건드시진 않으셨는데 그래도 상관이 없을까요?

답글 달기