https://github.com/typestack/class-validator?tab=readme-ov-file#usage

ValidationPipe 를 사용하기전에 아래 명령어를 이용하여  필요한 라이브러리를 설치한다.

$ npm i --save class-validator class-transformer

 

위의 라이브러리에서 데코레이터 @IsString() 과 같은 것을 호출하여 검증을 하게된다.

 

https://docs.nestjs.com/pipes

위 그림을 보면 ValidationPipe 는 Controller 에게 요청을 할 때만 작동을 하게되는 구조로 보인다.

그러므로 서비스 단에서 엔티티를 생성할 때 작성해둔 데코레이터가 해당 역할을 안하게 되는 것 같다.

 

엔티티를 생성할 때 검증을 하는 방법

방법 1 검증하기 위한 private 함수 생성

import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
import { IsInt, Max, Min, validate } from 'class-validator';

@Entity()
export class TestEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @IsInt()
  @Min(0)
  @Max(10)
  @Column()
  rating: number;

  constructor(rating: number) {
    this.validate(rating);
    this.rating = rating;
  }
  
  private validate(rating: number){
    if (typeof rating !== 'number'){
      throw new Error();
    }
    if (rating < 0 || rating > 10){
      throw new Error();
    }
  }
}

 

 

방법 2  validate 라는 함수를 이용

import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
import { IsInt, Max, Min, validate } from 'class-validator';

@Entity()
export class TestEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @IsInt()
  @Min(0)
  @Max(10)
  @Column()
  rating: number;

  constructor(rating: number) {
    this.rating = rating;

    validate(this).then((errors) => {
      // errors is an array of validation errors
      if (errors.length > 0) {
        console.log('validation failed. errors: ', errors);
      } else {
        console.log('validation succeed');
      }
    });
  }
}

 

 

방법 3 validateOrReject 를 이용

import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
import { IsInt, Max, Min, validate, validateOrReject } from 'class-validator';

@Entity()
export class TestEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @IsInt()
  @Min(0)
  @Max(10)
  @Column()
  rating: number;

  constructor(rating: number) {
    this.rating = rating;

    validateOrReject(this).catch((errors) => {
      console.log('Promise rejected (validation failed). Errors: ', errors);
    });
  }
}

/* 에러 발생시 출력 예시

Promise rejected (validation failed). Errors:  [
  ValidationError {
    target: TestEntity { rating: 15 },
    value: 15,
    property: 'rating',
    children: [],
    constraints: { max: 'rating must not be greater than 10' }
  }
]

*/

 

참고자료

https://github.com/typestack/class-validator?tab=readme-ov-file#usage

https://docs.nestjs.com/techniques/validation

 

 

+ Recent posts