dto 와 entity의 유지보수
import { ParseIntPipe } from '@nestjs/common'; import { ApiProperty, PickType } from '@nestjs/swagger'; import { MBTI } from '@root/database/entites/enum/user.enum'; import { IsAlpha, IsAlphanumeric, IsArray, IsDate, IsEmail, IsEnum, IsNotEmpty, IsNumber, IsString, IsUrl, Max, MaxLength, Min, MinLength, } from 'class-validator'; class RequestPostDto { @ApiProperty({ example: 'only youtube URI' }) @IsString() uri: string; @ApiProperty({ example: 'postTitle writed for user' }) @IsString() postTitle: string; @ApiProperty({ example: 'postDescription writed for user' }) @IsString() postDescription?: string; @ApiProperty({ example: 'recent', description: 'recent : 최신순, view : 조회순', required: false, }) order?: string; @ApiProperty({ example: 'DESC', description: 'DESC : 내림차순 ASC : 오름차순', required: false, }) sort?: 'DESC' | 'ASC'; @ApiProperty({ example: 'ENFJ', description: '해당하는 MBTI의 작성자가 작성한 게시물 필터링(아직은 하나만 가능)', required: false, }) MBTI?: string = ''; @ApiProperty({ example: '1', description: 'default: 1', required: false }) page?: number = 1; @ApiProperty({ example: '10', description: 'default: 10', required: false }) limit?: number = 10; @ApiProperty({ example: '', description: '검색 키워드', required: false }) keyword?: string; postIds?: number[]; } export class CreateRequestPostDto extends PickType(RequestPostDto, [ 'postTitle', `uri`, `postDescription`, ] as const) {} export class UpdateRequestPostDto extends PickType(RequestPostDto, [ 'postTitle', `postDescription`, ] as const) {} export class FindPostFilterDto extends PickType(RequestPostDto, [ 'order', `sort`, `MBTI`, `page`, `limit`, `keyword`, `postIds`, ] as const) {}자문 자답입니다만 혹시 도움이 되시는 분이 있을까 답 남겨봅니다. chat gpt와 여러 블로그를 찾아본 결과 Mapped type을 알게 되었습니다.https://docs.nestjs.com/openapi/mapped-types#pick공식문서에도 나와있는 내용이고 활용하여 원하는 대로 클래스를 작성하게 되었습니다.(혹시나 더 좋은 방법이 있을 수도 있는거지만요)위와같이 Mapped type중 PickType을 이용하면 상속을 받으면서 원하는 프로퍼티만 상속을 받을 수 있습니다. 두번 째 인자로 입력하는 배열에는 프로퍼티의 이름을 입력하게 되는데 부모 클래스에 같은 이름의 프로퍼티가 없으면 런타임시 에러가 발생하게 됩니다. 부모 클래스 하나를 바꿔서 다른 자식클래스들에 영향을 주는 것은 실패했지만 에러가 발생하게 되어 쉽게 인지할 수 있게됩니다. Mapped Type을 이용해서 DTO를 관리하는 방식은 확실하지 않지만 일반적인 방법으로 보입니다. (구글에 검색하면 관련 자료가 나오더라구요.)더 좋은 방법을 계속 찾아보겠지만 일단은 지금의 방식을 만족하며 사용하게 될 것 같습니다. 다른 분들께 도움이 되었으면 좋겠네요!