PickType에서 특정 Column이 넘어오지 않을 때

유석현(SeokHyun Yu)·2023년 2월 13일

문제 해결

목록 보기
11/11
post-thumbnail

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) {}

CreateSampleDtoSampleEntity의 '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으로 감싸주면 해결되었다.

왜 이렇게 해결이 되는지 찾아보았지만 결국 찾지 못했다.

나중에라도 알아내게 된다면 글을 수정해 놓겠다.

profile
Backend Engineer

0개의 댓글