DTO (Data Transfer Object)

Hyein·2023년 11월 7일
0

NestJS 시작하기

목록 보기
4/4
post-thumbnail

DTO란?

DTO는 데이터 전송객체 (Data Transfer Object)의 약자로, 클라이언트에서 요청받은 데이터의 값과 타입 등을 체크한다.
개발자가 편하다는 장점도 있지만 올바른 데이터만 받을 수 있도록 하기 때문에 서비스 자체를 안전하게 보호할 수 있다.

Nest.js에서는 이를 쉽게 작성할 수 있도록 DTO를 클래스 형태로 제공하며 라이브러리를 사용하여 데이터 유효성 검사를 지원한다.

ValidationPipe 설정

먼저 클래스의 유효성을 검증하고 가공하기 위한 라이브러리를 설치해야한다.

yarn add class-validator class-transformer

설치한 이 라이브러리를 파이프(Pipe)라고 하는데 express로 치면 미들웨어와 같은 역할을 한다고 보면 된다.

// main.ts
app.useGlobalPipes(
    new ValidationPipe({
      whitelist: true,
      forbidNonWhitelisted: true,
      transform: true,
    }),
  );

main.ts에 위 코드를 추가하자. 각 옵션에 대한 설명은 아래와 같다.

  • whitelist : DTO에 정의해두지 않은 값은 거른 뒤 에러메세지 출력
  • forbidNonWhitelisted : DTO에 정의해두지 않은 값이 들어오면 에러메세지 출력
  • transform : 파라미터 등을 통해 넘어온 값은 string 타입인데 이를 자유롭게 원하는 타입으로 변환할 수 있도록 해줌

DTO 생성

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을 통해 부분타입으로 만들어준다.

부분타입은 반드시 베이스타입이 필요하다!

0개의 댓글

관련 채용 정보