exception-filters
https://docs.nestjs.com/exception-filters
Nest 는 Exception Layer 를 가집니다.
#
Exception Layer앱으로 부터 처리되지 않은 모든 예외를 처리하여
- 사용자 친화적인 응답으로 내보낸다.
#
global exception filter 전역 예외 필터HttpException
와 하위 클래스의 예외를 처리한다.
이 외 예외는 exception filter 가 기본 JSON 응답을 생성한다.
global exception filter 는 부분적으로 http-error 를 지원하는 라이브러리 이다.
- statusCode 와 message 프로퍼티를 가지는 예외라면 적절한 응답을 반환한다.
- (instead of the default InternalServerErrorException for unrecognized exceptions).
#
HttpException#
표준 예외 던지기Nest 의 내장 HttpException
클래스
- HTTP REST/GraphQL API 기반 어플리케이션에서, 특정 에러가 발생했을 때 HTTP 표준 응답을 주는 것이 Best Practice 이다.
#
HttpException 생성자의 매개변수response
- JSON Response Body message 를 정의
- type: string | object
status
- HTTP 상태 코드를 정의
#
JSON response bodystatusCode
status
인수 값의 HTTP status code
message
statusCode
에 대한 짧은 설명
#
JSON response body 재정의 하기#
사용자 정의 예외extends HttpException
로서 Nest 는 사용자 정의 예외임을 알 수 있다.
대부분의 경우, 사용자 정의 예외보다 built-in Nest HTTP exception 을 사용 할 것임.
#
Built-in HTTP exceptionsNest 는 HttpException 을 상속한 표준 예외를 제공한다.
BadRequestException
UnauthorizedException
NotFoundException
ForbiddenException
NotAcceptableException
RequestTimeoutException
ConflictException
GoneException
HttpVersionNotSupportedException
PayloadTooLargeException
UnsupportedMediaTypeException
UnprocessableEntityException
InternalServerErrorException
NotImplementedException
ImATeapotException
MethodNotAllowedException
BadGatewayException
ServiceUnavailableException
GatewayTimeoutException
PreconditionFailedException
#
Exception filters기본(내장) 예외 필터가 많은 경우를 자동으로 처리할 수 있지만
예외 계층에 대한 Full Control 이 필요한 경우도 있다.
#
Exception filters 의 설계 목적정확한 제어 흐름과 클라이언트로 다시 전송되는 응답 내용을 제어한다.
- logging 추가하기
- dynamic factors 에 기반한 different JSON schema 사용
implements ExceptionFilter
#
- 모든 Exception filters 는
generic ExceptionFilter<T>
인터페이스를 구현해야 한다. catch(exception: T, host: ArgumentsHost)
메서드를 제공한다.T
: 예외 타입
@Catch(HttpException)
#
- 필요한 metadata 를 Exception Filter 에게 바인드 한다.
- HttpException 예외를 찾으라고 Nest 에게 이야기 해준다.
- 하나 혹은 comma 로 구분된 리스트를 인자로 받는다.
#
Arguments hostExceptionFilter 클래스의 catch(exception: HttpException, host: ArgumentsHost)
메서드
exception
- 현재 처리되고 있는 예외 객체
host
- ArgumentsHost 객체
ArgumentsHost
- 실행 컨텍스트[execution context] 를 알 수 있는 강력한 유틸리티 객체
http-exception.filter.ts
예시에서 알 수 있는 것들- 오리지널 Request 핸들러로 전달되는 Request 및 Response 객체
- Request and Response 객체를 얻기 위한 헬퍼 메서드의 사용
#
바인딩 filters인스턴스 대신 클래스를 전달하여 프레임워크에 인스턴스화에 대한 책임을 맡기고 종속성 주입을 활성화할 수 있습니다.
필터 적용시, 인스턴스보다 클래스를 사용하는 것이 선호됩니다.
- 클래스를 사용하는 방법은, 메모리 사용을 감소시킵니다.
- Nest 는 모듈 간의 동일한 인스턴스를 쉽게 재활용 할 수 있기 때문임.
#
예외 필터의 스코프 레벨- method-scoped 메서드
- controller-scoped 컨트롤러
- global-scoped 전역
warning
useGlobalFilters()
메서드는 gateways 혹은 hybrid applications 에 대해 필터를 설정하지 못한다.
전역 스코프 필터는, 어플리케이션의 모든 곳(컨트롤러, 라우트 핸들러) 에서 사용될 수 있다.
의존성 주입의 관점에서, 전역 스코프 필터는 모듈 외부에서 등록 되었기 때문에 종속성 주입을 할 수 없다.
- 모듈 컨텍스트 외부에서 수행되기 때문이다.
해결 방법으로, 전역 스코프 필터를 모듈에 바로 등록하여 종속성 주입을 사용할 수 있다.
app.module.ts
@Catch()
#
Catch everything 처리되지 않은 모든 예외를 캐치하려면 @Catch()
(empty parameter) 를 사용한다.
platform-agnostic
- response 를 전달하기 위해 HTTP adapter 를 사용한다.
- platform-specific objects (Request and Response) 를 직접적으로 사용하지 않음.
#
Inheritance- 일반적으로, 어플리케이션의 요구사항을 이행하기 위해 fully customized exception filters 를 생성한다.
- 그러나, 간단히 빌트인 default global exception filter 를 사용하고 싶은 케이스도 있다.
BaseExceptionFilter
를 확장하고 확장된catch()
메서드를 호출한다.- BaseExceptionFilter 를 확장한 Method-scoped 와 Controller-scoped 필터는 new 로 초기화 되면 안된다.
- 프레임워크가 자동으로 초기화 한다.
#
전역필터로 등록하기- 모듈에
APP_FILTER
사용하기