api를 요청할 때 서버에서 해당 값이 유효한지에 대한 검증이 필요하다. 예를 들어 요청 body에 특정값이 없다던가 형식이 맞지 않거나 등등의 이유로 요청이 들어오면 거부를 해야한다.
nest.js에서는 기본 내장으로 validation을 제공한다.
없다면
npm install class-validator를 이용하여 설치하면 된다.
main.ts의 파일을 열어서 수정한다.
global로 설정하여 모든 api에 대해서 validation을 적용한다.
import { NestFactory } from '@nestjs/core';
import { ValidationPipe } from '@nestjs/common';
import { MessagesModule } from './messages/messages.module';
async function bootstrap() {
const app = await NestFactory.create(MessagesModule);
app.useGlobalPipes(
new ValidationPipe()
)
await app.listen(3000);
}
bootstrap();
ValidationPipe를 import 해주고 app하단에 app.useGlobalPipe()함수를 사용하여 준다.
이후 내부에 new ValidationPipe()함수를 사용하면 세팅 끝이다.
우선 src/messages(모듈명) 폴더에 하위 경로로 dtos라는 폴더를 만든다.
dto는 data transfer object의 약자로 api간 데이터 전송 객체를 말한다.
// src/messages/dtos/create-messages.dto.ts
import { IsString } from "class-validator"
export class CreateMessagesDto{
@IsString()
content: string
}
기존 타입스크립트와 비슷하게 작성한다.
우선 export 해줄 class를 생성하고 내부에 검증될 값들의 타입을 명시해준다.
이후 class-validation에서 IsString 데코레이터를 import 해주고 export 해줄 class에서 사용한다.
이러면 dto 설정을 끝이다.
이제 controllers로 돌아가서 설정해준다.
import { CreateMessagesDto } from './dtos/create-messages.dto';
@Post()
createMessages(@Body() body: CreateMessagesDto){
console.log(body)
}
말은 안되는 거 같지만 위의 코드와 같이 사용해준다. 기존 body의 타입을 any에서 CreateMessagesDto를 이용해 검증해준다.

api에 정상적인 데이터가 들어올 경우 위와 같이 해당 내용을 출력하고

content에 string이 아닌 넘버가 들어올 경우 에러를 반환하게 된다.
우선 validation을 사용하기 위해서 class-transformer와 class-validator가 있다.
처음에 api에서 json data가 들어오게 되면 class-transformer가 상황에 맞게 변형 해준다(DTO 클래스의 인스턴스로 변형)
이후 class-validator가 @IsString과 같은 데코레이터로 해당 값들을 검증하는 방법이다.
https://github.com/typestack/class-transformer
https://github.com/typestack/class-validator