
Next.js App Router를 사용하다 보면
사용자가 페이지에 진입하기 전에 공통 로직을 처리해야 하는 경우가 자주 발생한다.
예를 들어:
이런 로직을 페이지나 API마다 반복 구현하면 코드가 분산되고 관리가 어려워진다.
이때 사용하는 기능이 Middleware이다.
Middleware는 요청이 라우트에 도달하기 전에 실행되는 함수이다.
👉 요청을 가로채서 사전에 처리할 수 있다.
Request → Middleware → Route → Response
Middleware는 프로젝트 루트에 middleware.ts로 작성한다.
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
export function middleware(request: NextRequest) {
return NextResponse.next();
}
NextRequest, NextResponse 사용next() 호출 시 다음 단계로 전달기본적으로 모든 요청에 실행되므로
필요한 경로에만 적용하는 것이 중요하다.
export const config = {
matcher: ['/dashboard/:path*'],
};
👉 /dashboard 이하 경로에만 적용
가장 많이 사용하는 패턴
export function middleware(request: NextRequest) {
const token = request.cookies.get('token');
if (!token) {
return NextResponse.redirect(new URL('/login', request.url));
}
return NextResponse.next();
}
return NextResponse.redirect(new URL('/login', request.url));
return NextResponse.rewrite(new URL('/home', request.url));
👉 redirect = 이동 / rewrite = 내부 매핑
전역적으로 적용되는 공통 로직 처리 가능
export function middleware(request: NextRequest) {
const response = NextResponse.next();
response.headers.set('x-custom-header', 'middleware');
return response;
}
Middleware는 Edge Runtime에서 실행된다.
👉 Edge Runtime = 사용자와 가까운 서버(CDN 위치)에서 코드를 실행하는 환경
👉 가벼운 분기 처리에 적합
Next.js의 요청 처리 흐름은 다음과 같다.
Middleware → Route Handler / Page → Response
👉 Middleware는 항상 가장 먼저 실행된다.
즉, 실제 페이지나 API 로직이 실행되기 전에 요청을 선별하고 제어하는 역할을 담당한다.
다음과 같은 "요청 이전 단계에서 처리해야 하는 로직"에 적합하다.
👉 공통적으로 여러 페이지에서 반복되는 로직일수록 Middleware에 적합하다.
Middleware는 모든 요청마다 실행되기 때문에
👉 무거운 로직을 처리하기에는 적합하지 않다.
👉 이런 로직은
Route Handler 또는 Server Action에서 처리하는 것이 적절하다.
정적 파일이나 내부 경로에도 Middleware가 실행될 수 있다.
예:
불필요한 요청에도 Middleware가 실행되면서
👉 성능에 영향을 줄 수 있다.
export const config = {
matcher: ['/((?!_next|favicon.ico).*)'],
};
👉 필요한 경로에만 적용하도록 제한하는 것이 중요하다.
Middleware는 요청 이전 단계에서 실행되어 인증, 리다이렉트 등 공통 로직을 처리하는 레이어이다.
Middleware는 요청이 실제 라우트에 도달하기 전에 실행되며,
Next.js의 서버 처리 흐름에서 가장 앞단에 위치한다.
Next.js에서는 서버 로직을 처리하는 방식이 나뉜다.
👉 실행 위치를 기준으로 보면
각 기능의 역할과 사용 시점을 더 명확하게 구분할 수 있다.