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

NestJS는 자바스크립트 및 TypeScript로 개발할 수 있는 프레임워크로, 서버 사이드 애플리케이션을 구축하는 데 사용됩니다. 애플리케이션을 개발하다 보면 에러 로깅이 중요한 역할을 수행하는데, 이를 통해 에러를 식별하고 디버그할 수 있습니다. 이번 블로그 포스트에서는 자바스크립트 기반 NestJS 애플리케이션에서의 에러 로깅 방법에 대해 알아보겠습니다.

ErrorInterceptor 사용하기

NestJS에서는 ErrorInterceptor를 활용하여 애플리케이션 전역에서 에러를 캐치하고 처리할 수 있습니다. ErrorInterceptor를 사용하면 모든 요청과 응답을 감지하여 에러가 발생할 경우 이를 처리하는 로직을 추가할 수 있습니다.

import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { Observable, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';

@Injectable()
export class ErrorInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    return next.handle().pipe(
      catchError(err => {
        // 에러 핸들링 로직을 추가합니다.
        console.error('에러가 발생했습니다:', err);
        
        // 에러 발생 시 클라이언트에게 응답을 보낼 수도 있습니다.
        // return throwError('서버 에러가 발생했습니다.');
        
        return throwError(err);
      }),
    );
  }
}

위의 예시에서는 ErrorInterceptor 클래스를 생성하여 NestInterceptor를 구현하였습니다. intercept 메소드에서는 모든 요청과 응답을 감지하고, 에러가 발생했을 때 추가적인 로직을 수행하고자 할 경우 여기에 작성하면 됩니다.

AppModule에서 ErrorInterceptor 등록하기

ErrorInterceptor를 사용하기 위해서는 AppModule에서 해당 인터셉터를 등록해야 합니다. providers 배열에 ErrorInterceptor를 추가하여 다음과 같이 등록할 수 있습니다.

import { Module } from '@nestjs/common';
import { APP_INTERCEPTOR } from '@nestjs/core';
import { ErrorInterceptor } from './error.interceptor';

@Module({
  providers: [
    {
      provide: APP_INTERCEPTOR,
      useClass: ErrorInterceptor,
    },
  ],
})
export class AppModule {}

위의 예시에서는 APP_INTERCEPTOR 상수를 사용하여 ErrorInterceptor를 등록하고 있습니다. 이렇게 등록하면 ErrorInterceptor가 모든 요청과 응답에 대해 적용됩니다.

로깅 설정하기

에러를 로깅하기 위해서는 로깅 라이브러리를 사용할 수 있습니다. 예를 들어, winston 라이브러리를 사용하여 로깅을 설정할 수 있습니다.

import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { Observable, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { Logger } from 'winston';

@Injectable()
export class ErrorInterceptor implements NestInterceptor {
  private readonly logger: Logger;

  constructor() {
    this.logger = new Logger();
  }

  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    return next.handle().pipe(
      catchError(err => {
        // 에러 핸들링 로직을 추가합니다.
        this.logger.error('에러가 발생했습니다:', err);
        
        // 에러 발생 시 클라이언트에게 응답을 보낼 수도 있습니다.
        // return throwError('서버 에러가 발생했습니다.');
        
        return throwError(err);
      }),
    );
  }
}

위의 예시에서는 winston 라이브러리를 사용하여 로깅을 구성하고 있습니다. Logger를 사용하여 에러 정보를 기록하고, 이를 콘솔이나 다른 로깅 대상으로 출력할 수 있습니다.

마치며

이렇게 자바스크립트 기반 NestJS 애플리케이션에서의 에러 로깅 방법을 알아보았습니다. ErrorInterceptor를 활용하여 애플리케이션 전역에서 에러를 처리하고, 로깅 라이브러리를 사용하여 로그를 기록하는 것이 에러 디버깅에 유용합니다. 애플리케이션을 개발할 때 에러 로깅에 충분한 주의를 기울여야합니다.

#NestJS, #에러로깅