[NestJS] 여러분들은 Class-validator가 거꾸로 실행된다는 것을 알았나요?

아이엠강욱·2023년 8월 16일
1

트러블슈팅

목록 보기
4/4

오늘 예비군 끝나고 너무 피곤해서.... 그냥 좀만 하고 일찍 자야겠다 해서 작업을 하는데...
아주 재밌는 개념을 하나 알아버렸지 모야.. 그리고 class-validator가 적용되어 있는 DTO 파일을 확인해야 한다는 좌절감이 아주 많이 들었다..

나는 지금 NestJS를 공부하면서 프로젝트를 진행하고 있다.
백엔드라면 꼭 처리해야 할 Validation 처리를 저는 Class-validator 라이브러리를 적용했다.

어떤 이슈를 겪으셨나용?

사실 다른 개발자분들이 보면 피식하실 수도 있지만...
나는 왜 안되지 왜 안되지 하다가 알게 된 사실.. 아니 어쩌면 내가 공식문서를 잘 못읽어본 탓일수도?

@IsNotEmpty({
    context: {
      code: ScheduleExceptionCodeNumber.ColorIdEmpty,
    },
  })
@IsInt({
  context: {
    code: CommonExceptionCodeNumber.MustInteger,
  },
})
@Max(15, {
  context: {
    code: ScheduleExceptionCodeNumber.ColorIdRangeError,
  },
})
@Min(1, {
  context: {
    code: ScheduleExceptionCodeNumber.ColorIdRangeError,
  },
})
readonly colorId!: number;

이거슨 프로젝트에서 일정 생성할 때 보내는 Request DTO중 하나의 property code를 가져온 것이다.
그러고 테스트를 해보는데 request body에 colorId를 넣지 않으면 IsNotEmpty decorator에서 걸러져야 했는데 그렇지 않고 Min decorator에서 걸리는 것이다.

다시 말해서 colorId를 body값에 넣지 않았는데 메세지가 ColorIdRangeError가 뜬 것이지!

그래서 어떻게 해결?

나는 지금 class-validator에서 유효성 검사를 하고 발생한 에러들을 custom으로 관리하고 있다.
아시다시피 class-validator에서는 발생한 에러들을 배열로 반환해주는데 나는 개인적으로 one-to-one 형태로 주는 것을 좋아한다. (클라이언트가 작업하기 쉽게 각 errorCode로 나눠주는 것을 선호하는 편이다)

그래서 custom으로 만든 pipe에서 error를 확인해보니까 이렇게 뜨는 것!

보시다시피 밑에서부터 찍히는 것을 알 수 있다. 그래서 errorCode가 2006번이 뜬 것이었다.
여기서 우리가 알 수 있는 점은 class-validator에서 선언한 decorator list는 아래에서부터 적용되어 위로 올라간다는 것이다.

나는 그래서 colorId를 body에 안담은 경우에는 2005 errorCode를 반환해야 하기 때문에 코드를 다음과 같이 바꾸었다.

@Max(15, {
    context: {
      code: ScheduleExceptionCodeNumber.ColorIdRangeError,
    },
  })
  @Min(1, {
    context: {
      code: ScheduleExceptionCodeNumber.ColorIdRangeError,
    },
  })
  @IsInt({
    context: {
      code: CommonExceptionCodeNumber.MustInteger,
    },
  })
  @IsNotEmpty({
    context: {
      code: ScheduleExceptionCodeNumber.ColorIdEmpty,
    },
  })
  readonly colorId!: number;

이렇게 하니 정상적으로 내가 원하는 IsNotEmpty에 대한 errorCode가 반환되는 것을 확인할 수 있었다.

사실 이건 별거 아닌것 같지만 그래도 개발하면서 알게 된 사실이라서 기록을 해놓은 것이당
안해놓으면 또 까먹을 테니... 혹시나 저처럼 Nest에 아직 많이 익숙하지 않은 상태시라면 도움이 될만한 문서가 될 수 있겠다고 생각한다! 안뇽

profile
블로그 이전했습니다!! https://dev-iamkanguk.tistory.com/ <<- 여기로 오세용!!

0개의 댓글