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

bshunter·2023년 8월 7일
0

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개의 댓글