DTO는 데이터 전송객체 (Data Transfer Object)의 약자로, 클라이언트에서 요청받은 데이터의 값과 타입 등을 체크한다.
개발자가 편하다는 장점도 있지만 올바른 데이터만 받을 수 있도록 하기 때문에 서비스 자체를 안전하게 보호할 수 있다.
Nest.js에서는 이를 쉽게 작성할 수 있도록 DTO를 클래스 형태로 제공하며 라이브러리를 사용하여 데이터 유효성 검사를 지원한다.
먼저 클래스의 유효성을 검증하고 가공하기 위한 라이브러리를 설치해야한다.
yarn add class-validator class-transformer
설치한 이 라이브러리를 파이프(Pipe)라고 하는데 express로 치면 미들웨어와 같은 역할을 한다고 보면 된다.
// main.ts
app.useGlobalPipes(
new ValidationPipe({
whitelist: true,
forbidNonWhitelisted: true,
transform: true,
}),
);
main.ts에 위 코드를 추가하자. 각 옵션에 대한 설명은 아래와 같다.
dto 폴더 안에 create.dto.ts 파일 생성
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[];
}
영화를 생성할 때 받을 데이터 값을 정의한 코드이다.
데코레이터를 사용해 필드 타입을 검사할 수도 있고, 필드의 값을 옵션으로 지정해줄수도 있다.
또 배열 데이터는 each 속성을 true로 하여 각 인덱스마다 타입을 검사할 수 있다.
이렇게 만든 DTO는 컨트롤러에서 아래와 같이 사용한다.
@Post()
create(@Body() data: CreateMovieDto) {
return this.moviesService.create(data);
}
이제 잘못된 값으로 요청을 보내면 에러메세지를 뱉어내는 것을 볼 수 있다.
createDTO에 이어서 updateDTO도 만들어보자
updateDTO는 createDTO와 필드는 같지만 모든 필드가 필수요소는 아니다.
이때 PartialType을 사용해서 부분타입 구현이 가능하다.
먼저 이를 사용할 수 있게 하는 라이브러리를 설치하자
yarn add @nestjs/mapped-types
이제 dto 폴더에 update.dto.ts 파일을 생성하고 다음과 같이 추가하자.
import { PartialType } from '@nestjs/mapped-types';
import { CreateMovieDto } from './create-movie.dto';
export class UpdateMovieDto extends PartialType(CreateMovieDto) {}
때문에 클래스 상속을 통해서 CreateDTO를 상속 받고 PartialType을 통해 부분타입으로 만들어준다.
부분타입은 반드시 베이스타입이 필요하다!