- class-validator란?
- class-validator 사용법
- 웹 프레임워크에 적용하기
- 자주 사용하는 검증 옵션
- 마치며
코딩을 하다보면 유효성 검사를 해야 하는 경우를 쉽게 마주할 수 있습니다.
보내준 데이터가 제대로 온 것인지 검증해야되는 과정을 거쳐야 합니다.
Typescript를 사용하고 있으면 class-validator를 통해 편리하게 검증할 수 있습니다.
class-validator
란 joi
의 Typescript 버전으로, 데코레이터를 이용하여 편리하게 검증할 수 있는 라이브러리입니다.
서버로 들어오는 Json 데이터의 검증을 할 때 유용하게 사용할 수 있습니다.
@IsString()
search_text : string;
@IsString() 문자열인지 검증
@IsInt() Int값인지에 대한 검증
@IsBoolean() Boolean값인지에 대한 검증
@IsEmail() 이메일 형식인지에 대한 검증
@IsArray() 배열 값인지에 대한 검증
@IsEnum() Enum값인지에 대한 검증
@IsNumber() 숫자값인지에 대한 검증(소숫점도 검증 가능)
@IsDate() 날짜값인지에 대한 검증
@IsBase64() Base64 값인지에 대한 검증(토큰 처리를 Base64로 했을시 사용)
@IsOptional() 값이 들어오지 않으면 검증을 안해도 된다는 데코레이터
@MaxLength() 최대 길이 제한
@MinLength() 최소 길이 제한
@Length() 길이 제한
@Matches(RegExp('^[가-힣a-zA-Z0-9]*$'), {message : "입력 값을 다시 확인하세요"}) 정규표현식 입력 값을 검증할 떄 사용
@Min() 최솟값
@Max() 최댓값
ValidationPipe
를 이용하여 간단하게 등록할 수 있습니다.import { ..., ValidationPipe } from '@nestjs/common';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
// app 인스턴스 생성 시 Global pipe로 등록
app.useGlobalPipes(
new ValidationPipe()
);
}
bootstrap();
app.useGlobalPipes(
new ValidationPipe({
disableErrorMessages: true // 프로덕트 단계에서 세부 에러 비활성
}),
);
import { ..., ValidationPipe } from '@nestjs/common';
import { APP_PIPE } from '@nestjs/core';
// App 모듈에서 provider로 등록
@Module({
providers: [
{
provide: APP_PIPE,
useClass: ValidationPipe,
},
],
})
export class AppModule {}
@Module({
providers: [
{
provide: APP_PIPE,
useValue: new ValidationPipe({
disableErrorMessages: true,
}),
},
],
})
async createAccount(
@Args('input') createAccountInput: CreateAccountInput,
): Promise<CreateAccountOutput> {
return this.userService.createAccount(createAccountInput);
}
import { validateOrReject } from 'class-validator';
import { plainToClass } from 'class-transformer';
export function validateBody(schema: { new (): any }) {
return async function (req: Request, res: Response, next: NextFunction) {
const target = plainToClass(schema, req.body);
try {
await validateOrReject(target);
next();
} catch (error) {
next(error);
}
};
}
app.get("/search/history",
validateBody(CreateUserDto),
async (req, res) => {
//
}
class-validator는 @IsOpional
이 붙어 있지 않은 검증 데코레이터의 경우 입력 값에 존재 하지 않으면 오류를 표출 합니다.
skipMissingProperties
는 그러한 경우 에러를 나지 않게 해주는 옵션이지만 되도록이면 @IsOptional
데코레이터로 관리하는 편이 보안상 용이합니다.
검증 규칙이 정의되어 있지 않은 클래스의 인스턴스나 오브젝트의 검증시 오류가 나게 만드는 옵션입니다.
이 옵션은 기본적으로 true로 설정하여 사용합니다.
검증 시 검증 규칙이 정의되어 있지 않은 입력 값들을 모두 제거해주는 옵션입니다.
이것도 되도록이면 true로 두고 사용합니다.
검증 시 검증 규칙이 정의되어 있지 않은 입력 값들이 들어오면 에러를 표출합니다.
기본적으로 true로 설정하여 사용합니다.
상세 에러 메시지를 비활성화하는 옵션입니다.
주로 서비스 단계에서 자세한 오류 메시지를 보여주면 안되기 때문에 개발계에서는 false로 사용하고 서비스 단계에서는 true로 설정하여 사용합니다.
더 많은 옵션을 보려면 여기를 클릭하세요.
많이 사용하는 class-validator에 대해 작성해보았습니다.
틀린 부분이 있을 시 알려주시면 감사하겠습니다.