요청 본문을 DTO 계약과 전역 검증 Pipe로 보호합니다.
DTO class에 class-validator 규칙을 선언하고 ValidationPipe를 적용하면 Controller 전에 형식 오류를 400으로 거절할 수 있습니다.
whitelist는 선언되지 않은 속성을 제거하고 forbidNonWhitelisted는 예상 밖 필드를 오류로 처리합니다.
검증을 통과해도 현재 사용자 권한, 중복, 재고 같은 업무 규칙은 Service에서 다시 확인합니다.
DTO 타입 표기만으로 런타임 JSON이 검증되지는 않습니다.
로컬 프로젝트에서 확인해보세요description 선택 필드와 최대 길이 규칙을 추가하세요.
import "reflect-metadata";
import { Body, Controller, Get, Module, Post, ValidationPipe } from "@nestjs/common";
import { NestFactory } from "@nestjs/core";
import { IsString, Length } from "class-validator";
class CreateCourseDto {
@IsString() @Length(2, 50) title!: string;
}
@Controller("courses")
class CourseController {
@Post() create(@Body() dto: CreateCourseDto) {
return { id: 1, title: dto.title };
}
}
@Controller()
class HomeController {
@Get() home() {
return { hint: "POST /courses with JSON { title }", validation: "2~50자" };
}
}
@Module({ controllers: [HomeController, CourseController] })
class AppModule {}
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(
new ValidationPipe({ whitelist: true, forbidNonWhitelisted: true, transform: true }),
);
await app.listen(4173, "0.0.0.0");
}
bootstrap();