컨트롤러에서 가져오는 입력 정보, 예를 들어 회원가입 시의 정보들을 어떻게 검증할 수 있을까?
문자열이 비어있다던가, 전화번호나 이메일이 형식이 맞지 않는다던지 하는 검증 말이다.
물론 컨트롤러에서 @Body 로 가져온 데아터를 일일히 검증할수도 있겠지만, 너무 불편하다.
이미 만들어진 라이브러리를 통해 자동으로 검증하도록 해보자.
라이브러리 설치
npm install class-validator
npm install class-transformer
validator는 클래스의 정보를 검증할 수 있고, transformer는 @Body에 들어온 정보를 DTO로 변환해준다.
사용법
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(
new ValidationPipe(
{
whitelist: true,
}
));
await app.listen(process.env.PORT ?? 3000);
}
bootstrap();
부트스트랩 함수에서 app.userGloablPipes를 추가해주자.
whitelist는 DTO에 정의되어있는 필드 외에 다른 인자가 들어오면 이를 무시할 수 있게 해주는 플래그이다.
회원가입을 위한 api가 하나 있다고 가정하자. 그러면 받아올만한 정보는 이메일, 패스워드 정도일 것이다.
/* create-user.dto.ts */
export class CreateUserDto {
@IsEmail()
email: string;
@IsString()
password: string;
}
- @IsEmail : 이 필드의 형식이 이메일 형식을 따르는지 확인한다. 예를 들어 example@email.com과 같은 형식을 따르는지 확인하는것이다
- IsString : 이 필드에 문자열 외의 다른 인자가 들어오는지 확인한다. 비어있는 문자열도 안되고, 숫자도 안된다.
이외의 다른 검증 데코레이터는 공식 문서나 검색을 통해 알아보자
/* users.controller.ts */
@Controller('auth')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Post('/signup')
createUser(@Body() body: CreateUserDto) {
console.log(body)
}
}
이후에 컨트롤러에서 @Body에 타입만 위의 Dto로 명시해주면? 알아서 받은 body이자를 Dto로 바꿔주고, 검증을 수행한다.
이후에 json으로 여기다 정보를 날려보면?
/* send to [POST]/auth/signup */
{
"email":"hi@example.com",
"password":"hello"
}

이렇게 잘 받아오는 것을 확인할 수 있다.
'NestJS' 카테고리의 다른 글
| AWS bedrock 사용기 (5) | 2025.08.05 |
|---|---|
| 반환 정보 편집하기 (1) | 2025.06.15 |
| TypeORM 간단 사용법 (0) | 2025.06.15 |
| 제어 역전 / 의존성 주입 (0) | 2025.06.14 |
| 컨트롤러 라우팅 / 요청 인자 받기 (0) | 2025.06.14 |