[Nest.js] Exception Filter로 에러 처리하기

궁금하면 500원·2024년 8월 18일
0

Exception Filter는 애플리케이션에서 발생한 예외를 처리하고, 클라이언트에게 적절한 에러 응답을 반환하기 위한 기능입니다.

예외 필터를 사용하면 에러를 중앙 집중적으로 관리할 수 있어 코드의 가독성과 유지보수성이 향상됩니다.

1. Nest.js의 Exception Filter

기본 기능

  • Exception Filter는 애플리케이션의 모든 요청 처리 중 발생한 예외를 포착하고, 이를 가공하여 클라이언트에게 전달하는 역할을 합니다.

커스터마이즈 가능

  • Nest.js에서는 기본 제공되는 예외 필터 외에도 사용자 정의 필터를 만들어 사용할 수 있습니다. 이를 통해 특정한 예외 처리 로직을 구현할 수 있습니다.

사용 예

  • HTTP 요청을 처리하는 동안 발생하는 다양한 예외(예: 유효성 검사 실패, 데이터베이스 오류 등)를 처리할 수 있습니다.

2. Exception Filter 구현 방법

예외 필터를 구현하는 기본적인 방법은 다음과 같습니다.

  • 1단계: 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);
    }
}
  • 2단계: Exception Filter 등록

필터를 애플리케이션 전역에 등록하려면 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();
  • 3단계: 특정 컨트롤러나 메서드에 필터 적용 (선택 사항)

특정 컨트롤러 또는 메서드에만 필터를 적용할 수도 있습니다.
이 경우, @UseFilters() 데코레이터를 사용합니다.

import { Controller, Get, UseFilters } from '@nestjs/common';

@Controller('movies')
@UseFilters(HttpExceptionFilter) // 특정 컨트롤러에만 필터 적용
export class MovieController {
    @Get()
    findAll() {
        // ...
    }
}

Exception Filter를 구현하고 사용할 수 있습니다.

필터를 사용하여 에러 처리 로직을 중앙 집중화하고, 클라이언트에게 더 일관된 에러 응답을 제공할 수 있습니다.

추가적으로, 필요에 따라 다양한 예외 타입에 대해 다른 필터를 생성하여 더욱 세밀하게 제어할 수 있습니다.

profile
꾸준히, 의미있는 사이드 프로젝트 경험과 문제해결 과정을 기록하기 위한 공간입니다.

0개의 댓글