라라벨 리퀘스트 라이프사이클 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


유료 구독자 전용 레터입니다.

한 달 1만원으로 매일 라라벨 관련 메일 받아보시고 과거 메일도 열람하세요. 일반 구독으로 공개글만 받아보실 수도 있습니다.

구독하기 버튼을 눌러주시면 구독과 동시에 xly에도 가입됩니다.

이현석

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