안녕하세요 @realmankwon입니다.
DTO 를 사용할 때 mapped-types 모듈을 사용하면 DTO 의 재사용성을 높일 수 있습니다.
아래와 같이 필요한 모듈을 먼저 설치합니다.
npm i @nestjs/mapped-types
mapped-types에서 사용할 수 있는 기능은 다음과 같습니다.
- PartialType
- PickType
- OmitType
- IntersectionType
- Composition
이것의 사용법을 위해 CreateMovieDto를 이용하여 UpdateMovieDto를 만들어 보도록 하겠습니다.
import { IsNumber, IsOptional, IsString } from 'class-validator';
export class CreateMovieDto {
@IsString()
readonly title: string;
@IsNumber()
readonly year: number;
@IsOptional()
@IsString({ each: true })
readonly genres: string[];
}
1 . PartialType
- 모든 필드값을 선택사항으로 변경하여 재사용합니다.
export class UpdateMovieDto extends PartialType(CreateMovieDto) {}
- 만약 부모의 타입과 생성하는 타입이 다르다면 두번째 파라미터에 생성하는 타입을 입력해 주면 됩니다.
export class UpdateMovieDto extends PartialType(CreateMovieDto, InputType) {}
2 . PickType
- 필요한 필드값을 지정하여 재사용합니다.
export class UpdateMovieDto extends PickType(CreateMovieDto, ['title'] as const) {}
3 . OmitType
- 불필요한 필드값을 제거하고 재사용합니다.
export class UpdateMovieDto extends OmitType(CreateMovieDto, ['title'] as const) {}
4 . IntersectionType
- 두개의 DTO를 하나로 합쳐서 재사용합니다.
export class AdditionMovieDto {
@IsString()
readonly director: string;
}
export class UpdateMovieDto extends IntersectionType(CreateMovieDto, AdditionMovieDto) {}
5 . Composition
- 위의 4개와는 다르게 별도의 Type이 있는 것이 아니라 2개의 타입을 사용하여 필요로 하는 형태로 만들어 재사용하는 것입니다.
- 예를들어 모든 필드를 선택사항으로 변경한 후에 필요한 필드값을 지정하여 재사용할 경우 PartialType을 먼저 선언하고 내부에 PickType을 선언하는 방식으로 사용하면 됩니다.
export class UpdateMovieDto extends PartialType( PickType(CreateMovieDto, ['title'] as const), ) {}