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
를 활용하여 애플리케이션 전역에서 에러를 처리하고, 로깅 라이브러리를 사용하여 로그를 기록하는 것이 에러 디버깅에 유용합니다. 애플리케이션을 개발할 때 에러 로깅에 충분한 주의를 기울여야합니다.