✔️ TS Decorator 를 사용해서 클래스를 검증한다 (Validate)
✔️ 동기(Synchronous) 비동기 (Asynchronous) 방식 모두를 지원한다.
✔️ Class Validator 자체적으로 제공해주는 Validator 들을 사용 할 수 있다.
✔️ 커스텀 Validator 를 쉽게 만들 수 있다.
✔️ 커스텀 에러 메세지를 반환 할 수 있다.
pnpm i class-validator class-transformer
class User {
@IsNotEmpty()
name: string;
@IsEmail()
email: string;
}
📌
class Validator에서 제공해주는 어떤Validator든 검증하고 싶은 프로퍼티에Decorator로 제공해주면 된다.
const user = new User();
user.name = '';
user.email = 'invalid-email';
validate(user).then(errors => {
// 에러 반환
})
📌
validate() 함수로 객체를 검증했을때 Class Validator에 부합하지 않는 값이 입력됐다면 해당되는 에러가 반환된다.
| Decorator | Description |
|---|---|
| 기본 Validator | |
@IsDefined(value: any) | 값(value)이 null 또는 undefined 이 아니여야 한다. |
@IsOptional() | 만약 값(value) 자체가 정의되지 않았다면, 다른 validator를 실행하지 않는다. |
@Equals(comparison: any) | 값(value)이 comparison 과 동일해야 한다. |
@NotEquals(comparison: any) | 값(value)이 comparison 과 동일하지 않아야 한다. |
@IsEmpty() | 값(value)이 empty('', undefined, null) 이여야 한다. |
@IsNotEmpty() | 값(value)이 empty('', undefined, null)가 아니여야한다. |
@IsIn(values: any[]) | 값(value)이 허용된 값들의 배열(values) 안에 포함되어 있어야 한다. |
@IsNotIn(values: any[]) | 값(value)이 허용되지 않은 값들의 배열(values) 안에 포함되어 있지 않아야 한다. |
| 타입 Validator | |
@IsBoolean() | 값(value)은 boolean 타입이여야 한다. true, false 는 가능하지만 "true", "false" 는 불가능 |
@IsDate() | 값(value)이 Date 객체인지 확인하는 유효성 검사 데코레이터. |
@IsString() | 값(value)이 String 타입인지 확인하는 유효성 검사 데코레이터 |
@IsNumber(options: IsNumberOptions) | 값(value)이 Number 타입인지 확인하는 유효성 검사 데코레이터 |
@IsInt() | 값(value)이 Int(정수) 인지 확인하는 유효성 검사 데코레이터 |
@IsArray() | 값(value)이 Array(배열)타입인지 확인하는 유효성 검사 데코레이터 |
@IsEnum(entity: object) | 값(value)이 지정된 열거형(enum)에 속하는 유효한 값인지 확인하는 데 사용되는 유효성 검사 데코레이터 |
| 숫자 Validator | |
@IsDivisibleBy(num: number) | 값(value)이 지정된 num 으로 나눌수 있는지 확인하는 유효성 검사 데코레이터 |
@IsPositive() | 값(value)이 양수인지 확인하는 유효성 검사 데코레이터 |
@IsNegative() | 값(value)이 음수인지 확인하는 유효성 검사 데코레이터 |
@Min(min: number) | 값(value) 이 주어진 min 보다 큰지 확인하는 유효성 검사 데코레이터 |
@Max(max: number) | 값(value) 이 주어진 max 보다 작은지 확인하는 유효성 검사 데코레이터 |
| 문자 Validator | |
@Contains(seed: string) | 값(value) 에 지정한 seed 가 존재하는지 확인하는 유효성 검사 데코레이터 |
@IsDateString() | 문자열 타입 값(value) 이 ISO8601형식인지 확인하는 유효성 검사 데코레이터 ex) 2024-11-16T22:38:04.000Z |
@NotContains(seed: string) | 값(value) 에 지정한 seed 가 존재하지않는지 확인하는 유효성 검사 데코레이터 |
@IsAlpha() | 값(value)이 알파벳으로 이루어져있는지 확인하는 유효성 검사 데코레이터 |
@IsAlphanumeric() | 값(value) 이 알파벳과 숫자로 이루어져있는지 확인하는 유효성 검사 데코레이터 |
@IsCreditCard() | 크레딧 카드 형식(****-****-****-****) 인지 확인하는 유효성 검사 데코레이터 |
@IsEmail(options?: IsEmailOptions) | 값(value) 이 이메일 형식인지 확인하는 유효성 검사 데코레이터 |
@IsHexColor() | 값(value)이 HexColor 형식(16진)인지 확인하는 유효성 검사 데코레이터 |
@IsISO8601(options?: IsISO8601Options) | @IsDateString 과 동일함 |
@IsLatLong() | 값(value) 의 형식이 위도, 경도 인지 확인하는 유효성 검사 데코레이터 |
@IsUrl(options?: IsURLOptions) | 값(value)의 형식이 URL 형식인지 확인하는 유효성 검사 데코레이터 |
@IsUUID(version?: UUIDVersion) | 값(value)의 형식이 UUID 형식인지 확인하는 유효성 검사 데코레이터 |
@IsUppercase() | 값(value) 의 형식이 대문자인지 확인하는 유효성 검사 데코레이터 |
@Length(min: number, max?: number) | 값(value) 의 길이가 min, max(Optional) 값 사이인지 확인하는 유효성 검사 데코레이터 |
@MinLength(min: number) | 값(value) 의 길이가 지정한 min 보다 큰지 확인하는 유효성 검사 데코레이터 |
@MaxLength(max: number) | 값(value) 의 길이가 지정한 max 보다 작은지 확인하는 유효성 검사 데코레이터 |
💡 제공하는 더 많은 기본 제공 데코레이터는 class-validator
gitHub에서 확인 가능하다.
{
target: Object;
property: string;
value: any;
constraints?: {
[type: string]: string;
};
children?: ValidationError[];
}
target: 검증한 객체
property: 검증 실패한 프로퍼티
value: 검증 실패한 값
constraints: 검증 실패한 제약조건
children: 프로퍼티의 모든 검증 실패 제약조건
class User {
@IsNotEmpty({message: '이름을 입력해주세요!'})
name: string;
@IsEmail({}, {message: '정확한 주소를 입력해주세요!'})
email: string;
}
Decorator의message프로퍼티에 검증 실패했으때의 에러메세지를 입력한다.
@ValidatorConstraint()
class PasswordValidator implements ValidatorConstraintInterface{
validate(value: any, validationArguments?: ValidationArguments): Promise<boolean> | boolean {
// 비밀번호 길이는 4-8
return value.length > 4 && value.length < 8;
}
defaultMessage(validationArguments?: ValidationArguments): string {
return '비밀번호의 길이는 4~8자 여야합니다. 입력된 비밀번호 ($value)' }
}
💡 커스텀 Validator 정의하는 방법
1.ValidatorConstraintInterface의 구현하는class를 생성한다.
2.validate내부에 유효성 검증 로직을 작성하고,defaultMessage에 출력할 메세지를 정의한다.
3. 구현체에@ValidatorConstraint()데코레이터를 붙여준다.
@Validate(PasswordValidator)
test: string;
💡 커스텀
Validator사용하는 방법
1. 검증할 값 위에@Validate(생성한 구현체이름)데코레이터를 붙여준다.
// 입력
{
"test": "23"
}
// 결과
{
"message": [
"비밀번호의 길이는 4~8자 여야합니다. 입력된 비밀번호 (23)"
],
"error": "Bad Request",
"statusCode": 400
}
📌
@Validate데코레이터를 사용하지 않고 정말 나만의 데코레이터 이름을 사용하고 싶다면
아래와 같이 사용할 수 있다.
function IsPasswordValid(validationOptions?: ValidationOptions){
return function(object: Object, propertyName: string){
registerDecorator({
target: object.constructor,
propertyName,
options: validationOptions,
validator: PasswordValidator,
})
}
}
@IsPasswordValid()
test: string;