[NestJS] PartialType을 사용하여 DTO 만들기

Daehyeon Yun·2024년 8월 14일

NestJS 에서 PartialType@nestjs/mapped-types 패키지에서 제공하는 유틸리티 함수로, 전달된 DTO 클래스의 모든 속성을 선택적(optional) 으로 만드는 새로운 클래스를 생성한다.
즉, PartialType 은 기존 DTO의 모든 속성을 선택적 변경시켜 새로운 DTO를 생성하도록 도와준다.

PartialType 을 사용하기 위해선 아래와 같은 라이브러리를 설치해야한다.

$ npm i --save @nestjs/mapped-types

💡 PartialType 사용해보기

만약, 아래와 같이 CreateMoveDTO 가 있다 가정한다.

// CreateMoveDTO.ts
import { IsString, IsNumber } from 'class-validator';

export class CreateMoiveDTO {
  @IsString()
  title: string;

  @IsNumber()
  year: number;

  @IsString({ each: true })
  genres: string[];
}

해당 DTO는 title, year, genres 의 필드를 가진다.

종종 DTO를 생성할 때 존재하는 DTO에서 특정 필드를 제거하거나, 모두 선택적(Optional) 화 하거나, 특정 필드만 선택하여 변경하고 싶은 경우가 많이 있다. 이때 사용되는 라이브러리가 @nestjs/mapped-typesPartialType 이다.

사용법은 아래와 같이 새롭게 만들고자 하는 DTO를 작성하고 PartialType 를 상속받는다.

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

export class UpdateMovieDTO extends PartialType(CreateMoveDTO) {}
PartialType(`Optional`화 시키고 싶은 DTO 클래스)

위와 같이 Optional화 시키고자 하는 클래스를 PartialType 에 사용한다.

PartialType 으로 생성된 UpdateMovieDTO 는 아래와 동등하다.

export class UpdateMovieDTO{
	title?: string;
	year?: number;
	genres?: string[];
}

위 DTO는 아래와 같은 동작 방식을 가진다.

  1. 데이터 생성 요청(Create): 모든 필드(title, year, genres ) 필수로 요청 데이터에 포함되어야 한다.
  2. 데이터 업데이트 요청(Update) : 요청 데이터엔 일부 필드만 포함될 수 있으며 특정 필드만 업데이트할 수 있다. (ex year 필드만 업데이트하려면 { "year": 2024 } 와 같이 보낼 수 있다.

👍 PartialType의 장점!

  1. 코드 재사용성의 증가로 중복된 코드가 작성될 우려 없이 쉽게 DTO를 정의할 수 있다!
  2. 특정 필드를 선택적으로 변경할 수 있어 클라이언트가 특정 데이터를 업데이트할 시 필요한 필드만 제공할 수 있다!
profile
열심히 살아야지

0개의 댓글