모든 Laravel 요청은 단일 프론트 컨트롤러 public/index.php를 통해 들어와, HTTP Kernel에 의해 middleware 스택과 router를 거쳐 controller까지 구동되고, Response를 반환합니다. 그 후 middleware가 실행됩니다.
public/index.php ── autoload + app bootstrap
▼
HTTP Kernel::handle($request)
▼
Bootstrappers ── env, config, providers (register + boot)
▼
Global middleware ── (TrustProxies, HandleCors, ...)
▼
Router dispatch ── route 매칭
▼
Route / group middleware ── (auth, throttle, verified, ...)
▼
Controller (또는 closure) ── 여러분의 로직 → Response 반환
▼
Response ──▶ client
▼
Kernel::terminate ── terminable middleware (예: session 저장, logging)
index.php가 Composer autoload를 로드하고 애플리케이션 컨테이너를 bootstrap합니다.Request를 받아 bootstrapper를 실행합니다. env + config를 로드하고, service provider를 register하고 boot합니다(여기서 프레임워크와 여러분의 binding이 연결됩니다).auth, throttle, verified)가 controller 전에 실행됩니다. 각각이 흐름을 중단할 수 있습니다.Response(view, JSON, redirect)를 반환합니다. middleware의 "이후" 로직은 response가 바깥으로 버블링되어 나올 때 실행됩니다.Kernel::terminate가 지연 작업을 위해 terminable middleware를 실행합니다.// app/Http/Middleware/Timing.php → 3/5. middleware
public function handle($request, Closure $next)
{
$request->attributes->set('started', microtime(true));
$response = $next($request); // 다음 레이어 / controller로 전달
$response->headers->set('X-Time', '...'); // "이후" 로직
return $response;
}
// routes/web.php → 4. routing (+ middleware)
Route::get('/items/{id}', [ItemController::class, 'show'])->middleware('auth');
// app/Http/Controllers/ItemController.php → 6. controller
public function show(int $id)
{
return response()->json(Item::findOrFail($id));
}
Laravel의 생명주기는 service container와 middleware pipeline를 중심으로 구축되어 있으므로, 순서 — bootstrap/provider, 그다음 global middleware, 그다음 routing, 그다음 route middleware, 그다음 controller, 그다음 terminate — 를 아는 것은 auth, rate limiting, CORS, 정리가 정확히 어디에 속하는지 알려줍니다. 이는 왜 service가 inject되기 전에 provider에서 bind되어야 하는지, 왜 throttle이 여러분의 controller가 실행되기 전에 요청을 거부하는지, 그리고 사용자를 기다리게 하지 않도록 느린 작업을 어떻게 terminable middleware로 지연시키는지를 설명합니다.
주니어부터 시니어까지 상세한 답변이 포함된 IT 면접 질문 라이브러리.
후원하기