Nestjs::nomad::2.4~

YP J·2023년 2월 13일
0

Nestjs

목록 보기
3/6

DTOs and Validation #1

  • DTO : 데이터 전송 객체(Data Transfer Object)
  • DTO를 쓰는 이유가 뭐냐?
    • 우선 프로그래머로서 코드를 간결하게 마들수있게해준다
      • 예를들어 POST로 우리가 정하지 않은 key값이 들어오면 그냥 저장된다. ex) "hacked" : "me haha" // 이걸 막아준다? ? NO!
      • DTO를 이용해서 pipe(데이터 지나는 통로 , 지날때 유효성 검사) 로 유효성 검사 한다.
import { ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
  app.useGlobalPipes(new ValidationPipe())
}
bootstrap();
  • main.ts 에 이렇게 파이프 추가 후
  • npm install class-validator class-transformer 로 설치해준다

계속 app.useGlobalPipes() 함수가 동작 안 했는데 알고보니

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

app.listen() 함수 후에 적용하고 있었다..

  • new ValidationPipe() 에는 유용한 옵션들이 많은데 그중 하나가
  • whilelist :
    • true 이면 decorator없는 어떠한 property 의 object를 거른다. ?? (그 요소만 거르고 나머지는 요청이 가서 저장된다.)
    • "hacked" : "by me" 는 우리 Validator에 도달하지 않는다
  • forbidNonWhiteListed:
    • 이상한걸 보내면 request자체를 막는것.(당연히 POST 안됨)
{
	"statusCode": 400,
	"message": [
		"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"
}
  • forbid~ 안쓰면 결과 값 이런데 쓰면
{
	"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"
}
  • 이렇게 나온다.

  • transform :

    • 유저가 보낸 데이터를 우리가 설정한 movie안의 데이터 형식에 맞게 타입변환 해준다
    • 그래서 string 으로 들어온걸 +id, parseInt(id) 같이 int로 변환 해줄 필요가 없어진다.
    • controller, service 파일의 id:string 을 다 nest가 우리가 설정해놓은 id:number로 변환해준다
    • 그래서 id:number로 다 바꿔주면 잘 돌아간다.

DTOs and Validation #2

  • 똑같이 dto 폴더안에 create-movie.dto.ts
import { IsString, IsNumber} from 'class-validator'

export class CreateUpdateDto{
    @IsString()
    readonly title?: string;
    
    @IsNumber()
    readonly year?: number;
    
    @IsString({each:true})
    readonly genres?: string[];
}
  • title만 수정하거나, year만 수정하고싶기때문에 ? 붙여준다.

  • 즉, 모든게 필수 사항이 아니다 라는것.

  • 근데! 이렇게 하는대신 Partial types(부분 타입) 방법을 쓸거다.

  • npm install @nestjs/mapped-types 로 필요한거 설치

export class UpdateMovieDto extends PartialType(CreateMoveDto) { 
}
  • PartialType은 base type 이 필요하다 그게 CreateMovieDto

  • 이렇게 하면 UpdateMovieDto는 기본적으로 CreateMovieDto 와 같다

  • 전부 필수사항이란것만 빼면.

    class-validator
    https://github.com/typestack/class-validator

  • NestJS를 쓸때 Typescript 의 보안도 이용할 수있고, 유효성 검사도 우리가 따로 하지 않아도 된다.

읽어볼글
https://choseongho93.tistory.com/318

profile
be pro

0개의 댓글