2025년 2월 4일

김동환·2025년 2월 4일
0

TIL: NestJS 예외 처리

오늘은 NestJS에서 예외를 처리하는 방법에 대해 학습했다. 기본적으로 @nestjs/common에서 제공하는 HttpException과 그 하위 예외 클래스들을 활용하여 서버 응답을 커스터마이징할 수 있다.

1. 글로벌 예외 필터 (HttpExceptionFilter)

먼저, HttpExceptionFilter를 만들어서 애플리케이션 전반에서 발생하는 예외를 한 곳에서 처리할 수 있도록 했다.

주요 기능

  • @Catch(HttpException) 데코레이터를 사용해 HttpException을 감지.
  • exception.getStatus()를 통해 HTTP 상태 코드를 가져오고, 예외 메시지를 응답에 포함.
  • 예외의 유형을 분류하여 errorType을 설정하고 클라이언트에게 반환.

src/common/exception/http-exception.filter.ts

@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 message = exception.message || '서버 에러가 발생했습니다.';

    let errorType = 'HttpException';
    if (exception instanceof UnauthorizedException) {
      errorType = 'UnauthorizedException';
    } else if (exception instanceof BadRequestException) {
      errorType = 'BadRequestException';
    } else if (exception instanceof NotFoundException) {
      errorType = 'NotFoundException';
    } else if (exception instanceof ConflictException) {
      errorType = 'ConflictException';
    } else if (exception instanceof InternalServerErrorException) {
      errorType = 'InternalServerErrorException';
    }

    response.status(status).json({
      statusCode: status,
      errorType: errorType,
      message: message,
    });
  }
}

이 필터를 설정하면 NestJS에서 발생하는 예외를 클라이언트가 이해하기 쉬운 JSON 형식으로 변환하여 반환할 수 있다.


2. 사용자 정의 예외 클래스

기본 예외만으로는 특정 도메인 로직을 처리하기 어려운 경우가 많다.
예를 들어, 댓글 시스템을 개발할 때 발생할 수 있는 예외를 보다 직관적으로 처리할 필요가 있다.
이를 위해 NotFoundExceptionBadRequestException을 확장하여 새로운 예외 클래스를 만들었다.

주요 예외 클래스

  • CommentNotFoundException: 댓글이 존재하지 않을 때 발생.
  • CommentPermissionException: 댓글을 수정 또는 삭제할 권한이 없을 때 발생.
  • EmptyCommentException: 댓글 내용이 비어 있을 때 발생.
  • CommentLengthExceededException: 댓글 길이가 50자를 초과할 때 발생.

src/common/exception/comment.exception.ts

export class CommentNotFoundException extends NotFoundException {
  constructor() {
    super('댓글을 찾을 수 없습니다.');
  }
}

export class CommentPermissionException extends NotFoundException {
  constructor() {
    super('댓글을 찾을 수 없거나 수정/삭제할 권한이 없습니다.');
  }
}

export class EmptyCommentException extends BadRequestException {
  constructor() {
    super('댓글 내용을 비울 수 없습니다.');
  }
}

export class CommentLengthExceededException extends BadRequestException {
  constructor() {
    super('댓글 내용은 50자를 넘길 수 없습니다.');
  }
}

이렇게 예외 클래스를 정의하면 서비스 로직에서 명확하게 예외를 던질 수 있고,
클라이언트는 구체적인 에러 메시지를 받을 수 있어 사용자 경험이 향상된다.


3. 오늘의 배운 점

  1. NestJS의 ExceptionFilter를 활용하여 전역 예외를 처리할 수 있다.
  2. 커스텀 예외 클래스를 만들어 특정 도메인에 맞는 예외를 정의할 수 있다.
  3. 예외 필터를 활용하면 일관된 JSON 형식의 오류 응답을 제공할 수 있어 클라이언트가 에러를 이해하기 쉬워진다.

이번 학습을 통해 NestJS의 예외 처리 구조를 깊이 이해할 수 있었고, 실제 프로젝트에서 적용할 때 큰 도움이 될 것 같다.

profile
Node.js 7기

0개의 댓글

관련 채용 정보