Joi는 데이터 검증(validation) 라이브러리로, NestJS에서 @hapi/joi 또는 joi 패키지를 통해 사용됩니다.
NestJS에서 Joi는 DTO(Data Transfer Object)나 스키마 기반 검증을 위해 사용되며, 유연한 스키마 정의와 강력한 검증 기능을 제공합니다.
이를 통해 개발자는 서버로 들어오는 요청 데이터를 사전에 검증하여 오류를 방지할 수 있습니다.
NestJS에서 Joi는 데코레이터 방식인 class-validator와 달리, 객체 스키마 정의를 통해 요청 데이터를 검증합니다.
유효성 검사 규칙을 명시적으로 정의하고, 다양한 타입과 조건을 설정할 수 있는 것이 특징입니다.
유연한 스키마 정의: 다양한 데이터 타입, 조건, 구조를 스키마로 정의할 수 있습니다.
체이닝 방식: 메서드를 체이닝하여 복잡한 검증 규칙을 쉽게 작성할 수 있습니다.
커스터마이징 가능: 에러 메시지나 검증 규칙을 세부적으로 설정할 수 있습니다.
확장성: 커스텀 검증 규칙을 추가하여 유연하게 사용할 수 있습니다.
npm install @hapi/joi
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(),
});
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; // 데이터가 검증된 후 해당 데이터를 반환
}
}
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;
}
}
const schema = Joi.object({
username: Joi.string().min(3).max(30).required(),
password: Joi.string().pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')),
});
const schema = Joi.object({
age: Joi.number().integer().min(0).max(100),
isActive: Joi.boolean(),
});
const schema = Joi.object({
email: Joi.string().email().required().messages({
'string.email': '올바른 이메일 형식이 아닙니다.',
}),
});
Joi는 NestJS와 함께 강력한 데이터 검증 기능을 제공하며, 다양한 상황에서 쉽게 활용 하는법을
배웠습니다.