https://github.com/typestack/class-validator?tab=readme-ov-file#usage
ValidationPipe 를 사용하기전에 아래 명령어를 이용하여 필요한 라이브러리를 설치한다.
$ npm i --save class-validator class-transformer
위의 라이브러리에서 데코레이터 @IsString() 과 같은 것을 호출하여 검증을 하게된다.
위 그림을 보면 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
'프로그래밍 > Nest.js' 카테고리의 다른 글
[ Nest.js ] Middleware, Guard, Interceptor, Pipe, Filter (0) | 2024.07.20 |
---|---|
[ Nest.js ] Lock 을 이용한 데이터 중복 저장 방지 구현 (0) | 2024.07.18 |
[ Nest.js ] [ TypeORM ] bulk insert (0) | 2024.07.06 |
[ Nest.js ] cross-validation 을 이용하여 데코레이션 만들기 (0) | 2024.07.03 |
[ Nest.js ] 테스트 코드 작성 FIRST 원칙 (0) | 2024.06.30 |