TypeScript - class-validator 사용법

doohyunlm·2022년 9월 29일
1

TypeScript

목록 보기
1/2
post-thumbnail

목차

  1. class-validator란?
  2. class-validator 사용법
  3. 웹 프레임워크에 적용하기
  4. 자주 사용하는 검증 옵션
  5. 마치며
  • 코딩을 하다보면 유효성 검사를 해야 하는 경우를 쉽게 마주할 수 있습니다.

  • 보내준 데이터가 제대로 온 것인지 검증해야되는 과정을 거쳐야 합니다.

  • Typescript를 사용하고 있으면 class-validator를 통해 편리하게 검증할 수 있습니다.


1. class-validator란?


  • class-validatorjoi의 Typescript 버전으로, 데코레이터를 이용하여 편리하게 검증할 수 있는 라이브러리입니다.

  • 서버로 들어오는 Json 데이터의 검증을 할 때 유용하게 사용할 수 있습니다.



2. class-validator의 사용법


2-1. 기본 사용법


  • 기본적으로 검증하고픈 파라미터 위에 데코레이터를 사용하면 검증을 할 수 있습니다.
@IsString()
search_text : string;

2-2. 자주 사용하는 데코레이터

@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() 최댓값

2-3. 적용 위치

  • 적용 위치는 라우터나 클래스에 도달하기전 JSON body를 변환한 후 검증이 이뤄지기에 미리 검증을 해볼 수 있습니다.

3. 웹 프레임워크에 적용하기


  • 웹 프레임워크에도 손쉽게 적용할 수 있습니다.

3-1. NestJS

  • Nest에서는 기본적으로 제공하는 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 // 프로덕트 단계에서 세부 에러 비활성
    }),
  );

App 모듈의 Provider로 등록하기

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,
      }),
    },
  ],
})

resolver에서 적용

  • 아래 처럼 설정해논 Input에 적용 시켜 놓으면 값이 올바르게 들어오지 않을 시 에러를 표출하게 만들 수 있습니다.
  async createAccount(
    @Args('input') createAccountInput: CreateAccountInput,
  ): Promise<CreateAccountOutput> {
    return this.userService.createAccount(createAccountInput);
  }

3-2. express

  • express의 경우 미들웨어로 등록하여 사용합니다.

미들웨어로 등록하기

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) => {
  //
}

4. 자주 사용하는 검증 옵션

  • 자주 사용하는 검증 옵션은 총 5가지가 있습니다.

skipMissingProperties

  • class-validator는 @IsOpional이 붙어 있지 않은 검증 데코레이터의 경우 입력 값에 존재 하지 않으면 오류를 표출 합니다.

  • skipMissingProperties는 그러한 경우 에러를 나지 않게 해주는 옵션이지만 되도록이면 @IsOptional 데코레이터로 관리하는 편이 보안상 용이합니다.


forbidUnknownValues

  • 검증 규칙이 정의되어 있지 않은 클래스의 인스턴스나 오브젝트의 검증시 오류가 나게 만드는 옵션입니다.

  • 이 옵션은 기본적으로 true로 설정하여 사용합니다.


whitelist

  • 검증 시 검증 규칙이 정의되어 있지 않은 입력 값들을 모두 제거해주는 옵션입니다.

  • 이것도 되도록이면 true로 두고 사용합니다.


forbidNonWhitelisted

  • 검증 시 검증 규칙이 정의되어 있지 않은 입력 값들이 들어오면 에러를 표출합니다.

  • 기본적으로 true로 설정하여 사용합니다.


disableErrorMessages

  • 상세 에러 메시지를 비활성화하는 옵션입니다.

  • 주로 서비스 단계에서 자세한 오류 메시지를 보여주면 안되기 때문에 개발계에서는 false로 사용하고 서비스 단계에서는 true로 설정하여 사용합니다.

  • 더 많은 옵션을 보려면 여기를 클릭하세요.


5. 마치며


  • 많이 사용하는 class-validator에 대해 작성해보았습니다.

  • 틀린 부분이 있을 시 알려주시면 감사하겠습니다.

profile
백엔드 개발자

0개의 댓글