서버 코드 중에 아래와 같은 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, Object를 클래스로 클래스를 Object로! [1]