[NestJS] TypeORM 에러 핸들링에 관해

루나·2022년 6월 5일
1

Nestjs에서 에러 핸들링을 할 때 filter를 사용해서 HttpException 에러를 핸들링 해왔는데 TypeORM을 쓰면서 HttpException이 아닌 QueryFailedError가 생기는 상황이 발생했다.

[Nest] 19436 - 2022. 06. 05. 오후 12:29:35 ERROR [ExceptionsHandler] QueryFailedError: duplicate key value violates unique constraint "UQ_e12875dfb3b1d92d7d7c5377e22"

{
    "statusCode": 500,
    "message": "Internal server error"
}

이번 프로젝트에서의 기본 에러 형식은 아래와 같았으며 위의 응답값을 보낸다면 프론트에서 success를 받지 못해 또다른 에러가 발생할 것이다.

{
      success: false,
      response: null,
      error: {
          message: '예외 메시지',
          status: ...,
      }
  }

이 에러를 핸들링하기 위해 당연히 @Catch(QueryFailedError)를 사용하면 될거라고 생각하며 새 필터를 작성했다.

@Catch(QueryFailedError)
export class QueryFailedExceptionFilter implements ExceptionFilter {
  catch(exception: QueryFailedError, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();

    Logger.log(exception);

    response.status(HttpStatus.BAD_REQUEST).json({
      success: false,
      response: null,
      error: {
        message: exception,
        status: 401,
      },
    });
  }
}

하지만 기대한 결과와는 다르게 Nest에서 기본적으로 제공해주는 위의 응답값이 돌아왔다.
이 문제를 해결하기 위해 모든 에러를 잡아주는 @Catch()도 사용해봤으나 여기서도 만족스럽지 못한 결과를 얻지 못했다.

일단은 에러가 나온 이유인 중복값 체크를 로직상에서 잡아주는 방식으로 해결했다.

const temp = await this.findOne({ email });
if (temp) throw new UnauthorizedException('이미 존재하는 이메일입니다.');

이 문제는 아마도 네스트 로직 측에서 생긴 오류가 아니라 DB측에서 발송해준 에러라서 잡지 못하는 것 같다.
사실 중요한 문제도 아니며 이러한 에러를 발견할 때마다 새로 처리를 해준다면 해결되겠지만 그럴때마다 프론트측에 잘못된 데이터 컨벤션을 발송한다는 점이 매우 찝찝했다.
만약 어떻게든 제대로된 데이터 컨벤션을 응답으로 보내주겠다면 모든 에러를 핸들링해주는 방법을 사용하여 해결하면 된다.

profile
백엔드 개발자

0개의 댓글