Joi는 데이터 검증(validation) 라이브러리로, NestJS에서 @hapi/joi 또는 joi 패키지를 통해 사용됩니다.

NestJS에서 Joi는 DTO(Data Transfer Object)나 스키마 기반 검증을 위해 사용되며, 유연한 스키마 정의와 강력한 검증 기능을 제공합니다.

이를 통해 개발자는 서버로 들어오는 요청 데이터를 사전에 검증하여 오류를 방지할 수 있습니다.

NestJS에서 Joi는 데코레이터 방식인 class-validator와 달리, 객체 스키마 정의를 통해 요청 데이터를 검증합니다.

유효성 검사 규칙을 명시적으로 정의하고, 다양한 타입과 조건을 설정할 수 있는 것이 특징입니다.

Joi의 특성

  • 유연한 스키마 정의: 다양한 데이터 타입, 조건, 구조를 스키마로 정의할 수 있습니다.

  • 체이닝 방식: 메서드를 체이닝하여 복잡한 검증 규칙을 쉽게 작성할 수 있습니다.

  • 커스터마이징 가능: 에러 메시지나 검증 규칙을 세부적으로 설정할 수 있습니다.

  • 확장성: 커스텀 검증 규칙을 추가하여 유연하게 사용할 수 있습니다.

NestJS에서 Joi 사용

1.Joi 모듈 설치

npm install @hapi/joi

2.Joi를 사용한 DTO 검증

NestJS에서 Joi를 사용하기 위해서는 ValidationPipe와 함께 사용하거나, config 설정을 위해 직접 검증할 수 있습니다.

// import Joi from @hapi/joi
import * as Joi from '@hapi/joi';

export const createUserSchema = Joi.object({
  username: Joi.string().alphanum().min(3).max(30).required(),
  password: Joi.string().pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')).required(),
  email: Joi.string().email().required(),
  age: Joi.number().integer().min(0).max(100),
  isActive: Joi.boolean(),
});

3.NestJS에서 Joi를 통한 검증 설정

NestJS에서 Joi 검증을 ValidationPipe와 함께 사용할 수 있습니다.

import { Controller, Post, Body } from '@nestjs/common';
import { JoiValidationPipe } from './joi-validation.pipe'; // 커스텀 Validation Pipe
import { createUserSchema } from './create-user.schema';

@Controller('users')
export class UsersController {
  @Post('create')
  createUser(@Body(new JoiValidationPipe(createUserSchema)) body) {
    return body; // 데이터가 검증된 후 해당 데이터를 반환
  }
}

4.JoiValidationPipe 정의

NestJS에서는 ValidationPipe를 커스터마이징하여 Joi 검증을 처리할 수 있습니다.

import { PipeTransform, Injectable, BadRequestException } from '@nestjs/common';
import { ObjectSchema } from '@hapi/joi';

@Injectable()
export class JoiValidationPipe implements PipeTransform {
  constructor(private schema: ObjectSchema) {}

  transform(value: any) {
    const { error } = this.schema.validate(value);
    if (error) {
      throw new BadRequestException('Validation failed');
    }
    return value;
  }
}

Joi 검증 예시

1.단순한 문자열 및 패턴 검증

const schema = Joi.object({
  username: Joi.string().min(3).max(30).required(),
  password: Joi.string().pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')),
});

2.숫자와 Boolean 타입 검증

const schema = Joi.object({
  age: Joi.number().integer().min(0).max(100),
  isActive: Joi.boolean(),
});

3.이메일 및 커스텀 에러 메시지

const schema = Joi.object({
  email: Joi.string().email().required().messages({
    'string.email': '올바른 이메일 형식이 아닙니다.',
  }),
});

Joi의 주요 메서드

  • .string(): 문자열 검증
  • .number(): 숫자 타입 검증
  • .boolean(): 불리언 타입 검증
  • .array(): 배열 검증
  • .object(): 객체 검증
  • .required(): 필수 값 지정
  • .pattern(): 정규 표현식 사용
  • .min(), .max(): 최소, 최대값 설정

Joi는 NestJS와 함께 강력한 데이터 검증 기능을 제공하며, 다양한 상황에서 쉽게 활용 하는법을
배웠습니다.

profile
꾸준히, 의미있는 사이드 프로젝트 경험과 문제해결 과정을 기록하기 위한 공간입니다.

0개의 댓글