NestJS - 5편 (파이프)
파이프 개념
파이프란? 파이프는 클라이언트의 요청이 왔을 때 요청된 객체를 변환할 수 있는 기회를 제공한다.
파이프 사용 목적
파이프는 주로 2가지 목적으로 사용된다.
- 변환: 입력 데이터의 형변환
- 유효성검사: 입력데이터가 내가 정한 기준에 맞는지 검사하고 아닐경우 예외 처리
@nest/common
@nest/common 패키지에는 내장파이프가 들어있다.
- ValidationPipe
- ParseIntPipe
- ParseBoolPipe
- ParseArrayPipe
- ParseUUIDPipe
- DefaultValuePipe
ParseIntPipe, ParseBoolPipe, ParseArrayPipe, ParseUUIDPipe
여기서 ParseIntPipe, ParseBoolPipe, ParseArrayPipe, ParseUUIDPipe는 전달된 인자의 타입을 검사하는 용도이다.컨트롤러
@Get(':id')
findOne(@Param('id', ParseIntPipe) id: number) {
return this.usersService.findOne(id);
}
에러응답
{
"statusCode": 400,
"message": "Validation failed (numeric string is expected)",
"error": "Bad Request"
}
형변환할 코드를 따로 작성 필요 없이 저렇게 쉽게 이용가능하다.
에러시 클래스 전달이 아닌 파이프 객체를 직접 생성해 전달도 가능하다.컨트롤러
@Get(':id')
findOne(@Param('id', new ParseIntPipe({ errorHttpStatusCode: HttpStatus.NOT_ACCEPTABLE })) id: number) {
return this.usersService.findOne(id);
}
에러응답
{
"statusCode": 406,
"message": "Validation failed (numeric string is expected)",
"error": "Not Acceptable"
}
DefaultValuePipe
그럼 DefaultValuePipe
는??
직역시 기본값 파이프인것처럼 기본값을 설정할 때 사용된다.
컨트롤러
@Get()
findAll(
@Query('offset', new DefaultValuePipe(0), ParseIntPipe) offset: number,
@Query('limit', new DefaultValuePipe(10), ParseIntPipe) limit: number,
) {
console.log(offset, limit);
return this.usersService.findAll();
}
class-validator
이렇게 중간에 잘못된 값인지 검사하는 로직을 따로 안넣어도 되서 편리하다. 하지만 우리는 더 편리함을 추구하는 개발자다.
문제점
- 매번 validation 관련 로직을 추가해야한다.
- 만약 요청된 객체도 복잡하고 검증도 복잡하다면??? 코드도 복잡해진다..
이런 문제점들을 해결하는게 class-validator
이다.
여기서는 정말 많은 검증하는 데코레이터들을 제공한다.
https://github.com/typestack/class-validator/blob/develop/README.md#validation-decorators
여기서 지원하는 전체 데코레이터들을 확인할 수 있다.
그럼 이제 사용법을 알아보자.
class-validator 사용법
설치
npm i --save class-validator class-transformer
전역으로 ValidationPipe 추가하기
main.ts
파일import { ValidationPipe } from "@nestjs/common"; import { NestFactory } from "@nestjs/core"; import { AppModule } from "./app.module"; async function bootstrap() { const app = await NestFactory.create(AppModule); await app.listen(3000); app.useGlobalPipes(new ValidationPipe()); } bootstrap(); ```
모듈의 provider에 추가하기
app.module.ts
파일import { ValidationPipe } from "@nestjs/common"; import { APP_PIPE } from "@nestjs/core"; ... @Module({ providers: [ { provide: APP_PIPE, useClass: ValidationPipe, }, ], })
DTO에 class-validator 추가해서 검증하기
DTO
파일import { IsString } from 'class-validator'; export class CreateProductDTO { @IsString() name: string; @IsString() description: string; @IsString() price: string; }
이런식으로 추가해서 사용하면된다. 컨트롤러에 따로 설정할 필요도 없다. 편안~~!!!
참조 : NestJS로 배우는 백엔드 프로그래밍
'[NestJS]' 카테고리의 다른 글
[NestJS] - 7편 (미들웨어) (0) | 2022.04.21 |
---|---|
[NestJS] - 6편 (DB연결하기 TypeORM 트랜잭션 마이그레이션) (0) | 2022.04.21 |
[NestJS] - 4편 (모듈~config파일) (0) | 2022.04.20 |
[NestJS] - 3편 (프로바이더) (0) | 2022.04.19 |
[NestJS] - 2편 (설치~인터페이스) (0) | 2022.04.18 |