Nest.js - Dto

크롱·2024년 10월 10일
0

Nest.js

목록 보기
1/15

Dto

DATA TRANSFER OBJ

우리가 nest 에서 dto 만들때 class-validator 을 사용한다
npm i class-validator@0.14.1 class-transformer@0.5.1
더 정확한 info -> github.com/typestack/class-validator

ValidationPipe()


Dto class 를 만든 후 이를 적용시키기 위해선

@Post()
  public createUser(@Body(new ValidationPipe()) createUserDto: CreateUserDto) {
    ...///
  }

new 키워드와 함께 써준다.
하지만 이렇게쓰면 모든 함수마다 new ValidationPipe() 쓰게 되니 중복된 코드가 많을것이다.
글로벌하게 써보쟈


main.ts 에서 app.useGlobalPipes(new ValidationPipe()) 코드 추가
하면

@Post()
  public createUser(@Body() createUserDto: CreateUserDto) {
    console.log(createUserDto, 'createUserDto');
    return 'createUser post 요청 성공';
  }

이제 @Body() 안에 아무것도 안넣어도 자동으로 연동된다.

에러 처리

dto에 없는 프로퍼티가 post 되는것을 방지하고싶을때 whitelist와 forbidNonWhiteListed를 true 로 해주자





https://velog.io/@wngud4950/NestJS-Validation-Pipe-%EC%A0%81%EC%9A%A9%EA%B8%B0
를 읽어보니 더 이해가 잘된다


Param 에 dto 적용

@Type

보통 get 요청시 param이 문자열로 받아지는데, 만약 숫자로 바로 변환하고싶으면 class-transformer에서 Type을 import 해서 위 처럼 사용한다.



Mapped Types

Dto를 extends를 이용해 더 효율적으로 쓰자!


export class CreateUserDto {
  @IsNotEmpty()
  @IsString()
  @MinLength(3)
  @MaxLength(96)
  firstName: string;

  @IsString()
  @IsOptional()
  @MinLength(3)
  @MaxLength(96)
  lastName?: string;

  @IsNotEmpty()
  @IsString()
  @IsEmail()
  email: string;

  @IsNotEmpty()
  @IsString()
  @MinLength(8)
  @Matches(
    /^(?=.*[a-zA-Z])(?=.*\d)(?=.*[!@#$%^&*()_+={}\[\]:;"'<>,.?~`-]).+$/,
    {
      message:
        'Minimum 8 characters at least one number, one letter and one special character',
    },
  )
  password: string;
}

기존에 이러한 dto 클래스가 있는데, patch 메소드에서 저 프로퍼티들이 필요하다면 ?
다시 똑같은 코드를 쓰기보다, PartialType 을 이용해보자

import { CreateUserDto } from './createUser.dto';
import { PartialType } from '@nestjs/mapped-types';

export class PatchUserDto extends PartialType(CreateUserDto) {
  // CreateUserDto의 모든 프로퍼티들이 optional 로 된다
  // validation 모두 상속됨
}
profile
👩‍💻안녕하세요🌞

0개의 댓글