CLI 설치
pnpm install class-validator class-transformer
JavaScript
복사
파이프 등록
src > main.ts
import { ValidationPipe } from '@nestjs/common';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe());
await app.listen(process.env.PORT ?? 3000);
}
bootstrap();
JavaScript
복사
글로벌 파이프라인으로 ValidationPipe를 등록해야된다.
validator 추가
이제 Post요청에서 요청데이터에 title 또는 genre가 비어있으면 에러를 반환 한다.
에러 반환 형태
{
"message": [
"genre should not be empty"
],
"error": "Bad Request",
"statusCode": 400
}
JavaScript
복사
이 에러 형태는 잘 봐둬서, 나중에 처리를 잘하자
정상 요청
이제 정상적으로 title / genre를 입력해야 요청이 처리된다.
자주쓰는 class validator
class validator 깃 허브
•
validation 종류가 정리되어 있는 섹션
여기서 찾아서 공부하면 된다.
Validator 만들기
해당 dto에서 커스텀 validator를 만들어주면 좋을 것 같다
해당 인터페이스는 class-validator 라이브러리에 속해있다.
인터페이스 구현체 구현
클래스에 quick fix action을 호출하면 인터페이스 구현 메뉴가 나온다. 클릭
유효성 로직과 메시지
validate 메소드에는 유효성 검증 로직을
defaultMessage는 실패시 안내 메시지
•
예시 코드
class PasswordValidator implements ValidatorConstraintInterface {
validate(
value: any,
validationArguments?: ValidationArguments,
): Promise<boolean> | boolean {
return value.length > 4 && value.length < 8;
}
defaultMessage?(validationArguments?: ValidationArguments): string {
return '비밀번호의 길이는 4~8자 이어야 합니다.';
}
}
JavaScript
복사
요청 필드 어노테이션 달기
1.
커스텀 validator에 @ValidatorConstraint 등록
2.
검증을 원하는 요청 dto 필드에 커스텀 밸리데이터 사용
3.
로직/반환 형태 확인
다른 방법 ⇒ registorDecorator 함수
함수 생성
function IsPasswordValid(validationOptions?: ValidationOptions) {
return function (object: Object, propertyName: string) {
registerDecorator({
target: object.constructor,
propertyName: propertyName,
options: validationOptions,
constraints: [],
validator: PasswordValidator,
});
};
}
JavaScript
복사
함수 이름을 정하고 registerDecorator를 사용해서 validator에 커스텀밸리데이터를 등록해준다.
요청 dto에 데코레이터 적용
이렇게 다른 데코레이터들 처럼 이름으로 가져와서 사용할 수 있다.
근데 개인적으로는 한 데코레이터들 마다 함수를 다 만들어야 되는거면,
처음 버전의 밸리데이터 방식이 좀 더 괜찮은 것 같다.
•
작동확인
잘 작동한다.
️ ValidatorConstraint는 비동기로도 사용할수있다!
whitelist
main.ts > ValidationPipe에서 적용할 수 있는 옵션으로 whitelist와 forbidNonWhitelisted 을 사용할 수 있다.
main.ts
•
whitelist: true 일 때
애초에 정의한 형태가 아닌 다른 요청 dto필드는 허용하지 않는다.
하지만 에러는 나지 않는다.
•
{ whiteList: true, forbidNonWhitelisted: true } 일 때
정의하지 않은 요청 dto 필드는 허용하지 않고, 그에 대해서 에러를 낼 수 있다.