미들웨어란 무엇인가요?
Next.js는 React 기반의 서버 사이드 렌더링(SSR)을 지원하는 프레임워크로, 웹 애플리케이션을 더 빠르고 효율적으로 만들 수 있게 도와줍니다. 이 과정에서 중요한 역할을 하는 것이 바로 미들웨어(middleware)입니다. 미들웨어는 클라이언트의 요청이 서버에 도달하기 전에 실행되는 코드로, 요청을 가로채고 필요한 작업을 수행할 수 있습니다.
미들웨어는 사용자의 요청을 확인하고, 수정하거나 요청의 흐름을 제어하는 데 사용됩니다. 예를 들어, 사용자가 로그인이 필요한 페이지에 접근하려고 할 때 로그인 상태를 확인하고, 로그인이 되어 있지 않으면 로그인 페이지로 리다이렉션하는 등의 작업을 수행할 수 있습니다.
미들웨어의 주요 용도
- 사용자 인증: 특정 페이지에 접근하려는 사용자가 로그인되어 있는지 확인합니다.
- 로그 기록: 요청 정보를 기록하여 나중에 분석하거나 디버깅할 수 있습니다.
- 리다이렉션: 특정 조건에 따라 사용자를 다른 페이지로 리다이렉션할 수 있습니다.
- 헤더 설정: 보안 헤더나 기타 응답 헤더를 설정할 수 있습니다.
Next.js에서 미들웨어 사용 방법
미들웨어를 정의하기 위해 `src` 폴더 아래에 `middleware.ts` 파일을 생성합니다. 이 파일에서 미들웨어의 로직을 작성하고, `config` 객체를 사용하여 미들웨어가 적용될 경로를 설정합니다.
예제 코드
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
export function middleware(req: NextRequest) {
console.log('Request URL:', req.url);
console.log('Headers:', req.headers);
const isAuthenticated = checkAuthentication(req);
if (!isAuthenticated) {
console.log('User not authenticated, redirecting to login');
return NextResponse.redirect('/login');
}
return NextResponse.next();
}
function checkAuthentication(req: NextRequest): boolean {
// 실제 인증 로직 구현
return true;
}
export const config = {
matcher: ['/protected/:path*'], // '/protected' 경로와 그 하위 경로에 대해 미들웨어 실행
};
이 코드는 `/protected` 경로 아래의 모든 요청에 대해 미들웨어를 실행합니다. 사용자가 인증되지 않은 경우 로그인 페이지로 리다이렉션합니다.
미들웨어 디버깅 방법
미들웨어를 디버깅하려면 다양한 방법을 사용할 수 있습니다. 다음은 몇 가지 효과적인 방법들입니다.
1. console.log 사용
가장 간단한 방법은 `console.log`를 사용하여 요청 객체나 상태를 출력하는 것입니다.
export function middleware(req: NextRequest) {
console.log('Request URL:', req.url);
console.log('Headers:', req.headers);
// ... 나머지 코드
}
2. Node.js 디버거 사용
Node.js 디버거를 사용하여 코드를 단계별로 실행하고 상태를 확인할 수 있습니다. `package.json` 파일에 디버그 스크립트를 추가한 후 실행합니다.
"scripts": {
"dev": "next dev",
"debug": "node --inspect-brk ./node_modules/.bin/next dev"
}
npm run debug
3. VS Code 디버깅 설정
Visual Studio Code에서 디버깅을 쉽게 설정할 수 있습니다.
`.vscode/launch.json` 파일을 생성하거나 수정합니다.
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Next.js",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "debug"],
"port": 9229,
"skipFiles": ["<node_internals>/**"]
}
]
}
VS Code에서 디버그 탭으로 이동하여 `Next.js` 설정을 선택하고 디버그를 시작합니다.
4. Custom Logging Library 사용
더 복잡한 애플리케이션에서는 Winston, Bunyan 같은 로깅 라이브러리를 사용하여 로그를 남길 수 있습니다. 예를 들어, Winston을 사용하여 로그를 기록할 수 있습니다.
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
import winston from 'winston';
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.Console(),
new winston.transports.File({ filename: 'combined.log' }),
],
});
export function middleware(req: NextRequest) {
logger.info(`Request URL: ${req.url}`);
logger.info('Headers:', req.headers);
const isAuthenticated = checkAuthentication(req);
if (!isAuthenticated) {
logger.warn('User not authenticated, redirecting to login');
return NextResponse.redirect('/login');
}
return NextResponse.next();
}
function checkAuthentication(req: NextRequest): boolean {
// 인증 로직
return true;
}
export const config = {
matcher: ['/protected/:path*'],
};
결론
Next.js에서 미들웨어는 웹 애플리케이션의 요청을 제어하고 보호하는 강력한 도구입니다. 미들웨어를 사용하여 사용자 인증, 로그 기록, 리다이렉션, 헤더 설정 등 다양한 작업을 수행할 수 있습니다. 또한 `console.log`, Node.js 디버거, VS Code 디버깅, 그리고 커스텀 로깅 라이브러리를 활용하여 효과적으로 디버깅할 수 있습니다.
이 글이 Next.js 애플리케이션에서 미들웨어를 설정하고 디버깅하는 데 도움이 되기를 바랍니다. Next.js의 미들웨어 기능을 잘 활용하여 더욱 안전하고 효율적인 웹 애플리케이션을 개발해 보세요!