라라벨 리퀘스트 라이프사이클 free

2019-07-18

벨에 요청이 들어오면 벨이 어떤 으로 처리하는지 알면 여러모로 도움이 된다. 우선 리퀘스트 이프사이클은 공 메뉴얼에 자세히 안내가 되어 있다. 시간을 내어 차분히 읽어보면 도움이 될 것이다. 이 글에서는 큰그림을 이해하는 걸 위주로 정리해보겠다.


모든 요청은 public/index.php로


PHP 사용자면 알겠지만, PHP는 애플리케이션이 계속 동작하면서 리퀘스트를 처리하는게 아니 리퀘스트가 들어오면 즉시 애플리케이션이 실행되고, 응답을 하고나서 바로 종료된다. PHP는 마치 HTML처럼 요청에 즉답하는 구조 /를 요청하면 {DOCUMENT_ROOT}/index.php가 실행되고, /sub를 요청하면 {DOCUMENT_ROOT}/sub/index.php, /sub/sample.php를 요청하면 {DOCUMENT_ROOT}/sub/sample.php가 실행된다. /index.php, /sub/index.php, /sub/hello.php가 각각 하나의 애플리케이션인 셈이다.


벨은 여러 요청에 대응하는 하나의 애플리케이션이다. 이를 위해 모든 요청을 public/index.php이 처리하도록 하고 있다. 관련 설정은 웹 서버 설정 > Pretty URLs를 참고하자.


웹 서버를 통해 요청이 들어오면 무조건 public/index.php가 실행된다고 이해하면 된다.


public/index.php


public/index.php를 열어서 주석을 제거하고 보면 아래와 같이 코드양은 얼마 안된다.


<?php

define('LARAVEL_START', microtime(true));

require __DIR__.'/../vendor/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);


  1. 인 10: LARAVEL_START는 상수를 선언한다.

  2. 인 24: require __DIR__.'/../vendor/autoload.php'; 컴포저 오토로드 파을 불러들인다. (컴포저가 뭔지 모르시면 단 그냥 그런게 있나보다 하고 넘어가자.)

  3. 인 38: $app = require_once __DIR__.'/../bootstrap/app.php'; 벨 애플리케이션을 생성한다.

  4. 인 52: $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);이언트의 요청을 처리할 커널을 생성한다.

  5. 인 54-56: 커널로 요청을 처리하고 응답을 생성한다.

  6. 인 58: 응답을 클이언트에게 전송한다.

  7. 인 60: 커널을 종료한다.


요약하면, 설정을 불러들이고, 애플리케이션을 생성해서, 요청을 처리하고 응답을 내보낸다는게 public/index.php의 내용이다.


3번에서 벨 애플리케이션이 생성될 때 서비스 컨테이너, 서비스 프로바이더, 파사드가 등록된다.


4번에서 커널이 생성될 때 우터와 미들웨어가 등록된다.


5번, 커널로 요청을 처리할 때는 우트별로 처리한다. 요청이 어디서 어떻게 처리되는지, 즉 우트는 /routes에 정의된다. 웹은 /routes/web.php 같은 이다. 벨은 MVC 구조로 되어 있다고 이야기들하지만 아래에서 보는 것과 같이 우트에서 모든 작업을 처리할 수도 있기 때문에 리퀘스트 이프사이클에서 MVC가 필수적이진 않다.


Route::get('/', function () {
return view('welcome');
});

새로운 벨 리퀘스트 이프사이클 다이어그램


구글에서 “laravel request life cycle”로 이미지 검색을 해보면 이 이미지가 가장 먼저 나타난다.


image.png


출처: http://blog.mallow-tech.com/2016/06/request-life-cycle-of-laravel/


이는 과거에 작성된 것으로, 현재(2019년 7월, 벨 5.8) 기준으로 보면 다소 안맞는 부분이 있다. 앞서 살펴본 것을 토대로 리퀘스트 이프사이클을 다시 그려보면 아래처럼 표현할 수 있을 것이다.


스크린샷 2019-07-18 오후 3.10.35.png


===


1 1
2019년 7월 18



이현석

바쁜 팀장님 대신 알려주는 신입 PHP 개발자 안내서를 쓰고, 클린 아키텍처 인 PHP를 번역했습니다. 2020년에 출간될 Laravel Up & Running 2nd Edition을 번역하고 있습니다.