HTTP 요청 다루기
CodeIgniter를 최대한 활용하려면 HTTP 요청과 응답이 어떻게 작동하는지에 대한 기본적인 이해가 필요합니다. 웹 애플리케이션을 개발할 때 항상 다루게 되는 것이 바로 이것이므로, 성공적인 개발자가 되고 싶다면 HTTP 이면의 개념을 이해하는 것은 필수입니다.
이 장의 첫 번째 부분에서는 개요를 설명합니다. 개념을 파악한 후에는 CodeIgniter 내에서 요청과 응답을 다루는 방법에 대해 논의하겠습니다.
HTTP란 무엇인가요?
HTTP는 단순히 두 기계가 서로 대화할 수 있게 해주는 텍스트 기반의 규칙(convention)입니다. 브라우저가 페이지를 요청하면, 서버에 해당 페이지를 가져올 수 있는지 묻습니다. 그러면 서버는 페이지를 준비하여 요청한 브라우저에 응답을 보냅니다. 이것이 전부입니다. 물론 더 복잡한 기능들도 사용할 수 있지만, 기본은 정말 간단합니다.
HTTP는 그러한 교환 규칙을 설명하는 용어입니다. HyperText Transfer Protocol의 약자입니다. 웹 애플리케이션을 개발할 때 여러분의 목표는 항상 브라우저가 무엇을 요청하는지 이해하고 적절하게 응답할 수 있는 능력을 갖추는 것입니다.
요청(Request)
클라이언트(웹 브라우저, 스마트폰 앱 등)가 요청을 보낼 때마다 서버에 작은 텍스트 메시지를 보내고 응답을 기다립니다.
요청은 다음과 같은 모습일 것입니다:
GET / HTTP/1.1
Host codeigniter.com
Accept: text/html
User-Agent: Chrome/46.0.2490.80
이 메시지에는 클라이언트가 무엇을 요청하는지 알 수 있는 데 필요한 모든 정보가 표시됩니다. 요청 방식(GET, POST, DELETE 등)과 지원하는 HTTP 버전을 알려줍니다.
또한 요청에는 클라이언트가 어떤 언어로 콘텐츠를 표시하고 싶은지, 어떤 형식을 수용할 수 있는지 등 다양한 정보를 담을 수 있는 여러 선택적 요청 헤더가 포함됩니다. 자세히 살펴보고 싶다면 위키백과의 모든 헤더 필드 목록 문서를 참조하세요.
응답(Response)
서버가 요청을 받으면 여러분의 애플리케이션은 그 정보를 가져와 어떤 출력을 생성합니다. 서버는 여러분의 출력을 클라이언트에 대한 응답의 일부로 묶습니다. 이것 또한 다음과 같은 간단한 텍스트 메시지로 표현됩니다:
HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Thu, 05 Nov 2015 05:33:22 GMT
Content-Type: text/html; charset=UTF-8
<html>
. . .
</html>
응답은 클라이언트에게 어떤 버전의 HTTP 사양을 사용하고 있는지, 그리고 아마도 가장 중요할 상태 코드(status code, 200)를 알려줍니다. 상태 코드는 클라이언트에게 매우 구체적인 의미를 전달하도록 표준화된 여러 코드 중 하나입니다. 성공(200)했는지, 페이지를 찾을 수 없는지(404) 등을 알려줄 수 있습니다. HTTP 상태 코드 전체 목록은 IANA 사이트에서 확인할 수 있습니다.
요청과 응답 다루기
PHP가 요청 및 응답 헤더와 상호작용하는 방법을 제공하지만, CodeIgniter는 대부분의 프레임워크와 마찬가지로 이를 추상화하여 일관되고 단순한 인터페이스를 제공합니다. IncomingRequest 클래스는 HTTP 요청의 객체 지향적 표현입니다. 여기에는 필요한 모든 것이 포함되어 있습니다.
<?php
use CodeIgniter\HTTP\IncomingRequest;
$request = request();
// the URI path being requested (i.e., /about)
$request->getUri()->getPath();
// Retrieve $_GET and $_POST variables
$request->getGet('foo');
$request->getPost('foo');
// Retrieve from $_REQUEST which should include
// both $_GET and $_POST contents
$request->getVar('foo');
// Retrieve JSON from AJAX calls
$request->getJSON();
// Retrieve server variables
$request->getServer('Host');
// Retrieve an HTTP Request header, with case-insensitive names
$request->header('host');
$request->header('Content-Type');
// Checks the HTTP method
$request->is('get');
$request->is('post');
요청 클래스는 백그라운드에서 여러분이 걱정할 필요 없는 많은 작업을 수행합니다. isAJAX() 및 isSecure() 메서드는 여러 다른 방식들을 확인하여 올바른 답을 결정합니다.
참고
isAJAX() 메서드는 X-Requested-With 헤더에 의존하는데, 경우에 따라 JavaScript(예: fetch)를 통한 XHR 요청에서 기본적으로 전송되지 않을 수 있습니다. 이 문제를 피하는 방법은 AJAX 요청 섹션을 참조하세요.
CodeIgniter는 또한 HTTP 응답의 객체 지향적 표현인 Response 클래스를 제공합니다. 이를 통해 클라이언트에 보낼 응답을 쉽고 강력하게 구성할 수 있습니다.
<?php
use CodeIgniter\HTTP\Response;
$response = response();
$response->setStatusCode(Response::HTTP_OK);
$response->setBody($output);
$response->setHeader('Content-Type', 'text/html');
$response->noCache();
// Sends the output to the browser
// This is typically handled by the framework
$response->send();
또한 Response 클래스를 사용하면 최상의 성능을 위해 HTTP 캐시 레이어를 다룰 수 있습니다.