태그
#NESTJS
#NEST
#PIPS
[NestJS] 7. Pipes
2023년 11월 30일 11:13

! 읽기 전
이 시리즈에 있는 모든 글은 블로그 지향 기반 개발 & 공식 문서 기반으로 작성되었습니다 내용은 정확하지 않을 수도 있으며, 100% 신뢰하지 마시길 바랍니다
1. 파이프란?
- 파이프는
@Injectable()
데코레이터로 주석이 달린 클래스입니다. 파이프는PipeTransform
인터페이스를 구현해야 합니다. - 일반적인 사용 사례
- transformation: 입력 데이터를 원하는 출력으로 변환
- validation: 입력 데이터를 평가하고 유효하다면 변경없이 그대로 전달. 그렇지 않으면 데이터가 정확하지 않을 때 예외를 던짐
- 두 경우 모두 파이프는 컨트롤러 경로 처리기에 의해 처리되는
인수
에서 작동 - NestJs에서는 기본적으로 즉시 사용할 수 있는 pipe가 있음
- VaildationPipe
- ParseIntPipe
- ParseUUIDPipe
2. ValidationPipe
import { PipeTransform, Injectable, ArgumentMetadata } from '@nestjs/common';
@Injectable()
export class ValidationPipe implements PipeTransform {
transform(value: any, metadata: ArgumentMetadata) {
return value;
}
}
- 처음에는 단순히 입력 값을 가져 와서 동일 기능으로 동작하는 같은 값을 즉시 반환
- 모든 파이프는
transform()
메소드를 제공해야함 - Validation Pipe는 값을 변경하지 않고 반환하거나 예외를 발생
- 매개 변수 : value, metadata
type | 인수가 body @Body(), query @Query(), param @Param() 또는 사용자 정의 매개 변수인지 여부를 나타냅니다 . |
---|---|
metatype | 인수의 메타 타입 (예: String)을 제공합니다. 참고: 라우트 핸들러 메소드 서명에서 유형 선언을 생략하거나 바닐라 JavaScript를 사용하는 경우 값은 undefined입니다. |
data | 문자열이 데코레이터에 전달되었습니다 (예: @Body('string')). 데코레이터 괄호를 비워두면 정의되지 않습니다(undefined). |
적용(controller.ts)
@Post()
@UsePipes(new ValidationPipe({ transform: true }))
async create(@Body() createCatDto: CreateCatDto) {
this.catsService.create(createCatDto);
}
3. ParseIntPipe
- 문자열을 정수 값으로 구문 분석하는 파이프
@Injectable()
export class ParseIntPipe implements PipeTransform<string, number> {
transform(value: string, metadata: ArgumentMetadata): number {
const val = parseInt(value, 10);
if (isNaN(val)) {
throw new BadRequestException('Validation failed');
}
return val;
}
}
사용 방법 (service.ts)
async findOne(@Param('id', new ParseIntPipe()) id) {
return await this.catsService.findOne(id);
}
4. ParseUUIDPipe
- 문자열을 구문 분석하고 UUID인지 확인하는 파이프
@Get(':id')
async findOne(@Param('id', new ParseUUIDPipe()) id) {
return await this.catsService.findOne(id);
}
5. pipe 관련 lib
- Joi (validation)
- class-validator, class-transformer