nestjs 에서는 typescript의 강타입을 활용해서 DTO(입력 유효성 검사)를 사용하는 경우 이를 유연하게 사용할 수 있도록 지원해주고 있다.
Mapped type의 사용 모듈은 두가지 패키지가 있다
@nestjs/mapped-types: 작성일 기준시점으로 nestjs에서 내장하고 있는 모듈
@nestjs/swagger: 스웨거에서 지원하고 있는 모듈
사용해보면서 확인한 결과 nestjs에서 스웨거를 사용할때는 @nestjs/swagger에서 자동으로 @nestjs/mapped-types 모듈을 활용하여 지원하게 된다.
만약
import { ApiProperty, IntersectionType, PickType, PartialType } from '@nestjs/swagger'
로 되어 있다면 @nestjs/mapped-types를 활용해서 사용중이라는것이다.
Mapped-type의 종류는 4가지
로 구분되고 nestjs 공식문서에서는 해당 내용에 대해서 활용하는 방법을 5가지
에 대해서 안내해주고 있다.
type종류 4가진는
Partial
,Pick
,Omit
,Intersection
이다.
export class CreateCatDto {
name: string;
age: number;
breed: string;
}
export class AdditionalCatInfo {
color: string;
}
export class UpdateCatPatialDto extends PartialType(CreateCatDto) {}
인 경우, updateCatPatialDto의 속성은
export class UpdateCatPatialDto {
name?: string;
age?: number;
breed?: string;
}
특정 속성만
사용할 수 있도록 해준다.export class UpdateCatPickDto extends PickType(CreateCatDto, ['age'] as const) {}
인 경우, UpdateCatPickDto 속성은
export class UpdateCatPickDto {
age: number;
}
특정 속성만 제외하고
사용할 수 있도록 해준다.export class UpdateCatOmitDto extends OmitType(CreateCatDto, ['name'] as const) {}
인 경우, UpdateCatOmitDto 속성은
export class UpdateCatOmitDto {
age: number;
breed: string;
}
export class UpdateCatInterSectionDto extends IntersectionType(
CreateCatDto,
AdditionalCatInfo,
) {}
인 경우, UpdateCatInterSectionDto 속성은
export class UpdateCatInterSectionDto {
name: string;
age: number;
breed: string;
color: string;
}
위의 4가지 타입을 유틸리티적으로 구성하여 확장해서 사용할 수도 있다.
export class UpdateCatDto extends PartialType(
OmitType(CreateCatDto, ['name'] as const),
) {}
인 경우,
export class UpdateCatDto {
age?: number;
breed?: string;
}
이렇게 정리할 수 있다.
위와같은 방법으로 확장성이 있고 기존의 DTO를 통해 속성을 효율적으로 사용할 수 있는 방법들로 개발해 나가면 좋겠구나라고 생각했다.
지금 하는 프로젝트들도 이렇게 수행해 나가고있다.