PHP MVC - Laravel Request LifeCycle
Title: PHP Laravel - Request Lifecycle
Author: DongDongE
Tags: Programming
Release: 2020.08.07
Request Lifecycle - 라이프 사이클 요청
이번에는 라라벨 - 라이프 사이클 요청에 대해 알아보도록 하겠습니다.
"현실 세계"에서는 어떤 도구를 사용할 때 그 도구가 어떻게 작동되는지 이해를 하면 더욱 자신감을 줍니다. 애플리케이션 개발 또한 다르지 않으며 개발 도구가 어떻게 동작하는지에 대한 이해를 한다면 이를 사용하는데 있어서 더 편하고 잘 사용할 수 있습니다.
라라벨 전체 프레임워크를 더 잘 알게 됨으로써 모든 것을 덜 "혼란스러워"할 것입니다. 라라벨 공식 가이드 문서에서도 지금 당장 모든 것들을 이해하지 못하더라도 괜찮다고 쓰여져 있습니다.
그냥 무엇을 하고 있는지에 대한 기본적인 이해를 얻기 위해 노력하고, 해당 문서의 여러 부분 섹션을 살펴보면서 깊게 들어가 이해를 한다면 지식 또한 더 쌓을 수 있다고 합니다.
LifeCycle 개요
첫 번째
라라벨 애플리케이션에 대한 모든 요청의 진입(시작점)은 "public/index.php" 파일입니다. 웹서버 (Apache, Nginx) 구성에 의해 해당 파일로 전달됩니다. 해당 index.php 파일에는 많은 코드가 포함되어 있지 않습니다. 대신 프레임워크의 나머지를 로드하기 위한 시작점입니다.
"index.php" 파일은 Composer가 생성한 오토로더 정의를 로딩합니다.그 다음 "bootstrap/app.php"에서 라라벨 애플리케이션의 인스턴스를 검색합니다.
라라벨 첫 번째 동작은 "서비스 컨테이너" 인스턴스를 생성하는 것입니다.
<?php
require __DIR__.'/../bootstrap/autoload.php';
$app = require_once __DIR__.'/../bootstrap/app.php';
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
$response = $kernel->handle(
$request = Illuminate\Http\Request::capture()
);
$response->send();
$kernel->terminate($request, $response);
"public/index.php"
위 index.php 파일의 코드를 보면 몇줄 되지 않습니다.
HTTP / Console kernel
다음으로 애플리케이션 시작된 유형에 따라 전송된 요청을 "HTTP Kernel" 또는 "Console Kernel"로 전송됩니다. 이 두 커널은 모든 요청이 통과할 수 있는 중앙 위치 역할을 합니다. 여기서는 "app/Http/Kernel.php"에 "HTTP Kernel"에 초점을 맞춰보도록 하겠습니다.
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
];
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
'bindings',
],
];
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];
}
"app/Http/Kernel.php"
HTTP Kernel은 "Illuminate\Foundation\Http\Kernel" 클래스를 상속하고 있으며, 요청이 실행되기 전까지 처리되는 "bootstrappers" 배열을 정의하고 있습니다.
이러한 bootstrappers는 오류 처리, 로깅을 구성하고, 애플리케이션 환경을 탐지하며, 요청이 실제로 처리되기 전에 수행해야 되는 작업을 의미합니다.
또한 HTTP Kernel은 애플리케이션에서 요청이 처리되기 전에 통과해야하는 HTTP 미들웨어의 목록을 정의하고 있습니다. 이러한 미들웨어는 HTTP Session을 읽고/쓰고, 애플리케이션이 유지 관리 모드인지 확인하고, CSRF 토큰을 확인하는 작업을 합니다.
HTTP Kernel의 "handle" 메소드의 사용방법은 매우 간단합니다. 단순하게 "Request" 받고 "Response"를 반환합니다. Kernel은 애플리케이션 전체를 나타내는 하나의 큰 블랙 박스라고 생각하면 됩니다. 즉, HTTP 요청이 들어오면 HTTP 응답을 반환합니다.
Service Providers
가장 중요한 Kernel Bootstrap 작업 중 하나는 애플리케이션에 대한 "Service Provider(서비스 프로바이더)"를 로딩하는 것입니다. 애플리케이션의 모든 서비스 프로바이더는 "config/app.php" 파일의 "providers" 배열에 설정되어 있습니다. 먼저 모든 서비스 프로바이더의 "register" 메소드가 호출 된 다음 이후에 등록된 모든 서비스 프로바이더의 "boot" 메소드가 호출되어 집니다.
서비스 프로바이더는 데이터베이스, 큐, 유효성 검사 및 라우팅 구성 요소와 같은 프레임워크의 모든 구성 요소를 처리를 책임집니다. 프레임워크에서 제공하는 모든 기능을 부트스트랩하고 구성하므로 서비스 프로바이더는 전체 라라벨 부트스트랩 프로세스에서 가장 중요한 요소입니다.
Dispatch Requests
애플리케이션이 Bootstrapped(부팅)되고 모든 서비스 프로바이더가 등록되면 요청은 처리를 위해 라우터로 전달됩니다. 라우터는 요청을 라우트 또는 컨트롤러에 전달하고 라우트 특정 미들웨어를 실행합니다.
Dispatch Requests
애플리케이션이 Bootstrapped(부팅)되고 모든 서비스 프로바이더가 등록되면 요청은 처리를 위해 라우터로 전달됩니다. 라우터는 요청을 라우트 또는 컨트롤러에 전달하고 라우트 특정 미들웨어를 실행합니다.
Focus On Service Providers
서비스 프로바이더는 라라벨 애플리케이션을 Bootstrapped(부팅) 단계의 핵심입니다. 애플리케이션 인스턴스가 생성되고 서비스 프로바이더에 등록되어 요청이 Bootstrapped(부팅)된 애플리케이션으로 전달되며 처리됩니다. 매우 간단합니다.
서비스 프로바이더를 통해 라라벨 애플리케이션을 구축하고 Bootstrapped(부팅)하는 과정을 확실히 파악하는 것은 중요합니다. 기본 서비스 프로바이더는 "app/Providers" 디렉터리에 있습니다.
기본적으로 "AppServiceProvider"는 거의 비어져 있습니다. 해당 프로바이더는 고유한 부트스트래핑과 서비스 컨테이너 바인딩 코드를 추가 하기 위한 곳입니다. 물론 대규모 응용 프로그램의 경우 각각 더 세분화된 유형의 구분되어 종류별로 서비스 프로바이더를 추가할 수 있습니다.