오늘은 NestJS에서 예외를 처리하는 방법에 대해 학습했다. 기본적으로 @nestjs/common
에서 제공하는 HttpException
과 그 하위 예외 클래스들을 활용하여 서버 응답을 커스터마이징할 수 있다.
먼저, HttpExceptionFilter
를 만들어서 애플리케이션 전반에서 발생하는 예외를 한 곳에서 처리할 수 있도록 했다.
@Catch(HttpException)
데코레이터를 사용해 HttpException
을 감지.exception.getStatus()
를 통해 HTTP 상태 코드를 가져오고, 예외 메시지를 응답에 포함.errorType
을 설정하고 클라이언트에게 반환.src/common/exception/http-exception.filter.ts
@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 message = exception.message || '서버 에러가 발생했습니다.';
let errorType = 'HttpException';
if (exception instanceof UnauthorizedException) {
errorType = 'UnauthorizedException';
} else if (exception instanceof BadRequestException) {
errorType = 'BadRequestException';
} else if (exception instanceof NotFoundException) {
errorType = 'NotFoundException';
} else if (exception instanceof ConflictException) {
errorType = 'ConflictException';
} else if (exception instanceof InternalServerErrorException) {
errorType = 'InternalServerErrorException';
}
response.status(status).json({
statusCode: status,
errorType: errorType,
message: message,
});
}
}
이 필터를 설정하면 NestJS에서 발생하는 예외를 클라이언트가 이해하기 쉬운 JSON 형식으로 변환하여 반환할 수 있다.
기본 예외만으로는 특정 도메인 로직을 처리하기 어려운 경우가 많다.
예를 들어, 댓글 시스템을 개발할 때 발생할 수 있는 예외를 보다 직관적으로 처리할 필요가 있다.
이를 위해 NotFoundException
과 BadRequestException
을 확장하여 새로운 예외 클래스를 만들었다.
CommentNotFoundException
: 댓글이 존재하지 않을 때 발생.CommentPermissionException
: 댓글을 수정 또는 삭제할 권한이 없을 때 발생.EmptyCommentException
: 댓글 내용이 비어 있을 때 발생.CommentLengthExceededException
: 댓글 길이가 50자를 초과할 때 발생.src/common/exception/comment.exception.ts
export class CommentNotFoundException extends NotFoundException {
constructor() {
super('댓글을 찾을 수 없습니다.');
}
}
export class CommentPermissionException extends NotFoundException {
constructor() {
super('댓글을 찾을 수 없거나 수정/삭제할 권한이 없습니다.');
}
}
export class EmptyCommentException extends BadRequestException {
constructor() {
super('댓글 내용을 비울 수 없습니다.');
}
}
export class CommentLengthExceededException extends BadRequestException {
constructor() {
super('댓글 내용은 50자를 넘길 수 없습니다.');
}
}
이렇게 예외 클래스를 정의하면 서비스 로직에서 명확하게 예외를 던질 수 있고,
클라이언트는 구체적인 에러 메시지를 받을 수 있어 사용자 경험이 향상된다.
ExceptionFilter
를 활용하여 전역 예외를 처리할 수 있다.이번 학습을 통해 NestJS의 예외 처리 구조를 깊이 이해할 수 있었고, 실제 프로젝트에서 적용할 때 큰 도움이 될 것 같다.