본문 바로가기

개발/Laravel

Request 라이프사이클

# Laravel 6.18.18 기준, 출처 라라벨 한글 메뉴얼

 

1. 요청 시작

Laravel 애플리케이션의 요청은 "public/index.php" 에서 시작하며, 웹 서버의 설정에 따라 모든 요청은 해당 파일에 전달된다.

프레임워크의 나머지 부분들을 로딩하기 위한 시작점이다.

"index.php" 파일은 컴포저가 생성한 오토로더 정의를 로딩하며 "bootstrap/app.php" 스크립트에서 라라벨 애플리케이션의 인스턴스를 가져온다. 

라라벨의 첫번째 동작은 서비스 컨테이너 인스턴스의 생성이다.

 

2. HTTP / Console 커널

애플리케이션의 시작 유형에 따라 HTTP 커널이나 콘솔 커널 둘 중 하나로 요청을 전송한다.

두 커널은 모든 요청의 흐름 중심에서 작도안다.

여기서는 "app/Http/Kernel.php" 에 있는 HTTP 커널에 초점을 맞춘다.

HTTP 커널은 "Illuminate\Foundation\Http\Kernel" 클래스를 상송하고 있으며 요청을 실행하기 전에 처리되는 "bootstrappers" (시작 코드)의 배열을 정의하고 있다.

이 시작 코드는 에러 처리, 로그 설정, 애플리케이션 동작 환경의 감지 등 실제로 요청이 처리되기 전에 수행해야 하는 작업들을 의미한다.

또한 HTTP 커널은 애플리케이션에서 요청이 처리되기 전에 통과해야하는 HTTP 미들웨어의 목록을 정의하며 이 미들웨어들은 HTTP 세션을 읽고/쓰고 애플리케이션이 유지 관리 모드인지 확인하고 CSRF 토큰을 확인하는 작업들을 처리한다. (CSRF : 크로스-사이트 요청 위조 공격)

HTTP 커널의 "handle" 메소드의 사용법은 아주 간단하다. 단순하게 "Reqeust"를 받고 "Response"를 반환한다.

 

3. 서비스 프로바이더

커널 부팅(부트스트래핑) 과정에서 가장 중요한 것 중 하나는 서비스 프로바이더의 로딩이다. 

애플리케이션의 모든 서비스 프로바이더는 "config/app.php" 파일의 "providers" 배열에 설정되어 있다.

먼저, 모든 서비스 프로바이더의 "register" 메소드가 호출되고 이후 등록된 모든 서비스 프로바이더의 "boot" 메소드가 호출된다.

서비스 프로바이더는 프레임워크의 데이터베이스, 큐, validation, 라우팅 컴포넌트와 같은 다양한 컴포넌트의 부트스트래핑(부팅과 같은 기초 작업들) 의 처리를 책임진다. 

프레임워크가 제공하는 모든 기능을 초기화하고 설정하는 것으로, 서비스 프로바이더는 라라벨의 부팅(부트스트래핑) 과정에서 가장 중요한 기능이다.

 

4. 요청 처리-디스패칭

애플리케이션이 부팅(부트스트래핑)되고 모든 서비스 프로바이더가 등록된 후, "Request"는 라이터 처리를 위해서 전달된다.

라우터는 라우팅 또는 컨트롤러로 요청을 전달할 뿐만 아니라 임의의 특정 라우트에 지정된 미들웨어도 실행한다.

 

5. 서비스 프로바이더

서비스 프로바이더는 라라벨의 부팅 단계의 주요한 핵심이며 애플리케이션의 인스턴스가 생성되고 서비스 프로바이더가 등록된 후 부트스트래핑 과정을 마친 프로그램이 요청을 처리한다.

라라벨 애플리케이션이 어떻게 구성되어 있는지 서비스 프로바이더를 통해 부트스트랩되는 과정을 구체적으로 이해하는 것은 매우 중요하다.

애플리케이션을 위한 기본 서비스 프로바이더는 "app/Providers" 디렉토리에 있다.

기본적으로 "AppServiceProvider"는 거의 비어 있으며 프로바이더는 고유한 부트스트래핑과 서비스 컨테이너 바인딩 코드를 추가하기 위한 곳이다. 보다 큰 애플리케이션의 경우 보다 세부적인 유형으로 구분된 종류별로 서비스 프로바이더를 만들 수 있습니다.

'개발 > Laravel' 카테고리의 다른 글

Laravel Dependency Injection Container - 1  (0) 2020.06.23
Laravel 6 Auth Login  (0) 2020.06.18
Laravel 6 Custom Exception  (0) 2020.06.10
Laravel 6 Gmail 연결 및 메일 전송 설정  (2) 2020.06.09
서비스 컨테이너  (0) 2020.06.08
Request 라이프사이클  (0) 2020.06.05