프로젝트를 진행하며 방금 겪은 오류를 정리합니다.
위의 오류를 겪었으나, 이슈는 전혀 달랐습니다.
이것이 무슨 에러일까? 읽는 그대로 유효성 검사에 실패했다는 오류입니다.
해석을 해보면 숫자 값과 문자열 값 사이 예상되는 부분이 달라서 뱉어내는 오류로 보입니다.
프로젝트를 진행하며 분명히 이상한 코드가 없었는데 위의 오류가 계속해서 나왔습니다.
@Get('/by-date')
async getMogacoByDate(@Query('date') date: string): Promise<MogacoDto[]>
return this.mogacoService.getMogacoByDate(date);
}
컨트롤러단의 해당 부분이며 전혀 문제될 것이 없습니다.
쿼리스트링으로 key 값으로 'date'를 받고 그에 대한 타입은 string으로 해놓았습니다.
이 말인 즉슨 유효성 검사가 갑자기 터질 이유가 전혀 없습니다.
{
"message": "Validation failed (numeric string is expected)",
"error": "Bad Request",
"statusCode": 400
}
하지만 위와 같은 오류가 계속해서 발생하였습니다.
병목지점에 대한 파악을 할 수가 없었습니다.
콘솔을 찍어보아도 해당 요청으로 들어가면서 바로 오류를 반환했기 때문에 에러코드는 저것이 전부였습니다.
콘솔로그가 나오지 않는다? -> 라우팅 과정에서 문제가 발생했다. -> 유효성오류가 발생한다?
이 로직을 따라가보았고 정답을 알 수 있었습니다.
@Get('/')
async getAllMogaco(): Promise<Mogaco[]> {
return this.mogacoService.getAllMogaco();
}
@Get('/by-date')
async getMogacoByDate(@Query('date') date: string): Promise<MogacoDto[]> {
return this.mogacoService.getMogacoByDate(date);
}
@Get('/:id')
async getMogacoById(@Param('id', ParseIntPipe) id: number): Promise<MogacoWithMemberDto> {
return this.mogacoService.getMogacoById(id);
}
위와 같이 사이에 있는 많은 코드들 사이에서
:id 위로 해당 함수를 옮기자 해결되었습니다.
Get에서 :id 인 API가 존재합니다.
여기서 느낌이 온 점은 쿼리스트링으로 반환을 할 때 validation이 자꾸 걸린다는 점이었는데
저 해당 부분에서 병목지점이 발생하진 않았을까? 의심이 들었고 위로 올렸더니 전부 해결되었습니다.
NestJS의 라우팅 시스템은 URL 패턴을 분석하고 첫 번째로 매치되는 라우트 핸들러를 실행한다고 합니다.
아마 이 시스템에서 매칭을 :id로 했기 때문에 id값에 있는 ParseIntPipe에서 계속 걸려서 유효성 에러가 난 듯 싶습니다.
대체 매칭 시스템이 어떻게 되어있길래 :id랑 /by-date?date=2023 이거를 매칭을 못하나 싶은 생각이 들었습니다.
결론적으로 해결했고, 다음에도 이러한 상황이 온다면 쉽게 해결할 수 있을 것 같습니다.
위와 같은 오류가 뜨면 유효성 문제에 대해서 먼저 생각해보고 그 다음은
이 이슈를 떠올려보면 좋을 것 같습니다.
감사합니다