일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 알파회계
- network configuration
- 자료구조와 함께 배우는 알고리즘 입문
- 데비안
- 목록처리
- 티스토리 쿠키 삭제
- baeldung
- 선형대수
- 구멍가게코딩단
- 친절한SQL튜닝
- 처음 만나는 AI 수학 with Python
- 네트워크 설정
- d
- 코드로배우는스프링부트웹프로젝트
- /etc/network/interfaces
- 스프링부트핵심가이드
- resttemplate
- iterator
- GIT
- 자료구조와함께배우는알고리즘입문
- 서버설정
- 리눅스
- 이터레이터
- 처음 만나는 AI수학 with Python
- ㅒ
- Kernighan의 C언어 프로그래밍
- 자바편
- 페이징
- 스프링 시큐리티
- 코드로배우는스프링웹프로젝트
- Today
- Total
bright jazz music
NestJS의 예외(표준, 커스텀) 클래스 사용방식 본문
1. HttpException 을 이용한 표준 예외 구현
NestJS에는 예외를 처리하는 계층이 프레임워크 자체에 내장돼 있다. 이것들은 코드를 통해 직접적으로 예외가 제어되지 않는 경우 동작하며, 자동적으로 사용자 친화적인 에러를 반환한다. 스프링에서 필터나 인터셉터와 같은 것들과 비슷하게 말이다.
이는 내장된 global exception filter에 의해 수행되며, 이 필터는 HttpException 타입의 예외를 다룬다.
그리하여 기본적으로 아래와 같은 형식의 예외를 반환한다.
{
"statusCode": 500,
"message": "Internal server error"
}
nestJS는 기본적으로 HttpException 클래스를 제공한다. 만약 앱이 전형적인 HTTP Rest/GraphQL AP를 기반으로 한다면, 이 클래스를 사용하여 response를 구성하여 반환하는 것이 권장된다.
import { Controller, Get, Post, Body, HttpException, HttpStatus } from '@nestjs/common';
import { CreateCatDto } from './dto/create-cat.dto';
import { CatsService } from './cats.service';
import { Cat } from './interfaces/cat.interface';
@Controller('cats')
export class CatsController {
// private final CatsService catsService 과 유사. 캣서비스 인스턴스를 주입받아 사용
constructor(private catsService: CatsService) {}
// ...
// @Get()
// async findAll() {
// throw new HttpException('Forbidden', HttpStatus.FORBIDDEN)
// HttpException은 예외처리를 위해 NestJs에서 제공하는 표준 에러 처리 클래스이다.
// 첫 번째 파라미터는 response(-> message))로 response body에 들어갈 스트링 또는 오브젝트 형태의 값을 넘겨야 한다. 오브젝트의 경우 nest.js에서 자동 직렬화.
// 두 번째 파라미터는 상태 코드(statusCode)이다. HttpStatus의 enum을 사용하는 것이 권장된다. 이 두 파라미터는 필수로 입력해 줘야 한다.
// 세 번째 파라미터는 options이다. 에러 원인을 제공하는 데 주로 사용되며 자동으로 직렬화 되지 않는다.
// {"statusCode":403,"message":"Forbidden"}
// }
@Get()
async findAll() : Promise<Cat[]> {
try {
throw new Error() // 일부러 에러 발생시키기.
return await this.catsService.findAll()
} catch (error) {
throw new HttpException({
status: HttpStatus.FORBIDDEN,
error: 'This is a custom message',
}, HttpStatus.FORBIDDEN, {
cause: error
// {"status":403,"error":"This is a custom message"}
});
}
}
}
2. 내장 예외 클래스(built-in exception class) 사용
nestJS에서는 HttpException을 상속하여 작성된 내장 예외 클래스를 제공한다. 그 예는 아래와 같다.
- BadRequestException
- UnauthorizedException
- NotFoundException
- ForbiddenException
- NotAcceptableException
- RequestTimeoutException
- ConflictException
- GoneException
- HttpVersionNotSupportedException
- PayloadTooLargeException
- UnsupportedMediaTypeException
- UnprocessableEntityException
- InternalServerErrorException
- NotImplementedException
- ImATeapotException
- MethodNotAllowedException
- BadGatewayException
- ServiceUnavailableException
- GatewayTimeoutException
- PreconditionFailedException
언급했다시피 이러한 예외 클래스들은 HttpException을 상속했기 때문에 메시지 역할을 하는 response 파라미터 외에 cause와 options 파라미터도 받을 수 있다.
내부는 다음과 같이 작성돼 있다. ForbiddenException을 예시로 하였다.
import { HttpException, HttpExceptionOptions } from './http.exception';
/**
* Defines an HTTP exception for *Forbidden* type errors.
*
* @see [Built-in HTTP exceptions](https://docs.nestjs.com/exception-filters#built-in-http-exceptions)
*
* @publicApi
*/
export declare class ForbiddenException extends HttpException {
/**
* Instantiate a `ForbiddenException` Exception.
*
* @example
* `throw new ForbiddenException()`
*
* @usageNotes
* The HTTP response status code will be 403.
* - The `objectOrError` argument defines the JSON response body or the message string.
* - The `descriptionOrOptions` argument contains either a short description of the HTTP error or an options object used to provide an underlying error cause.
*
* By default, the JSON response body contains two properties:
* - `statusCode`: this will be the value 403.
* - `message`: the string `'Forbidden'` by default; override this by supplying
* a string in the `objectOrError` parameter.
*
* If the parameter `objectOrError` is a string, the response body will contain an
* additional property, `error`, with a short description of the HTTP error. To override the
* entire JSON response body, pass an object instead. Nest will serialize the object
* and return it as the JSON response body.
*
* @param objectOrError string or object describing the error condition.
* @param descriptionOrOptions either a short description of the HTTP error or an options object used to provide an underlying error cause
*/
constructor(objectOrError?: string | object | any, descriptionOrOptions?: string | HttpExceptionOptions);
}
간단한 용례
// @nestjs/common에서 임포트
import {ForbiddenException} from '@nestjs/common';
//...
@Controller('cats')
export class CatsController {
constructor(private catsService: CatsService) {}
//...
@Get()
async findAll() {
// 예외 사용
throw new ForbiddenException();
}
}
// http://localhost:3000/cats 이 경로로 접근한다면 아래와 같은 객체를 반환한다.
{"message":"Forbidden","statusCode":403}
파라미터를 넣어서 반환하는 경우 아래와 같이 할 수 있다. 이 경우는 BadRequstException을 사용하였다.
import { BadRequestException} from '@nestjs/common';
//...
@Get()
async findAll() {
throw new BadRequestException('Something bad happened', {
cause: new Error(),
description: 'Some error description',
});
}
//http://localhost:3000/cats 로 접근했을 때
// 아래와 같은 객체 반환
{"message":"Something bad happened","error":"Some error description","statusCode":400}
3. 커스텀 예외
웬만한 예외는 위의 내장 예외 클래스를 사용하면 된다. 만약 고유한 예외를 작성해서 사용하고 싶다면 내장 예외 클래스들처럼 HttpException을 상속하는 클래스를 직접 작성해주면 된다.
// src/exceptions/forbidden.esception.ts 커스텀 예외를 위한 디렉토리를 만들고 생성해주었다.
import { HttpException, HttpStatus } from "@nestjs/common";
export class CustomForbiddenException extends HttpException {
constructor() {
super('CustomForbidden', HttpStatus.FORBIDDEN)
}
}
/*
custom exception:
nestJS에 내장된 HTTP 예외 이외의 예외를 설정하고 싶은 경우,
이처럼 HttpException을 상속하여 만든 것도 좋은 방법이다.
왜냐하면 nest가 이것이 에러라는 것을 감지하고 자동적으로 에러 리스펀스를 다뤄주기 때문이다.
*/
컨트롤러에서 일부러 에러를 내도록 적어주고 테스트 해보면
import { Controller, Get, Post, Body, HttpException, HttpStatus } from '@nestjs/common';
import { CreateCatDto } from './dto/create-cat.dto';
import { CatsService } from './cats.service';
import { Cat } from './interfaces/cat.interface';
//커스텀 예외를 임포트
import { CustomForbiddenException } from 'src/exceptions/forbidden.exception';
@Controller('cats')
export class CatsController {
// private final CatsService catsService 과 유사. 캣서비스 인스턴스를 주입받아 사용
constructor(private catsService: CatsService) {}
//...
@Get()
async findAll() {
throw new CustomForbiddenException();
}
}
아래와 같이 해당 경로에 접근해 보면 커스텀 예외 객체가 반환된다.
브라우저에서 http://localhost:3000/cats 접근했다면
아래와 같은 예외 객체가 화면에 표시된다.
{"statusCode":403,"message":"CustomForbidden"}
'Framework > NestJS' 카테고리의 다른 글
[nestjs] 2.1. auth구현 (1) : 회원가입,로그인,로그아웃 (1) | 2024.12.19 |
---|---|
[nestjs] 1. 테스트 프로젝트 생성 (0) | 2024.12.19 |
nestjs의 Pipe (1) | 2024.11.10 |
NestJS의 예외처리: 예외 필터 사용(Exception filter) (0) | 2024.11.06 |
NestJs 프로젝트 (0) | 2024.05.13 |