요청에 대한 라이프사이클(Request Lifecycle)
소개
"현실 세계"에서 어떤 도구를 사용하는 경우, 그 도구가 어떻게 작동하는지 알고 있는 것은 여러분께 자신감을 줄 것입니다. 어플리케이션 개발에서도 다르지 않습니다. 개발툴들이 어떻게 작동하는지 이해한다면 그것들을 사용하는 데 있어서 더 편하고 잘 사용할 수 있을 것입니다.
이 문서의 목적은 어떻게 라라벨이 “동작” 하는지, 높은 수준의 개념을 잘 설명하는 것입니다. 전체 프레임워크를 더 잘 알게 됨으로써, 모든것을 덜 “혼란스러워“할 것이며 여러분은 어플리케이션을 구축하는 데 좀 더 자신감 갖게 될 것입니다.
지금 당장 모든 것들을 이해하지 못하더라도 괜찮습니다. 그냥 무엇을 하고 있는지에 대한 기본적인 이해를 얻기 위해 노력하십시오, 여러분이 다른 문서의 여러 부분들을 살펴 볼 수록 지식이 더 쌓일 것입니다.
라이프사이클 개요
시작
라라벨 어플리케이션의 모든 요청에 대한 시작점은 public/index.php
파일입니다. 웹서버 (Apache / Nginx)의 설정에 따라 모든 요청은 이 파일에 전달됩니다. index.php
파일은 그다지 많은 코드를 가지고 있지 않습니다. 대신 프레임 워크의 나머지를 로딩하기 위한 시작점이 됩니다.
index.php
파일은 컴포저가 생성 한 오토로더 정의를 로딩합니다. 그리고, bootstrap/app.php
스크립트에서 라라벨 어플리케이션의 인스턴스를 가져옵니다. 라라벨 자신의 첫 번째 동작은 서비스 컨테이너 인스턴스를 생성하는 것입니다.
HTTP / Console 커널
다음으로 어플리케이션이 시작된 유형에 따라 전송된 요청을 HTTP 커널이나 콘솔 커널 둘 중 하나로 보냅니다. 이 두 가지의 커널은 모든 요청의 흐름 중심에서 작동하게 됩니다. 여기에서는 app/Http/Kernel.php
에있는 HTTP 커널에 초점을 맞춰 봅시다.
HTTP 커널은 Illuminate\Foundation\Http\Kernel
클래스를 상속하고 있으며, 요청을 실행하기 전에 처리되는 bootstrappers
(시작 코드)의 배열을 정의하고 있습니다. 이 시작 코드들은 에러 처리, 로그 설정, 어플리케이션 동작 환경의 감지 등 실제로 요청이 처리되기 전에 수행해야 되는 작업들을 의미합니다.
또한, HTTP 커널은 어플리케이션에서 요청이 처리되기 전에 통과해야하는 HTTP 미들웨어의 목록을 정의하고 있습니다. 이 미들웨어들은 HTTP 세션 읽고/쓰고, 어플리케이션이 유지 관리 모드인지 확인하고, CSRF 토큰을 확인 하는 작업들을 처리합니다.
HTTP 커널의 handle
메소드의 사용법은 매우 간단합니다. 단순하게는 Request
를 받고 Response
를 반환합니다. 커널을 어플리케이션 전체를 나타내는 하나의 큰 블랙 박스라고 생각해봅시다. HTTP 요청이 입력되면 HTTP 응답이 반환됩니다.
서비스 프로바이더
커널 부팅(부트스트래핑) 과정의 가장 중요한 것 중의 하나는 어플리케이션의 서비스 프로바이더를 로딩하는 것입니다. 어플리케이션의 모든 서비스 프로바이더는 config/app.php
파일의 providers
배열에 설정되어 있습니다. 먼저, 모든 서비스 프로바이더의 register
메소드가 호출되고, 이후에 등록 된 모든 서비스 프로바이더의 boot
메소드가 호출되어 집니다.
요청 처리-디스패칭
어플리케이션이 부팅(부트스트래핑)되고 모든 서비스 프로바이더가 등록된 후, Request
는 라우터 처리리를 위해서 전달될 것입니다. 라우터는 라우팅 또는 컨트롤러로 요청-request을 전달할뿐만 아니라, 임의의 특정 라우트에 지정된 미들웨어도 실행합니다.
서비스 프로바이더
서비스 프로바이더는 라라벨 어플리케이션의 부팅(부트스트래핑) 단계의 주요한 핵심입니다. 어플리케이션의 인스턴스가 생성되고, 서비스 프로바이더가 등록된후 부트스트래핑 과정을 마친 프로그램이 요청을 처리합니다. 매우 간단합니다!
라라벨 어플리케이션이 어떻게 구성되어 있는지, 서비스 프로바이더를 통해 부트스트랩되는 과정을 구체적으로 이해하는 것은 매우 중요합니다. 물론 여러분의 어플리케이션을 위한 기본 서비스 프로바이더는 app/Providers
디렉토리에 있습니다.
기본적으로 AppServiceProvider
는 거의 비어 있습니다. 이 프로바이더는 여러분의 고유한 부트스트래핑과 서비스 컨테이너 바인딩 코드를 추가하기 위한 곳입니다. 물론 보다 큰 어플리케이션의 경우, 보다 세부적인 유형으로 구분된 종류별로 서비스 프로바이더를 만들 수도 있습니다.