본 게시글에서는 Nest.js에서 사용되는 ValidationPipe와 class-validator의 관계와 동작 원리에 대해 살펴보고, 두 기술을 함께 사용하는 예제를 통해 이해를 돕겠습니다.
ValidationPipe는 Nest.js의 유효성 검사 기능을 도와주는 파이프입니다. ValidationPipe는 데이터의 유효성 검사를 실행하며, 매개 변수 데코레이터(@Body()
또는 @Param()
등)를 사용하여 컨트롤러에 전달하는 데이터의 유효성을 검사합니다.
class-validator는 객체의 유효성을 검사하기 위한 데코레이터를 제공하는 라이브러리입니다. 특히 Nest.js에서는 DTO(Data Transfer Object) 클래스의 유효성 검사를 수행하는 데 활용됩니다. class-validator의 데코레이터를 사용하여 검사 규칙을 선언적으로 작성할 수 있습니다.
ValidationPipe는 내부적으로 class-validator를 사용하여 데이터의 유효성 검사를 수행합니다. 즉, class-validator의 데코레이터를 사용하여 DTO의 속성에 검증 규칙을 지정하면, ValidationPipe는 해당 규칙을 적용하여 전달되는 데이터의 유효성을 검사합니다.
예를 들어, 사용자로부터 영화 정보를 받아 저장하는 API를 구현한다고 가정하겠습니다.
먼저, create-movie.dto.ts
파일에 다음과 같이 CreateMovieDto
클래스를 작성합니다.
import { IsNumber, IsString } from "class-validator";
export class CreateMovieDto {
@IsString()
readonly title: string;
@IsNumber()
readonly year: number;
@IsString({ each: true })
readonly genres: string[];
}
이 클래스는 사용자로부터 전달받은 영화 정보를 표현하며, 각 필드에는 유효성 검사를 위한 데코레이터가 적용되어 있습니다.
다음으로 movies.controller.ts 파일에 새로운 영화를 추가하는 엔드포인트를 작성합니다.
import { Body, Controller, Post } from "@nestjs/common";
import { CreateMovieDto } from "./dto/create-movie.dto";
@Controller("movies")
export class MoviesController {
@Post()
create(@Body() movieData: CreateMovieDto) {
// 영화 추가 로직 작성
}
}
여기서 @Body()
데코레이터가 사용된 movieData
매개변수의 타입으로 CreateMovieDto
를 지정하였습니다.
마지막으로 main.ts 파일에서 ValidationPipe를 전역 파이프로 등록합니다.
import { ValidationPipe } from "@nestjs/common";
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe());
await app.listen(3000);
}
이렇게 설정하면, 사용자로부터 전달받은 데이터가 ValidationPipe를 통해 자동으로 유효성 검사가 실행됩니다. 검사 과정에서 CreateMovieDto에 적용된 데코레이터를 사용하여 각 필드의 값이 규칙에 맞는지 확인하고, 에러가 발생하면 적절한 에러 메시지를 반환합니다.
이 포스트에서는 ValidationPipe와 class-validator의 관계와 작동 원리에 대해 살펴보았습니다. Nest.js에서는 이 두 기술을 함께 사용하여 간편하게 데이터의 유효성 검사를 수행할 수 있습니다. 이를 통해 안전하고 명확한 코드를 작성할 수 있으며, 더욱 견고한 애플리케이션을 만들 수 있습니다.
아주 유용한 정보네요!