Exception Filter는 애플리케이션에서 발생한 예외를 처리하고, 클라이언트에게 적절한 에러 응답을 반환하기 위한 기능입니다.
예외 필터를 사용하면 에러를 중앙 집중적으로 관리할 수 있어 코드의 가독성과 유지보수성이 향상됩니다.
예외 필터를 구현하는 기본적인 방법은 다음과 같습니다.
@Catch() 데코레이터를 사용하여 특정 예외를 처리하는 필터 클래스를 생성합니다.
예를 들어, HttpException을 처리하는 필터를 만들어보겠습니다.
import { ExceptionFilter, Catch, ArgumentsHost, HttpException, HttpStatus } from '@nestjs/common';
import { Response } from 'express';
@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
catch(exception: HttpException, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse<Response>();
const status = exception.getStatus();
const responseBody = {
statusCode: status,
timestamp: new Date().toISOString(),
path: ctx.getRequest().url,
message: exception.getResponse(), // 에러 메시지
};
response.status(status).json(responseBody);
}
}
필터를 애플리케이션 전역에 등록하려면 main.ts 파일에서 app.useGlobalFilters() 메서드를 사용합니다.
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { HttpExceptionFilter } from './http-exception.filter';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalFilters(new HttpExceptionFilter());
await app.listen(3000);
}
bootstrap();
특정 컨트롤러 또는 메서드에만 필터를 적용할 수도 있습니다.
이 경우, @UseFilters() 데코레이터를 사용합니다.
import { Controller, Get, UseFilters } from '@nestjs/common';
@Controller('movies')
@UseFilters(HttpExceptionFilter) // 특정 컨트롤러에만 필터 적용
export class MovieController {
@Get()
findAll() {
// ...
}
}
Exception Filter를 구현하고 사용할 수 있습니다.
필터를 사용하여 에러 처리 로직을 중앙 집중화하고, 클라이언트에게 더 일관된 에러 응답을 제공할 수 있습니다.
추가적으로, 필요에 따라 다양한 예외 타입에 대해 다른 필터를 생성하여 더욱 세밀하게 제어할 수 있습니다.