NestJS Pipe를 이용하여 데이터 변환 및 검증
BE/NestJS2023. 11. 20. 22:43파이프(Pipes)
NestJS에서는 파이프(pipe)를 이용하여 요청의 데이터를 변환(transformation)하거나 검증(validation)을 할 수 있습니다. 파이프도 서비스와 같이 @Injectable() 데코레이터를 사용해서 구현합니다.
- 변환(
Transformation
): 입력 데이터를 원하는 형태로 변환합니다. (예: 문자열을 정수 형태로 변환) - 유효성 검사(
Validation)
: 입력 데이터를 유효성 검사를 하고, 검사를 통과하면 controller로 전달하고 그렇지 않으면 예외를 발생합니다.
파이프는 Controller의 요청(Request)의 arguments에 적용할 수 있고, 파이프를 통해 데이터 변환 및 검증을 하고 Controller가 실행됩니다. 아래 그림을 보면 이해하기 더 쉬운데,
NestJS 사이트에는 아래와 같이 설명을 하는데, 개인적으로 위처럼 설명하는 것이 더 직관적인거 같아 그려봤습니다.
Built-in Pipes
NestJS에서는 자주 사용하는 파이프(Pipes)들을 기본적으로 제공해주고 있습니다.
ValidationPipe
: class-validator와 class-transformer 라이브러리를 함께 사용하여 데이터를 검증 및 변환할 때 사용하는 파이프ParseIntPipe
: 정수형으로 변환해주는 파이프ParseFloatPipe
: 실수형으로 변환해주는 파이프ParseArrayPipe
: 배열로 변환해주는 파이프ParseUUIDPipe
: 올바른 UUID 형태의 값인지 검증하는 파이프ParseEnumPipe
: 올바른 Enum 값인지 검증하는 파이프 (예: new ParseEnumPipe(BoardStatus))DefaultValuePipe
: 값이 없는 경우, default 값을 설정해주는 파이프ParseFilePipe
: 파일을 업로드할때 사용하는 파이프
Pipe 사용하기
파이프는 총 3가지 방법으로 사용할 수 있습니다.
- Handler level pipes
- Parameter level pipes
- Global level pipes
Handler-level pipes
Controller의 핸들러위에 @UsePipes
를 사용하여 pipe를 적용하는 방법이 있습니다. 이해를 돕기 위해 아래 코드를 참고바랍니다.
@Post()
@UsePipes(new ZodValidationPipe(createCatSchema))
async create(@Body() createCatDto: CreateCatDto) {
this.catsService.create(createCatDto);
}
Parameter-level pipes
Controller의 파라미터에 pipe를 적용하는 방법이 있습니다. 이해를 돕기 위해 아래 코드를 참고바랍니다.
@Get(':id')
async findOne(@Param('id', ParseIntPipe) id: number) {
return this.catsService.findOne(id);
}
Global-level pipes
마지막으로 전역으로 파이프를 적용할 수 있는데, application에 useGlobalPipes()
메소드를 사용하여 전역 pipe를 적용할 수 있습니다. 이해를 돕기 위해 아래 코드를 참고바랍니다.
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe());
await app.listen(3000);
}
bootstrap();
NestJS 관련글
'BE > NestJS' 카테고리의 다른 글
typeorm remove()와 delete() 차이 (NestJS) (0) | 2023.11.21 |
---|---|
NestJS + postgres + typeorm 연동하기 (서버 DB 연결) (0) | 2023.11.21 |
NestJS에서 서비스(Service) 개념 및 서비스 생성하기 (0) | 2023.11.19 |
NestJS 컨트롤러(Controller) 개념 및 정의하기 (0) | 2023.11.17 |
NestJS의 모듈(module) 개념 및 module 정의하기 (0) | 2023.11.17 |
IT 기술에 대한 글을 주로 작성하고, 일상 내용, 맛집/숙박/제품 리뷰 등 여러가지 주제를작성하는 블로그입니다. 티스토리 커스텀 스킨도 개발하고 있으니 관심있으신분은 Berry Skin을 검색바랍니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!