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) 형태로 연결되어 있고 요청이 들어오면 미들웨어 체인을 통해 다음과 같은 순서로 처리.
- 글로벌 미들웨어 실행:
app/Http/Kernel.php
의$middleware
배열에 정의된 미들웨어가 순서대로 실행. - 라우트 미들웨어 그룹 적용: 해당 라우트에 지정된 미들웨어 그룹(
$middlewareGroups
)이 적용. - 개별 미들웨어 적용: 라우트에 직접 지정된 미들웨어가 실행.
- 컨트롤러 또는 클로저 실행: 요청을 처리하고 응답을 생성.
- 응답 후 처리: 미들웨어 체인을 역순으로 돌아가며
$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;
}
실행 흐름:
- Middleware A: Before
- Middleware B: Before
- 컨트롤러 또는 클로저 실행
- Middleware B: After
- 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. 호출 스택과 흐름 이해하기
미들웨어의 동작은 함수 호출 스택과 유사.
- 미들웨어 A 호출
- 미들웨어 B 호출
- 컨트롤러 또는 클로저 실행
- 미들웨어 B의
$next($request)
이후 코드 실행 - 미들웨어 A의
$next($request)
이후 코드 실행
각 미들웨어는 $next($request)
를 호출하여 다음 미들웨어로 요청을 전달하고, 응답이 반환될 때까지 실행이 일시 중지.
6. 중요한 포인트
- 미들웨어 순서: 미들웨어는 등록된 순서대로 실행되며, 응답 처리 시에는 역순으로 실행.
$next($request)
의 역할: 다음 미들웨어 또는 컨트롤러를 호출하는 클로저.- 응답 수정:
$next($request)
이후에 응답 객체 수정 가능.
7. 마무리
Laravel 미들웨어의 작동 원리를 정확히 파악하지 못해 이때까지 $next($request); 후 응답 처리가 가능한것은 모르고 있었습니다. 프레임워크 코어를 이해하면 애플리케이션의 흐름을 더 잘 파악하고, 효율적인 코드를 작성할 수 있습니다.
'IT > 라라벨' 카테고리의 다른 글
[Laravel] Facade, Singleton 그리고 alias (0) | 2024.09.03 |
---|---|
[laravel] Laravel 의 중첩 트랜잭션 관리기법 (0) | 2024.07.01 |
[laravel] 유니코드 정규화 패키지 (0) | 2024.03.07 |
[laravel] 라라벨 여러 row 한번에 업데이트 하는 법 mass update (0) | 2024.01.10 |
[Laravel] passport 인증 실패 익셉션 발생시 Authoization header 를 날림 (0) | 2023.09.30 |