[Nest.js] 예외 처리(Exception filters)

bshunter·2023년 8월 7일

Nest.js에서 예외 처리를 위한 내장 예외들과 사용자 정의 예외를 만드는 방법에 대해 알아보겠습니다.

Nest.js의 기본 제공 예외 클래스

Nest.js에서 기본적으로 제공하는 예외 클래스들은 모두 HttpException 클래스를 상속받습니다.
이 클래스들은 주로 HTTP API 서버에서 에러 처리를 위해 사용되며, 각각 다른 상황에서 사용됩니다.
기본 제공되는 예외 클래스들과 그들의 사용 상황은 다음과 같습니다.

1. BadRequestException (HTTP 400 Bad Request):

클라이언트가 올바르지 않거나 부족한 요청을 보낼 때 사용됩니다.
예를 들어, 클라이언트가 필수 파라미터를 누락하거나 잘못된 형식의 데이터를 전송할 경우 이 예외를 사용할 수 있습니다.

2.UnauthorizedException (HTTP 401 Unauthorized):

인증이 필요한 API 엔드포인트에 인증 없이 접근하려는 경우 사용됩니다.
예를 들어, 사용자 로그인을 필요로 하는 페이지에서 인증 Token이 없거나 유효하지 않은 경우 이 예외를 사용할 수 있습니다.

3.ForbiddenException (HTTP 403 Forbidden):

인증이 완료되었으나 인가되지 않은 사용자가 권한이 없는 자원에 접근하려고 할 때 사용됩니다.

4.NotFoundException (HTTP 404 Not Found):

존재하지 않는 페이지나 자원에 접근하려고 할 때 사용됩니다.
예를 들어, 삭제된 게시물에 접근하려고 할 때 이 예외를 사용할 수 있습니다.

5.MethodNotAllowedException (HTTP 405 Method Not Allowed):

클라이언트가 허용되지 않은 HTTP 메소드로 요청을 보낼 때 사용됩니다.
예를 들어, API 엔드포인트는 GET 메소드만 허용하는데 클라이언트가 POST 메소드로 요청을 보낼 경우 이 예외를 사용할 수 있습니다.

6.NotAcceptableException (HTTP 406 Not Acceptable):

클라이언트가 요청한 형식의 응답을 서버에서 처리할 수 없을 때 발생합니다.
예를 들어, 서버는 JSON 형태의 응답만을 지원하는데 클라이언트가 XML 형태의 응답을 요청한 경우 이 예외를 사용할 수 있습니다.

7.RequestTimeoutException (HTTP 408 Request Timeout):

클라이언트의 요청이 서버에서 정해진 시간 내에 완료되지 않았을 때 발생합니다.

8.ConflictException (HTTP 409 Conflict):

클라이언트의 요청이 서버 내의 리소스와 충돌이 발생할 수 있는 상황에서 사용됩니다.
예를 들어, 중복되는 데이터를 생성하려는 경우, 이 예외를 사용할 수 있습니다.

9.PayloadTooLargeException (HTTP 413 Payload Too Large):

클라이언트가 너무 큰 파일이나 데이터를 서버에 전송했을 때 사용됩니다.

10.UnsupportedMediaTypeException (HTTP 415 Unsupported Media Type):

클라이언트가 서버에서 지원하지 않는 미디어 형식을 요청했을 때 사용됩니다.

11.UnprocessableEntityException (HTTP 422 Unprocessable Entity):

요청의 구문은 올바르지만, 서버가 이를 처리할 수 없는 상황에서 사용됩니다.

사용자 정의 예외 클래스 생성하기

기본 제공되는 HTTP 예외 외에도 사용자 정의 예외를 만들어 사용할 수 있습니다.
사용자 정의 예외 클래스를 만드는 방법은 다음과 같습니다.

  1. HttpException 클래스를 상속받아 새로운 예외 클래스를 만듭니다.
  2. 생성자에 필요한 메시지와 상태 코드를 전달하여 super() 메서드를 호출합니다.
import { HttpException, HttpStatus } from '@nestjs/common';

export class CustomException extends HttpException {
  constructor(message: string, statusCode: number = HttpStatus.INTERNAL_SERVER_ERROR) {
    super(message, statusCode);
  }
}

위 코드에서 CustomException 클래스는 HttpException을 상속받아 사용자 정의 메시지와 선택적으로 상태 코드를 전달할 수 있도록 구현되었습니다.
이러한 사용자 정의 예외 클래스를 사용하면 애플리케이션의 도메인 특수한 예외를 처리하는 데 유용할 수 있습니다.
예외 클래스를 사용하려면 컨트롤러에서 해당 예외를 던지기만 하면 됩니다.

import { Controller, Get } from '@nestjs/common';
import { CustomException } from './exceptions/custom.exception';

@Controller('example')
export class ExampleController {
  @Get()
  getExample(): string {
    throw new CustomException('This is a custom exception', 500);
  }
}

마치며

Nest.js의 예외 처리를 이용하면 에러 상황에 대응하는 코드를 간결하게 작성할 수 있습니다. 기본 제공되는 예외 클래스를 활용할 수 있고, 필요한 경우 사용자 정의 예외 클래스를 만들어 애플리케이션의 도메인에 맞게 예외 처리를 구현할 수 있습니다. 이를 활용하여 응용 프로그램의 예외 관리를 간결하고 체계적으로 작성하여 전체적인 코드 품질을 향상시킬 수 있습니다.

0개의 댓글