
1. 문제
NestJs에 PickType이라는 유용한 기능이 있는데, 이는 특정 클래스에서 일정 프로퍼티를 뽑아서 새로운 클래스 타입을 만들 수 있는 기능이다.
하지만 가끔씩 사용하다 보면 몇몇 프로퍼티가 제대로 넘어오지 않을 때가 있다.
다음의 코드를 살펴보자.
export class SampleEntity {
@ApiProperty({
example: 1,
})
id: bigint;
@ApiProperty({
example: "sample_name",
})
name: string;
@ApiProperty({
example: 26,
})
age: number;
}
import { PickType } from '@nestjs/swagger';
import { SampleEntity } from './dto/sample.entity';
export class CreateSampleDto extends PickType(SampleEntity, [
'name',
'age'
] as const) {}
CreateSampleDto은 SampleEntity의 'name'과 'age'를 뽑아서 만든 클래스(타입)이다.
특정 대상에 CreateSampleDto 타입을 적용하면
interface CreateSampleDto {
name: string;
age: number;
}
이 타입을 적용시키는 것과 같다.
PickType에 대한 설명은 여기까지하고, 문제는 이를 이용해 값을 넘겨받을 때 발생했다.
@Controller('sample'){
export class SampleController{
constructor(){}
@Post()
sample(@Body() body: CreateSampleDto){
return 'sample'
}
}
위 코드는 CreateSampleDto 타입의 body값을 넘겨받는 간단한 api이다.
그런데 값을 전달할 때 간혹 특정 컬럼이 아예 넘어오지 않을 때가 있었다.
예를 들어
{
"name": "YuSeokHyun",
"age": 26
}
위와 같이 body값을 전달했을 경우 body값을 콘솔에 찍어보면
{
name: "YuSeokHyun",
}
이렇게 특정 프로퍼티가 사라지고 일부만 남아있는 경우가 발생했다.
하지만 request의 body를 직접 까보면 'name'과 'age'가 모두 존재했고, PickType으로 넘어갈 때 뭔가 문제가 생긴다는 점을 깨달았다.
2. 해결
import { ApiProperty, PickType, PartialType } from '@nestjs/swagger';
import { SampleEntity } from './dto/sample.entity';
export class CreateSampleDto extends PickType(PartialType(SampleEntity), [
'name',
'age'
] as const) {}
PickType의 첫번째 인자를 PartialType으로 감싸주면 해결되었다.
왜 이렇게 해결이 되는지 찾아보았지만 결국 찾지 못했다.
나중에라도 알아내게 된다면 글을 수정해 놓겠다.