Nest DTO 설정 방법

2022. 4. 20. 10:45Nest.js

DTO : 계층간 데이터 교환을 위한 객체

DTO객체로 만들어서 Vaildation과 타이핑 검사를 진행하고 데이터가 들어오면 중간에서 검증을 진행한다.

 

[ Client => (DTO) Controller => (DTO) Service => (DTO) DB ]에 맞게 전달 한다.

 

사용방법

 

1. 설치 

npm i --save class-validator class-transformer

 

2. 설정

main.ts 에서 DTO의 Validator를 사용하기 위해 app.useGlobalPipes(new ValidationPipe())를 넣어준다

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

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(new ValidationPipe());
  await app.listen(process.env.PORT);
}

bootstrap();

 

3. DTO 생성

ex) users.dto.ts 파일 생성

class-validator에서 사용하려는 vaildation를 import한다.

 

import { IsNotEmpty, IsString } from 'class-validator';
export class FindUserIdDto {
  @IsNotEmpty()
  @IsString()
  hp: string;
}
export class FindUserCheckDto {
  @IsNotEmpty()
  @IsString()
  id: string;

  @IsNotEmpty()
  @IsString()
  hp: string;
}
export class PasswordChangeDto {
  @IsNotEmpty()
  @IsString()
  id: string;

  @IsNotEmpty()
  @IsString()
  pwd: string;
}

사용 방법 : 

한 개의  vaildate를  사용 할 경우

@vaildate함수명

변수 명

으로 사용이 가능하다.

 

여러 개 vaildate를  사용 할 경우

@vaildate함수명

@vaildate함수명

@vaildate함수명

변수 명

으로 붙여서 사용 할 수 있다.

 

DTO 클래스를 여러개 만든이유는

 하나의 DTO 클래스가 필요한게 아니니 다른 request가 오는 데이터에 맞춰 Class를 만들어 준다. 

 

@IsNotEmpty : 해당 변수는 null 이거나 undifined가 되면 안된다.

@IsString : 해당변수는 String이다.

 

class - vaildation 목록 https://www.npmjs.com/package/class-validator

 

4. 만든 DTO 사용

 

간단하게 타입을 넣는곳에 만들어준 DTO클래스를 넣어주면된다.

 

4-1. Controller

//user.cotroller.ts 

import { UsersService } from './users.service';
import { Controller, Post, Put, Get, Param, Body } from '@nestjs/common';
import {
  FindUserIdDto,
  FindUserCheckDto,
  PasswordChangeDto,
} from './users.dto';

@Controller('users')
export class UsersController {
  constructor(private readonly userService: UsersService) {}

  // 핸드폰 번호로 아이디 찾기
  @Get(':hp')
  async findUserId(@Param() param: FindUserIdDto) {
    console.log(param);
    return await this.userService.findUserId(param);
  }
  // 핸드폰번호, 아이디로 유저 존재  확인
  @Post('check')
  async findUserCheck(@Body() body: FindUserCheckDto) {
    return await this.userService.findUserCheck(body);
  }
  //비밀번호 변경
  @Put('password')
  async passwordChange(@Body() body: PasswordChangeDto) {
    return await this.userService.passwordChange(body);
  }
}

4-2. Service

//user.service.ts

import { Injectable } from '@nestjs/common';
import {
  FindUserIdDto,
  FindUserCheckDto,
  PasswordChangeDto,
} from './users.dto';

@Injectable()
export class UsersService {
  async findUserId(param: FindUserIdDto) {
    const { hp } = param;
    return hp + '유저 아이디 찾기';
  }
  async findUserCheck(body: FindUserCheckDto) {
    const { hp, id } = body;
    return {
      hp,
      id,
      ex: '변경 존재 아이디 확인',
    };
  }
  async passwordChange(body: PasswordChangeDto) {
    try {
      const { id, pwd } = body;
      return {
        id,
        pwd,
        ex: '비밀번호 변경',
      };
    } catch (error) {
      console.log(error);
    }
  }
}

 

728x90
반응형