중첩객체 타입지정하기

ansunny1170·2023년 4월 18일
0

개발

목록 보기
2/11

문제 제기

서버 코드 중에 아래와 같은 dto파일이 있다.
내가 모르는 부분은 @Type(()=> xxxDto), plainToTinstance 였다.

  // 제품 기본 정보
  @ApiProperty({ description: '제품 기본 정보', type: HealthFunctionalFoodDto })
  @ValidateNested()
  @Transform(({ value, key, obj, type }) => {
    if (obj.productType == ProductType.HEALTH_FUNCTIONAL_FOOD) {
      return plainToInstance(HealthFunctionalFoodDto, value)
    }
  })
  productBasicInfo: HealthFunctionalFoodDto

  // 관리자가 볼 심사용 정보
  @ApiProperty({ description: '관리자가 볼 심사용 정보', type: ProductApplicationInfoDto })
  @ValidateNested()
  @Type(() => ProductApplicationInfoDto)
  productApplicationInfo: ProductApplicationInfoDto
  // productApplicationInfo: ProductApplicationInfoDto | ProductApplicationInfo

  // 제품 판매 정보
  @ApiProperty({ description: '제품 판매 정보', type: ProductSaleInfoDto })
  @ValidateNested()
  @Type(() => ProductSaleInfoDto)
  productSaleInfo: ProductSaleInfoDto
  // productSaleInfo: ProductSaleInfoDto | ProductSaleInfo

아래 줄 주석된 부분을 보면 | 연산자를 사용했는데, 이를 제대로 이용하기 위해 @Type() 을 사용한 줄 알았으나,
정확히는 중첩객체(nested objects)의 유효성을 검사하고 싶을 때 사용 하는 것이다.

아래와 같은 간단한 클래스가 있다.
ProductDto 하위에 productSaleInfoDto라는 개체에 ProductSaleInfoDto라는 클래스가 타입으로 명시되어 있다.
이 것을 중첩객체(nested objects)라고 한다.
이경우 단순하게 유효성 검사를 진행하면 제대로 안될 것이다.

class ProductsSaleInfoDto {
  @IsNotEmpty()
  @IsNumber()
  retailPrice: number
  
  @IsNotEmpty()
  @IsNumber()
  currentStock: number
}


class ProductDto {
  @IsNotEmpty
  @IsString()
  productName: string
  
  @ValidateNested({ each: true })
  produdctSaleInfo: ProductSaleInfoDto
}

중첩 Type의 유효성을 검사하려면 단순한 데이터 객체가 아니라 클래스의 인스턴스여야 한다.
@Type() 데코레이터를 사용하면 ValidationPipe에서 plainToClass(이제는 plainToInstance)가 호출될 때 주어진 속성에 대한 클래스를 인스턴스화하도록 class-transformer 모듈에 지시할 수 있다.

ps. 내장 ValidationPipe를 사용하는 경우, transfrom: true 옵션을 설정했는지 확인해야한다.

스택오버플러우 - nest.js controller에서 clas-validator를 사용하여 nested objects의 유효성 검사하느느 방법 문의

TypeScript 환경에서 class-transformer 적극적으로 사용하기

[typescript] class-transformer, Object를 클래스로 클래스를 Object로! [1]

profile
공정 설비 개발/연구원에서 웹 서비스 개발자로 경력 이전하였습니다. Node.js 백엔드 기반 풀스택 개발자를 목표로 하고 있습니다.

0개의 댓글