[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🛠 기타/WEB

Nest.js - DTO(Data Transfer Object)

inu 2021. 1. 6. 18:07
반응형

DTO(Data Transfer Object, 데이터 전송 객체)

  • 네트워크를 통해 데이터가 어떻게 전송될지 정의하는 객체

  • DTO 스키마를 클래스를 통해 쉽게 정의할 수 있다.

create-movie.dto.ts

export class CreateMovieDto {
  readonly title: string;
  readonly year: number;
  readonly genres: string[];
}
  • class-validator와 class-transformer를 설치하고 이를 기반으로 파이프를 만들어 이를 통해 객체의 유효성을 체크할 수 있다. (파이프는 일종의 미들웨어라고 생각하자.)
npm i class-validator class-transformer
  • 위 명령어로 class-validator와 class-transformer를 설치할 수 있다.
create-movie.dto.ts

import { IsNumber, IsString } from 'class-validator';

export class CreateMovieDto {
  @IsString()
  readonly title: string;

  @IsNumber()
  readonly year: number;

  @IsString({ each: true })
  readonly genres: string[];
}
  • create-movie.dto.ts에서 dto에 형식을 체크할 수 있는 @IsString, @IsNumber 데코레이터를 추가해준다.
main.ts

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(
    new ValidationPipe({
      whitelist: true,
      forbidNonWhitelisted: true,
      transform: true,
    }),
  );
  await app.listen(3000);
}
bootstrap();
  • main.ts 파일에 위와 같이 app.useGrobalPipes를 추가하고, 여기에 ValidationPipe를 넣어 체크한다.

  • main.ts에 파이프를 설치하지 않으면 dto파일에 타입체크 데코레이터를 추가해도 걸러지지 않는다.

  • whitelist : 아무 데코레이터도 없는 속성을 가진 obeject는 거를 수 있음

  • forbidNonWhitelisted : 유효하지 않는 데이터의 request 자체를 막을 수 있음

  • transfor : 가능한 경우 실제 데이터 타입으로 변환하여 처리해줌

{
    "statusCode": 400,
    "message": [
        "property hacked should not exist",
        "title must be a string",
        "year must be a number conforming to the specified constraints",
        "each value in genres must be a string"
    ],
    "error": "Bad Request"
}
  • 유효하지 않은 데이터를 넣으면 위와같이 처리된다.

PartialType

npm i @nestjs/mapped-types
  • mapped-types 모듈에 존재하는 PartialType을 사용하면 다른 객체의 타입을 그대로 이용할 수 있다.
import { PartialType } from "@nestjs/mapped-types";
import { CreateMovieDto } from "./create-movie.dto";

export class UpdateMovieDto extends PartialType(CreateMovieDto) { }
  • 이렇게 구성할 경우 CreateMovieDto의 속성을 가져와서 UpdateMovieDto를 구성한다.
  • CreateMovieDto의 속성들이 이용되지만, 필수는 아니다.
반응형