자바스크립트로 구현하는 NestJS 서버의 오류 처리 방법

NestJS는 강력한 서버 사이드 프레임워크로, 자바스크립트를 기반으로 한다. NestJS 애플리케이션에서는 오류 처리를 효과적으로 다루는 것이 중요하다. 이번 블로그 포스트에서는 자바스크립트로 구현된 NestJS 서버의 오류 처리 방법에 대해 알아보도록 하겠다.

1. 전역 예외 필터 (Global Exception Filter) 사용하기

NestJS에서는 전역 예외 필터(Global Exception Filter)를 사용하여 애플리케이션의 모든 예외를 처리할 수 있다. 이 필터를 사용하면 모든 오류를 중앙에서 처리하고, 응답을 일관되게 처리할 수 있다.

import { ExceptionFilter, Catch, ArgumentsHost, HttpException } from '@nestjs/common';
import { Request, Response } from 'express';

@Catch()
export class GlobalExceptionFilter implements ExceptionFilter {
  catch(exception: any, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();
    const request = ctx.getRequest<Request>();

    let status = 500;
    let message = 'Internal server error';

    if (exception instanceof HttpException) {
      status = exception.getStatus();
      message = exception.getResponse();
    }

    response
      .status(status)
      .json({
        statusCode: status,
        timestamp: new Date().toISOString(),
        path: request.url,
        message,
      });
  }
}

위의 코드는 모든 예외를 처리하는 GlobalExceptionFilter 예시이다. @Catch() 데코레이터를 사용하여 어느 예외든 처리할 수 있도록 지정하고, catch 메소드에서 실제 예외 처리 로직을 작성한다. 예외가 HttpException 인스턴스인 경우 상태 코드와 응답을 설정하고, 그렇지 않은 경우 기본 값을 사용한다.

전역 예외 필터를 사용하기 위해서는 해당 필터를 애플리케이션에 등록해주어야 한다.

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { GlobalExceptionFilter } from './global-exception.filter';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalFilters(new GlobalExceptionFilter());
  await app.listen(3000);
}
bootstrap();

2. 컨트롤러 단위 예외 필터 사용하기

전역 예외 필터는 모든 예외를 처리하지만, 때로는 특정 컨트롤러에 대해서만 예외를 처리하는 것이 필요할 수 있다. 이 경우 컨트롤러 단위 예외 필터를 사용할 수 있다.

import { ExceptionFilter, Catch, ArgumentsHost, HttpException } from '@nestjs/common';
import { Request, Response } from 'express';

@Catch(HttpException)
export class ControllerExceptionFilter implements ExceptionFilter {
  catch(exception: HttpException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();
    const request = ctx.getRequest<Request>();

    const status = exception.getStatus();
    const message = exception.getResponse();

    response
      .status(status)
      .json({
        statusCode: status,
        timestamp: new Date().toISOString(),
        path: request.url,
        message,
      });
  }
}

위의 코드는 HttpException을 처리하는 ControllerExceptionFilter 예시이다. @Catch(HttpException) 데코레이터를 사용하여 HttpException 예외를 처리할 수 있도록 지정하고, catch 메소드에서 예외 처리 로직을 작성한다.

컨트롤러 단위 예외 필터를 사용하기 위해서는 해당 필터를 애플리케이션의 컨트롤러에 등록해주어야 한다.

import { Controller, Get, UseFilters } from '@nestjs/common';
import { ControllerExceptionFilter } from './controller-exception.filter';

@UseFilters(new ControllerExceptionFilter())
@Controller('/users')
export class UsersController {
  // ...
}

위의 예시에서 UsersControllerControllerExceptionFilter를 사용하여 예외를 처리한다고 설정되어 있다.

느낀점

NestJS에서는 다양한 방법을 통해 자바스크립트로 구현된 서버의 오류 처리를 유연하게 할 수 있다. 전역 예외 필터와 컨트롤러 단위 예외 필터를 적절히 사용하여 예외 처리 로직을 구현해보자.

참고 자료