본문 바로가기

Web Dev/Javascript

Nest.js 데코레이션으로 DTO (Data Transfer Object) 유효성 구성하는 방법

반응형

DTO 가 필요한 이유 ? 

DTO(Data Transfer Object)는 계층 간 데이터 전송을 위한 객체로 사용되는 디자인 패턴입니다. DTO는 주로 애플리케이션의 서로 다른 계층 간에 데이터를 전달하는 데 사용됩니다.

DTO를 사용하는 주된 이유는 다음과 같습니다:

1. 데이터 캡슐화: DTO는 한 계층에서 다른 계층으로 전달되는 데이터를 캡슐화합니다. 이를 통해 불필요한 데이터 노출을 방지하고 계층 간의 결합도를 낮출 수 있습니다.

2. 데이터 유효성 검사: DTO는 전달되는 데이터의 유효성을 검사하는 데 사용될 수 있습니다. 유효성 검사 규칙을 DTO에 정의하여 잘못된 데이터가 전달되는 것을 방지할 수 있습니다.

3. 네트워크 전송 최적화: DTO는 네트워크를 통해 전송되는 데이터의 크기를 최적화하는 데 도움이 됩니다. 필요한 데이터만 포함하여 전송량을 줄일 수 있습니다.

4. 코드 가독성 및 유지보수성 향상: DTO를 사용하면 코드의 가독성과 유지보수성이 향상됩니다. 명확한 데이터 구조를 정의하고 전달되는 데이터의 의도를 명확히 표현할 수 있습니다.

예를 들어, 웹 애플리케이션에서 클라이언트(프론트엔드)와 서버(백엔드) 간에 데이터를 전송할 때 DTO를 사용할 수 있습니다. 클라이언트에서 서버로 데이터를 전송할 때는 요청 DTO를 사용하고, 서버에서 클라이언트로 데이터를 전송할 때는 응답 DTO를 사용합니다.

DTO는 애플리케이션의 계층 간 경계를 명확히 정의하고 데이터 전송을 체계화하는 데 도움이 됩니다. 이를 통해 코드의 구조와 유지보수성을 향상시킬 수 있습니다.

따라서 DTO 파일은 애플리케이션의 서로 다른 계층 간에 전달되는 데이터 구조를 정의하고 관리하는 데 필요한 중요한 역할을 합니다.

데이터 유효성 검사

해당 부분을 Nest.js 에서는 데코레이터 를 통해 쉽게 할 수 있습니다.

$ npm i class-validator class-transformer

설치해 줍니다. 

DTO 파일을 열어줍니다. 


export class CreateMovieDto {

  readonly title: string;

  readonly year: number;

  readonly genres: string[];
}

 

간단한 데코레이터를 추가해줍니다.

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

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

  @IsNumber()
  readonly year: number;

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

물론 Controller 에서 

CreateMovieDto 형을 사용해야합니다. 

 @Post()
  create(@Body() movieData: CreateMovieDto) {
    return this.moviesService.create(movieData);
  }

main.ts 

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationPipe } from '@nestjs/common';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  //유효성 검사 파이프
  app.useGlobalPipes(new ValidationPipe());
  await app.listen(3000);
}
bootstrap();

유효성 검사 파이프 코드를 추가해줍니다 .

API 테스트를 해줍니다. 

이와 같은 결과를 확인할 수 있습니다. 

app.useGlobalPipes(
    new ValidationPipe({
      whitelist: true,
      forbidNonWhitelisted: true,
    }),
  );

해당 코드에 기능을 추가할 수 있습니다. 

whitelist: true: 화이트리스트 기능을 활성화합니다.

 화이트리스트란 DTO에 명시되지 않은 속성을 자동으로 제거하는 것을 의미합니다. 예를 들어, 요청 데이터에 DTO에 정의되지 않은 속성이 포함되어 있다면 해당 속성은 제거됩니다.


forbidNonWhitelisted: true: 화이트리스트에 없는 속성이 요청 데이터에 포함되어 있을 경우 유효성 검사를 실패시키고 예외를 발생시킵니다. 

이 옵션을 사용하면 DTO에 명시되지 않은 속성이 요청 데이터에 포함되는 것을 엄격하게 제한할 수 있습니다.

ValidationPipe()  좋은 기능이 하나 더 있다. 

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

transform  : true, 

url 에서 가져오는 값은 다 string 인데 Dto or entirty  가 number를 원하는 경우가 있다. 

이럴 경우 알아서 자연스럽게 바꿔준다. 

 

반응형