롸?
미들웨어 본문
1. 라라벨의 미들웨어
미들웨어는 애플리케이션으로 들어온 HTTP 요청을 간편하게 필터링할 수 있는 방법을 제공한다.
예를 들어, 라라벨은 애플리케이션의 사용자가 인증되었는지 검사하는 미들웨어를 내장하고 있다. 만약 인증되지 않은 사용자라면, 미들웨어는 그 사용자를 로그인 화면으로 리다이렉트 시키고, 인증된 사용자라면 미들웨어는 애플리케이션에서 HTTP 요청이 계속해서 더 처리되도록 허용할 것이다.
인증 이외에도 다양한 작업을 수행하는 추가적인 미들웨어를 작성할 수도 있다. 이러한 미들웨어들은 모두 app/Http/Middleware 디렉토리 안에 위치하고 있다.
2. 정의하기
새로운 미들웨어를 생성하기 위해 make:middleware 아티즌 명령을 사용할 수 있다.
class MyMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
return $next($request);
}
}
아티즌 명령을 통해 다음과 같이 미들웨어가 생성된다. handle 메서드가 유입되는 요청과 반환되는 응답을 처리한다.
3. handle 메소드 이해하기
미들웨어는 다른 미들웨어 위에 하나씩 겹쳐지는 계층 구조를 갖고, 최종적으로 애플리케이션의 주요 비즈니스 로직을 둘러싸고 있는 형태이다.
요청이 들어오면 첫번째 미들웨어에서 처리된 후 다른 미들웨어로 차례로 넘긴 다음에 주요 비즈니스 로직에 전달된다. 그 후 결과로 반환되는 응답은 요청이 처리될 때의 미들웨어의 반대 방향으로 통과하여 전달되고, 최종적으로 첫번째 미들웨어가 마지막으로 응답을 처리한다.
첫번째 미들웨어라면 $request는 아무런 처리도 진행되지 않은 요청이고, 다른 미들웨어의 영향도 전혀 받지 않은 상태이다.
요청을 $next()로 넘긴다는 것은 요청을 남아 있는 다른 미들웨어로 건네는 것을 의미한다. $next() 클로저는 $request를 다음 미들웨어의 handle() 메서드에 넘겨준다. 더 넘겨줄 미들웨어가 없을 때 까지 반복하며 주요 비즈니스 로직에 다다르면 종료된다.
응답은 컨드롤러 등에서 반환된 응답이 미들웨어를 거꾸로 타고 올라간다. 각각의 미들웨어가 결국 응답을 반환하기 때문이다. 그래서 같은 handle() 메서드 내에서 어떻게 작성하냐에 따라 미들웨어의 동작 순서가 바뀐다.
요청을 애플리케이션에서 처리되기 이전에 실행하기 위해서는 다음과 같이 작성한다.
public function handle($request, Closure $next)
{
// Perform action here!
return $next($request);
}
반대로 애플리케이션에 의해 처리된 이후에 미들웨어가 실행될 경우(->응답처리)
public function handle($request, Closure $next)
{
$response = $next($request);
// Perform action here!
return $response;
}
4. 미들웨어 등록하기
만약 애플리케이션의 모든 HTTP 요청에 대해 미들웨어가 작동되기를 원한다면, app/Http/Kernel.php 클래스의 $middleware 프로퍼티에 미들웨어를 등록하면 된다.
미들웨어를 특정 라우트에만 할당하고 싶을 때에는 우선 app/Http/Kernel.php 파일에 그 미들웨어의 키를 지정해야한다. 기본적으로 Kernel 클래스의 $routeMiddleware 속성은 라라벨에 포함된 미들웨어들의 목록을 가지고 있다. 추가하려는 미들웨어에 원하는 키를 지정하고 이 목록에 붙여넣으면 된다.
미들웨어를 HTTP 커널에 등록했다면, 라우트에 middleware 메소드를 사용하여 미들웨어를 지정할 수 있다.
Route::get('admin/profile', function () {
//
})->middleware('auth');
라우트에 여러 개의 미들웨어를 지정할 수도 있고, 미들웨어를 지정할 때, 전체 클래스 이름을 전달할 수도 있다.
참고
1. https://laravel.kr/docs/5.8/middleware
2. 책 : 처음부터 제대로 배우는 라라벨
'Framework > Laravel' 카테고리의 다른 글
라라벨 스케줄러 & 크론탭 설정하기 (0) | 2021.12.21 |
---|---|
라라벨 브로드캐스팅 & 라라벨 에코 서버 (0) | 2021.12.10 |
쿼리빌더와 엘로퀀트 (0) | 2021.11.26 |
라이프사이클 (0) | 2021.11.18 |
라라벨 시작하기 - 세팅&설치 (0) | 2021.11.12 |