[nestjs] Mapped types

여리·2024년 6월 19일
0

nestjs 에서는 typescript의 강타입을 활용해서 DTO(입력 유효성 검사)를 사용하는 경우 이를 유연하게 사용할 수 있도록 지원해주고 있다.

공식문서 링크: https://docs.nestjs.com/openapi/mapped-types

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 이다.

우선 각 타입을 활용하기 위한 DTO 세팅먼저 진행

export class CreateCatDto {
  name: string;

  age: number;

  breed: string;
}

export class AdditionalCatInfo {
  color: string;
}

🚀 partial type

  • CreateCatDto의 있는 속성들(properties)을 선택적으로 사용할 수 있도록 해준다.
export class UpdateCatPatialDto extends PartialType(CreateCatDto) {}

인 경우, updateCatPatialDto의 속성은

export class UpdateCatPatialDto {
  name?: string;
  age?: number;
  breed?: string;
}

🚀 Pick type

  • CreateCatDto의 있는 속성들(properties)을 특정 속성만 사용할 수 있도록 해준다.
export class UpdateCatPickDto extends PickType(CreateCatDto, ['age'] as const) {}

인 경우, UpdateCatPickDto 속성은

export class UpdateCatPickDto {
  age: number;
}

🚀 Omit type

  • CreateCatDto의 있는 속성들(properties)을 특정 속성만 제외하고 사용할 수 있도록 해준다.
export class UpdateCatOmitDto extends OmitType(CreateCatDto, ['name'] as const) {}

인 경우, UpdateCatOmitDto 속성은

export class UpdateCatOmitDto {
  age: number;
  breed: string;
}

🚀 Intersection type

  • 두개의 Dto 속성들을 결합시켜 사용할 수 있도록 해준다.
export class UpdateCatInterSectionDto extends IntersectionType(
  CreateCatDto,
  AdditionalCatInfo,
) {}

인 경우, UpdateCatInterSectionDto 속성은

export class UpdateCatInterSectionDto {
  name: string;
  age: number;
  breed: string;
  color: string;
}

🚀 Composition

위의 4가지 타입을 유틸리티적으로 구성하여 확장해서 사용할 수도 있다.

export class UpdateCatDto extends PartialType(
  OmitType(CreateCatDto, ['name'] as const),
) {}

인 경우,

export class UpdateCatDto {
  age?: number;
  breed?: string;
}

이렇게 정리할 수 있다.

위와같은 방법으로 확장성이 있고 기존의 DTO를 통해 속성을 효율적으로 사용할 수 있는 방법들로 개발해 나가면 좋겠구나라고 생각했다.

지금 하는 프로젝트들도 이렇게 수행해 나가고있다.

profile
beckend developer

0개의 댓글