[NestJS] Mapped types의 Partial 사용 방법

Mapped types

CRUD(Create/Read/Update/Delete)와 같은 기능을 구축할 때 기본 엔터티 클래스를 기능에 맞게 변형하는 것이 필요한 경우가 많습니다. Nest는 이 작업을 보다 편리하게 만들기 위해 클래스 변환을 수행하는 여러 유틸리티 기능을 제공합니다.

Partial

input validation types(DTO라고도 함)을 빌드할 때 동일한 클래스에 대한 createupdate 클래스로 변형하는 것이 필요한 경우가 많습니다. 예를 들어, create 에는 모든 필드가 필요할 수 있지만 update는 모든 필드를 선택 사항으로 만들 수 있습니다. Nest는 이 작업을 더 쉽게 만들고 보일러플레이트(Boilerplate) 코드를 최소화하기 위해 PartialType() 유틸리티 함수를 제공합니다. PartialType() 함수는 입력 클래스의 모든 속성이 선택 사항으로 설정된 클래스를 반환합니다.

설치

Mapped types 설치를 통해 PartialType을 가져올 수 있습니다.

1
npm i @nestjs/mapped-types

사용 예시

이전 글 [NestJS] ValidationPipe 사용 방법 에서 생성한 사용자 등록 DTO 클래스를 이용합니다. 사용자 등록 DTO 클래스의 필드들은 모두 필수 항목입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
// create-user.dto.ts
import { IsString, IsNumber } from 'class-validator';

export class CreateUserDto {
@IsString()
readonly name: string;

@IsNumber()
readonly age: number;

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

사용자 등록 DTO 클래스와 동일한 필드를 가지지만 각 필드가 선택 사항인 사용자 수정 DTO 클래스를 생성하려면 PartialType() 함수를 상속받고 사용자 등록 DTO 클래스인 CreateUserDto를 인수로 전달합니다.

1
2
3
4
5
// update-user.dto.ts
import { PartialType } from '@nestjs/mapped-types';
import { CreateUserDto } from './create-user.dto';

export class UpdateUserDto extends PartialType(CreateUserDto) {}

사용자 수정 요청을 받기 위해 컨트롤러 클래스를 생성합니다. update 함수의 파라미터에 생성한 DTO 클래스를 타입으로 지정합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import { Body, Controller, Patch } from '@nestjs/common';
import { UpdateUserDto } from './dto/update-user.dto';

@Controller('users')
export class UserController {
constructor() {}

/**
* 사용자 수정
* @param userData
* @returns
*/
@Patch()
update(@Body() userData: UpdateUserDto) {
return '사용자 수정 성공';
}
}

사용자 수정 요청을 해보겠습니다. Postman 또는 Insomnia 툴을 이용합니다.
http://localhost:3000/student/ 주소를 PATCH 방식으로 요청합니다.

1
2
3
4
// 클라이언트 측에서 전송한 데이터가 다음과 같을 경우
{
"height": 180
}
1
2
// 서버에서 응답
사용자 수정 성공

사용자 등록과 달리 모든 필드가 선택 사항으로 설정되어 있어 요청할 때 속성들을 입력하지 않아도 잘 동작하는 것을 확인할 수 있습니다.

참고

Share