예외 필터(Exception Filters)?
NestJS에서 예외 처리를 커스터마이징하는 데 사용되는 기능입니다.
애플리케이션 내에서 발생하는 모든 예외를 잡아내고, 개발자가 정의한 방식으로 처리할 수 있게 해줌으로 애플리케이션 전반에 걸쳐 일관된 에러 응답 포맷을 유지할 수 있으며, 추가적인 로깅이나 에러 처리 로직을 적용할 수 있어요.
그래서 아래와 같은 상황에 자주 쓰여요.
- 클라이언트에게 보다 명확하고 일관된 에러 응답을 제공하고 싶을 때
- 특정 예외 유형에 대해 세부적인 처리 로직을 적용하고 싶을 때
- 애플리케이션에서 발생하는 모든 예외를 로깅하고 모니터링하고 싶을 때
예외 필터(Exception Filters)의 장점
모든 예외 처리 로직을 한 곳에서 관리할 수 있어, 코드의 가독성과 유지보수성이 좋아지고,
사용자에게 더 이해하기 쉬운 에러 메시지와 상태 코드를 제공함으로써 사용자 경험을 개선할 수 있게 됩니다.
그럼 이제 예시 코드를 살펴보죠.
HTTP 예외 시
import { ExceptionFilter, Catch, ArgumentsHost, HttpException } from '@nestjs/common';
import { Response } from 'express';
@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 errorResponse = exception.getResponse();
response
.status(status)
.json({
statusCode: status,
message: errorResponse['message'] || 'Internal Server Error',
timestamp: new Date().toISOString(),
path: ctx.getRequest().url,
});
}
}
이 예시에서 HttpExceptionFilter가 HTTP 예외를 잡아내고, 클라이언트에게 JSON 형식의 커스터마이즈된 에러 응답을 전송합니다. 이렇게 하면 클라이언트는 에러 발생 시 보다 명확한 정보를 받을 수 있어요.
사용자 정의 예외 필터로 비즈니스 로직 예외 처리하기
import { ExceptionFilter, Catch, ArgumentsHost } from '@nestjs/common';
import { Response } from 'express';
import { ForbiddenException } from './forbidden.exception'; // 가정한 사용자 정의 예외
@Catch(ForbiddenException)
export class ForbiddenExceptionFilter implements ExceptionFilter {
catch(exception: ForbiddenException, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse<Response>();
const status = exception.getStatus(); // 사용자 정의 예외에 따라 상태 코드를 설정
response
.status(status)
.json({
statusCode: status,
message: '접근 권한이 없습니다.',
error: 'Forbidden',
timestamp: new Date().toISOString(),
path: ctx.getRequest().url,
});
}
}
이 예시에서 ForbiddenExceptionFilter는 특정 조건 하에서 발생하는 ForbiddenException을 잡아내고, 클라이언트에게 접근 권한이 없음을 알리는 사용자 친화적인 메시지와 함께 응답하게 되는데 이렇게 하면 애플리케이션은 보다 세밀하고 의미 있는 에러 처리를 제공할 수 있어요.
예외 필터 사용 시 주의할 점
- 다양한 유형의 예외에 대해 적절히 처리할 수 있도록, 예외 유형별로 필터를 구분하여 적용해주어야 해요.
- 예외 필터 내에서 복잡한 로직을 실행할 경우, 애플리케이션의 성능에 영향을 줄 수 있으므로 주의가 필요해요.
- 필터를 글로벌하게 적용할지, 아니면 특정 핸들러나 컨트롤러에만 적용할지 결정할 때는 애플리케이션의 요구 사항을 고려해야 해요.
오늘은 NestJS의 예외 필터에 대해 알아보았는데요. 예외 필터는 애플리케이션의 예외 처리 전략을 개선하고, 에러 응답을 표준화하여 클라이언트와의 커뮤니케이션을 개선하는 데 아주 유용해요.
예외필터가 적절히 사용된다면 보다 견고하고 사용자 친화적인 API를 구축하는 데 기여할 수 있으니 API를 구축하실 때 참고해보면 좋겠습니다.
'프로그래밍(Basic) > NestJS' 카테고리의 다른 글
[바미] Nest - 마이크로서비스(Microservices) (0) | 2024.03.11 |
---|---|
[바미] Nest - 파이프(Pipes) (0) | 2024.03.08 |
[바미] NestJS - 가드(Guards) (0) | 2024.03.06 |
[바미] NestJS - 인터셉터(Interceptors) (0) | 2024.03.05 |
[바미] NestJS - 데코레이터(Custom decorators) (0) | 2024.03.02 |