본문 바로가기
개발 프레임워크/NestJS

[NestJS] 배열 구문 분석 및 유효성 검사, DTO 검증

by minhyeok.lee 2023. 2. 23.
반응형

NestJS에서 배열 구문 분석 및 유효성 검사, DTO 검증


TypeScript는 제네릭 또는 인터페이스에 대한 메타데이터를 저장하지 않으므로 DTO에서 사용할 때 ValidationPipe들어오는 데이터의 유효성을 제대로 검사하지 못할 수 있다. 

 

0-1). 아래와 같은 CreateUserDto가 있다고 하자.

 

CreateUserDto 속성들
CreateUserDto 속성들

 

0-2). 예를 들어 아래 Body에 CreateUserDto의 속성들을 빈값으로 넣어준다.

 

1-1) 다음 코드에서는 0-2)같은 createUserDto배열의 내용들이 올바르게 유효성이 검사되지 않는다.

  @Post()
  @ApiBody({ type: [CreateUserDto] })
  @ApiOperation({
    summary: `새로운 User 추가`,
  })
  @ApiCreatedResponse({
    type: [CreateUserDto],
  })
  async createUsers(
    @Body() usersDto: CreateUserDto[],
  ) {
    return this.userService.create(usersDto);
  }

 

1-2). 아래와 같이 Swagger에서 DTO검증이 제대로 되지 않고 성공하는 모습을 볼 수 있다.

Swagger에서 DTO검증이 제대로 되지 않고 성공하는 모습
Swagger에서 DTO검증이 제대로 되지 않고 성공하는 모습

 

 

 

2-1) 배열의 유효성을 검사하려면

 - 배열을 래핑하는 속성이 포함된 전용 클래스를 만들어야한다.

 - ParseArrayPipe를 사용해야 한다.

다음 코드에서는 0-2)같은 createUserDto배열의 내용들이 올바르게 유효성이 검사된다.

  @Post()
  @ApiBody({ type: [CreateUserDto] })
  @ApiOperation({
    summary: `새로운 User 추가`,
  })
  @ApiCreatedResponse({
    type: [CreateUserDto],
  })
  async createUsers(
    @Body(new ParseArrayPipe({ items: CreateUserDto }))
    usersDto: CreateUserDto[],
  ) {
    return this.userService.create(usersDto);
  }

 

 

2-2) 아래와 같이 Swagger에서 DTO검증이 제대로 되어 400Error가 발생한  모습을 볼 수 있다.

Swagger에서 DTO검증이 제대로 되어 400Error가 발생한 모습
Swagger에서 DTO검증이 제대로 되어 400Error가 발생한 모습

 

 

 

* 쿼리 매개변수를 구문 분석할 때 ParseArrayPipe가 유용할 수 있다. 

쿼리 매개변수로 전달된 식별자를 기반으로 사용자를 반환하는 findByIds() 메서드가 있다고 해보자.

@Get()
findByIds(
  @Query('ids', new ParseArrayPipe({ items: Number, separator: ',' }))
  ids: number[],
) {
  return 'This action returns users by ids';
}

 

이 구조는 다음과 같이 HTTP GET 요청에서 들어오는 쿼리 매개변수의 유효성을 검사한다.

GET /?ids=1,2,3

 

반응형

댓글