자바스크립트 기반 NestJS 애플리케이션의 에러 핸들링 방법

NestJS는 Node.js 및 TypeScript 기반의 프레임워크로, 자바스크립트 기반 애플리케이션의 개발을 단순화하고 효율적으로 만들어줍니다. 이번 글에서는 NestJS 애플리케이션에서의 에러 핸들링 방법에 대해 알아보겠습니다.

1. 예외 필터 (Exception filter)

예외 필터는 애플리케이션에서 발생하는 예외를 캐치하고 처리하는 역할을 합니다. NestJS에서는 @Catch() 데코레이터를 사용하여 예외 필터를 정의할 수 있습니다. 예외 필터는 ExceptionFilter 인터페이스를 구현하고 catch() 메소드를 구현해야 합니다.

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

    const status = exception.getStatus();

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

// 예외 필터 적용
@UseFilters(HttpExceptionFilter)

위의 코드에서는 HttpException을 캐치하고, 캐치한 예외에 대한 처리를 위해 catch() 메소드를 구현하였습니다. 예외의 상태 코드와 타임스탬프, 요청 URL을 포함하는 JSON 응답을 반환하도록 작성되어 있습니다.

2. 글로벌 예외 필터 (Global exception filter)

글로벌 예외 필터는 모든 컨트롤러에서 발생하는 예외를 처리하는 역할을 합니다. NestJS에서는 @Catch() 데코레이터와 @CatchAll() 데코레이터를 함께 사용하여 글로벌 예외 필터를 정의할 수 있습니다.

@Catch()
export class GlobalExceptionFilter implements ExceptionFilter {
  catch(exception: unknown, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse();
    
    response.status(500).json({
      statusCode: 500,
      timestamp: new Date().toISOString(),
      message: 'Internal server error',
    });
  }
}

// 글로벌 예외 필터 적용
@UseFilters(GlobalExceptionFilter)

위의 코드에서는 catch() 메소드에 unknown 타입의 예외를 캐치하도록 작성되어 있습니다. 모든 컨트롤러에서 발생한 예외를 처리하기 때문에 상태 코드 500과 “Internal server error” 메시지를 반환하도록 구현되어 있습니다.

3. 예외 처리 미들웨어 (Exception handling middleware)

예외 처리 미들웨어는 애플리케이션에서 발생한 예외를 캐치하고 처리하기 위해 사용됩니다. NestJS에서는 내장된 HttpExceptionFilter 미들웨어를 사용하여 예외 처리를 할 수 있습니다.

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  
  // 예외 처리 미들웨어 등록
  app.useGlobalFilters(new HttpExceptionFilter());
  
  await app.listen(3000);
}

위의 코드에서는 app.useGlobalFilters() 메소드를 사용하여 예외 처리 미들웨어를 등록하고 있습니다. 이를 통해 애플리케이션 전역에서 예외를 캐치하고 처리할 수 있습니다.

NestJS 애플리케이션에서의 에러 핸들링 방법에 대해 알아보았습니다. 예외 필터, 글로벌 예외 필터, 예외 처리 미들웨어를 올바르게 사용하면 애플리케이션의 에러 핸들링을 효과적으로 관리할 수 있습니다.

참고 자료