[NestJS] PartialType 사용시 Swagger 스키마 생성 안되는 현상

2023. 9. 26. 00:48TrubleShooting

 

npx nest generate resource

nest-cli를 이용해서 위의 명령어를 작성하면 CRUD용 코드를 편리하게 생성해주는데 생성DTO와 수정DTO를 보통 따로 작성해주는데 NestJS에서 CreateArticleDto에 대한 body값을 dto로 작성하면 swagger에 스키마가 나오게 되고 

 import { ApiProperty } from '@nestjs/swagger';

 export class CreateArticleDto {
  @ApiProperty()
  title: string;

  @ApiProperty({ required: false })
  description?: string;

  @ApiProperty()
  body: string;

  @ApiProperty({ required: false, default: false }) 
  published?: boolean = false;
 }

자동으로 generate resource로 생성된 update-article.dto.ts가 생성이 되는데 PartialType으로 매핑해서 위의 값을 위임해서 넘어가는데 이상하게 Swagger에서 생성이 안되서 검색해봤더니

 
 import { PartialType } from '@nestjs/mapped-types';
 import { CreateArticleDto } from './create-article.dto';

 
 export class UpdateArticleDto extends PartialType(CreateArticleDto) {}

  이슈  가 nest-cli로 생성시  @nestjs/mapped-types로 자동 import해서 생기는 현상이었다.

 

 
 import { PartialType } from '@nestjs/swagger';
 import { CreateArticleDto } from './create-article.dto';

 
 export class UpdateArticleDto extends PartialType(CreateArticleDto) {}
 

@nestjs/swagger로 수정하면 swagger에 스키마로 생성되고 비지니스 로직도 정상적으로 작동하는 걸 확인할 수 있다:) 

 

+ @nestjs/swagger를 사용하려면 부모 class에 각 필드에 @ApiProperty()로 명시해줘야 한다 PartialType으로 명시하지 않으니 부모의 Dto로 각 필드를 명시적으로 표시해줘야 한다