Laravel Request Lifecycle (라라벨 요청 생명주기)
- 진입점 (Entry Point)
- HTTP 커널 (HTTP Kernel)
- 서비스 프로바이더 (Service Providers)
- 라우팅 (Routing)
- 미들웨어 (Middleware)
- 컨트롤러 및 액션 (Controller & Action)
- 응답 (Response) 및 종료 (Termination)
실무에서 주로 사용하고 있는 라라벨(Laravel)의 초기 구동 방식과 요청 생명주기(Request Lifecycle)에 대해 포스팅해보려 합니다. 어떤 프레임워크든 내부 동작 원리를 이해하는 것은 중요하기 때문에, 요청이 들어와서 응답이 나가기까지의 과정을 단계별로 정리해보겠습니다.
진입점 (Entry Point)
모든 라라벨 애플리케이션의 시작점은 public/index.php 파일입니다. 웹 서버(Nginx 또는 Apache) 설정에 의해 모든 요청은 이 파일로 전달됩니다.
이 파일은 많은 코드를 포함하지 않으며, 주로 두 가지 핵심 역할을 합니다.
- Composer Autoloader 로드: 컴포저가 생성한 오토로더를 불러와서, 이후 클래스들을 별도
require없이 사용할 수 있게 합니다. - 애플리케이션 인스턴스 생성:
bootstrap/app.php스크립트를 통해 라라벨 애플리케이션 인스턴스(Service Container)를 생성합니다.
HTTP 커널 (HTTP Kernel)
애플리케이션 인스턴스가 생성되면, 들어온 요청은 HTTP 커널(App\Http\Kernel)로 전달됩니다.
커널은 애플리케이션의 “심장”과 같습니다. 여기서 다음과 같은 중요한 작업들이 수행됩니다.
- 부트스트래퍼(Bootstrappers) 실행: 에러 핸들링 설정, 로깅 설정, 환경 변수 로드(
.env) 등 애플리케이션이 동작하기 위한 기본 설정을 수행합니다. - 글로벌 미들웨어 실행: 세션 관리, CSRF 토큰 검증, 유지보수 모드 체크 등 모든 요청에 공통적으로 적용되어야 할 미들웨어들이 여기서 실행됩니다.
서비스 프로바이더 (Service Providers)
커널의 부트스트랩 과정 중 가장 중요한 단계는 서비스 프로바이더 로딩입니다. config/app.php 파일의 providers 배열에 정의된 모든 프로바이더들이 로드됩니다.
이 과정은 두 단계로 나뉩니다.
- Register: 모든 프로바이더의
register메소드가 호출됩니다. 여기서는 주로 서비스 컨테이너에 바인딩(Binding)을 등록하는 작업만 수행해야 합니다. - Boot: 모든 프로바이더가 등록된 후,
boot메소드가 호출됩니다. 여기서는 이벤트 리스너 등록, 라우트 등록 등 다른 서비스에 의존하는 작업들을 수행할 수 있습니다.
라라벨의 핵심 기능(DB, 큐, 검증, 라우팅 등)은 모두 이 서비스 프로바이더를 통해 부트스트랩됩니다.
라우팅 (Routing)
서비스 프로바이더가 모두 로드되어 애플리케이션이 부팅되면, 요청은 라우터(Router)로 전달됩니다. 라우터는 들어온 요청의 URI를 routes/web.php 또는 routes/api.php에 정의된 라우트들과 매칭시킵니다.
미들웨어 (Middleware)
라우트가 매칭되면, 해당 라우트에 할당된 미들웨어들을 통과해야 합니다. 미들웨어는 요청이 컨트롤러에 도달하기 전에 인증(Authentication), 권한(Authorization) 등을 검사하거나 요청 데이터를 수정하는 필터 역할을 합니다.
컨트롤러 및 액션 (Controller & Action)
모든 미들웨어를 통과하면, 요청은 드디어 우리가 작성한 컨트롤러의 메소드(액션)에 도달합니다. 여기서 비즈니스 로직이 수행되고, 데이터베이스 조회 등이 이루어지며, 최종적으로 뷰(View)나 JSON 데이터를 반환합니다.
응답 (Response) 및 종료 (Termination)
컨트롤러가 반환한 값은 다시 미들웨어를 거쳐 HTTP 응답 객체로 변환됩니다. 이 응답 객체는 public/index.php로 돌아와 send() 메소드를 통해 사용자의 브라우저로 전송됩니다.
응답이 전송된 후, 커널의 terminate 메소드가 호출되어 “응답 후 처리”가 필요한 작업들(예: 세션 저장 등)을 수행하고 생명주기가 종료됩니다.