IT/라라벨

[Laravel] Laravel 에서 middleware 는 어떻게 동작하는가

_이준호_ 2024. 9. 17. 17:24

Laravel에서 미들웨어(Middleware)는 애플리케이션의 HTTP 요청 처리 과정에서 핵심적인 역할을 담당한다. 미들웨어는 요청(Request)응답(Response) 사이에서 동작하며 다양한 기능을 수행할 수 있다.


1. 미들웨어의 기본 구조

미들웨어는 handle 메서드를 구현하며, $request$next 매개변수를 받음.

public function handle($request, Closure $next)
{
    // 요청 전 처리

    $response = $next($request);

    // 응답 후 처리

    return $response;
}
  • 요청 전 처리: $next($request) 호출 이전에 실행되며, 요청이 애플리케이션의 다른 부분에 도달하기 전에 동작.
  • 응답 후 처리: $next($request) 호출 이후에 실행되며, 응답이 클라이언트로 반환되기 전에 동작.

2. 미들웨어의 실행 흐름

미들웨어는 체인(chain) 형태로 연결되어 있고 요청이 들어오면 미들웨어 체인을 통해 다음과 같은 순서로 처리.

  1. 글로벌 미들웨어 실행: app/Http/Kernel.php$middleware 배열에 정의된 미들웨어가 순서대로 실행.
  2. 라우트 미들웨어 그룹 적용: 해당 라우트에 지정된 미들웨어 그룹($middlewareGroups)이 적용.
  3. 개별 미들웨어 적용: 라우트에 직접 지정된 미들웨어가 실행.
  4. 컨트롤러 또는 클로저 실행: 요청을 처리하고 응답을 생성.
  5. 응답 후 처리: 미들웨어 체인을 역순으로 돌아가며 $next($request) 이후의 코드가 실행.

3. 미들웨어 체인의 예시

미들웨어 A (MiddlewareA)

public function handle($request, Closure $next)
{
    \Log::info('Middleware A: Before');

    $response = $next($request);

    \Log::info('Middleware A: After');

    return $response;
}

미들웨어 B (MiddlewareB)

public function handle($request, Closure $next)
{
    \Log::info('Middleware B: Before');

    $response = $next($request);

    \Log::info('Middleware B: After');

    return $response;
}

실행 흐름:

  1. Middleware A: Before
  2. Middleware B: Before
  3. 컨트롤러 또는 클로저 실행
  4. Middleware B: After
  5. Middleware A: After

4. Laravel의 코어 로직 (Pipeline 클래스)

Laravel은 Pipeline 클래스를 사용하여 미들웨어를 체인으로 연결.

$response = (new Pipeline($this->app))
    ->send($request)
    ->through($middleware)
    ->then($destination);
  • send($request): 요청을 파이프라인에 전달.
  • through($middleware): 미들웨어 배열을 지정.
  • then($destination): 최종 목적지(컨트롤러 또는 클로저)를 설정.

Pipeline은 미들웨어를 역순으로 감싸는 클로저를 생성하여 요청을 처리하고, 응답이 생성되면 미들웨어 체인을 역순으로 돌아가며 응답을 처리.


5. 호출 스택과 흐름 이해하기

미들웨어의 동작은 함수 호출 스택과 유사.

  1. 미들웨어 A 호출
  2. 미들웨어 B 호출
  3. 컨트롤러 또는 클로저 실행
  4. 미들웨어 B의 $next($request) 이후 코드 실행
  5. 미들웨어 A의 $next($request) 이후 코드 실행

각 미들웨어는 $next($request)를 호출하여 다음 미들웨어로 요청을 전달하고, 응답이 반환될 때까지 실행이 일시 중지.


6. 중요한 포인트

  • 미들웨어 순서: 미들웨어는 등록된 순서대로 실행되며, 응답 처리 시에는 역순으로 실행.
  • $next($request)의 역할: 다음 미들웨어 또는 컨트롤러를 호출하는 클로저.
  • 응답 수정: $next($request) 이후에 응답 객체 수정 가능.

7. 마무리

Laravel 미들웨어의 작동 원리를 정확히 파악하지 못해 이때까지 $next($request); 후 응답 처리가 가능한것은 모르고 있었습니다. 프레임워크 코어를 이해하면 애플리케이션의 흐름을 더 잘 파악하고, 효율적인 코드를 작성할 수 있습니다.