![[NestJs] 파이프와 DTO](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FyTHAj%2FbtsKhcuT7Eh%2FAAAAAAAAAAAAAAAAAAAAAOJOTfXdklGxGhToWd8dGZF0UmcWd6ZkRdMiAEv_iToG%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3D42kPMBvo4MH3aNTte3r7nt%252FZnhc%253D)
파이프
파이프는 요청 객체가 컨트롤러 핸들러로 전달되기 전에 데이터 변환, 유효성 검사를 하는데 사용된다.
공식 문서에 보면 여러가지 파이프가 있으며,
바인딩 파이프 예시를 보면 @Param 데코레이터와 함께 int형식이 맞는지 확인하는데 쓰고있다.
zod 라이브러리를 사용 할 수도 있지만, 클래스 검증을 이용한 방법이 깔끔한것 같아서 해당 방법으로 유효성을 검증했다.
DTO (Data Transfer Object)
데이터 간 전송을 목적으로 활용되는 객체다.
Dto 클래스를 만들어서 파이프를 통해 유효성을 검증할 수 있다.
일단 2가지 라이브러리가 필요하다.
npm i class-validator class-transformer
class-transformer는 전달된 요청 객체를 dto 타입스크립트 객체로 변환해주는 역할을 하고,
class-validator는 클래스의 유효성 검사를 책임진다.
import { IsEmail, IsString } from 'class-validator';
export class createUserDto {
@IsEmail()
email: string;
@IsString()
password: string;
test(){
console.log(`my email is ${this.email}`);
}
}
dto 클래스를 만들어 주었다.
class-validator를 임포트하면 데코레이터를 통해 변수를 검증할 수 있다.
email은 @IsEmail 데코레이터, password는 @IsString 데코레이터를 적어주었다.
파이프를 통한 유효성 검증
@Post('create')
createUser(@Body() body: createUserDto) {
return this.userService.createUser(body);
}
createUser(body: createUserDto) {
return body;
}
전에 만들었던 컨트롤러와 서비스 createUser 함수의 body 에 타입을 넣어주었다.
dto 클래스를 만들고, 데코레이터를 추가하고, 함수 인자값에 타입까지 넣어주었다면 마지막으로는 파이프 세팅을 해주어야 한다.
main.ts
import { AppModule } from './app.module';
import { ValidationPipe } from '@nestjs/common';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(
new ValidationPipe({
whitelist: true,
transform: true
})
);
await app.listen(3000);
}
bootstrap();
main.ts로 가서 app.useGlobalPipes 라는 함수를 호출해주었다.
ValidationPipe 클래스의 객체를 생성하고 안에 옵션을 넣어주었다.
이메일을 이상하게 넣었더니 바로 이메일이 아니라고 검증을 해준다.
whitelist 옵션은 dto에 적어둔 속성만 들어오도록 처리한다.
bug를 같이 보냈는데도 리턴할땐 보이지 않는다.
createUser(body: createUserDto) {
body.test();
return body;
}
transform 옵션을 확인하기위해 서비스의 createuser함수에 body.test 함수를 호출했다.
transform 옵션은 그냥 객체가 아닌 타입스크립트 객체로 변환시켜주는 옵션이다.
transform 옵션을 끄고 post 요청을 보냈더니 오류가 날아왔다.
다시 transform 옵션을 켰더니 함수가 잘 실행되고 201 응답이 도착했다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!