-
2023 - 08 - 07 Nest.js TypeORM - Pipe 파이프Today I Learned/TIL 08 2023. 8. 7. 20:53
파이프 (Pipes)
파이프는 @Injectable () 데코레이터로 주석이 달린 클래스이다.
파이프는 data-transformation과 data validation을 위해 사용되며, 컨트롤러 경로 처리기에 의해 처리되는 인수에 대해 작동한다.
다음과 같이 URL 요청이 왔을 때, 먼저 해당 URL에 대한 데이터들을 처리해주는 것이다. 만약 문제가 생기면 통과하지 못하고 Error 처리되며, 통과한다면 데이터를 처리해준 채로 handler에게 가게 된다.
- Data Transformation
입력 데이터를 원하는 형식으로 변환하는 것을 말한다. 가령 문자열에서 정수로 바꾸는 것을 의미한다. - Data Validation
유효성 체크로서, 입력 데이터를 평가하고 유효한 경우 변경되지 않은 상태로 전달된다. 그렇지 않으면 데이터가 올바르지 않을 때 예외를 발생시킨다.
만약 이름의 길이가 10자 이하여야 하는데 10자 이상이 되면 에러를 발생시킨다.
Pipe 사용하는법 (Binding Pipes)
1. Handler-Level Pipes :
route handler 하나에만 @UsePipes(pipe) 데코레이터를 남겨 파이프를 사용한다.
@Post() @UsePipes(pipe) createBoard( @Body() createBoardDto : CreateBoardDto ) : Board { return this.boardService.createBoard(createBoardDto); }
2. Parameter-level Pipes
handler 하나 전체에 작용하는 것이 아니라, 파라미터 하나에만 작용하는 것이 파라미터 레벨 파이프이다. 파라미터 레벨이기 때문에 특정한 파라미터에게만 적용이 된다. 다음과 같이 status라는 파라미터에 @Body('status', pipe)가 적용된 것을 볼 수 있다. 파라미터 레벨로 작동시키고 싶다면 @Body()데코레이터의 두번째 인자로 파이프를 넘겨주면 되는 것이다.@Patch('/:id/status') updateBoardStatus( @Param('id') id : string, @Body('status', pipe) status : BoardStatus ){ return this.boardService.updateBoardStatus(id, status); }
3. Global-level Pipes :
글로벌 파이프로서 어플리케이션 레벨의 파이프이다. 클라이언트에서 들어오는 모든 요청에 적용이 되어, mian.ts의 app에 useGlobalPipes()을 적용시켜주면 된다.
async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalPipes(globalPipe) await app.listen(3000); } bootstrap();
Nestjs의 pipe는 빌트인과, 커스텀이 있는데, 우리가 직접 만드는 파이프가 커스텀 파이프이고 미리 만들어진 것이 빌트인 파이프이다.
- Built-in pipes은 다음과 같다.
- ValidationPipe
- ParseIntPipe
- ParseFloatPipe
- ParseBoolPipe
- ParseArrayPipe
- ParseUUIDPipe
- ParseEnumPipe
- DefaultValuePipe
하나만 보자면, ParseIntPipe를 사용해보면
@Get(':id') findOne(@Param('id', ParseIntPipe) id : number){ return; }
다음의 예제에서 localhost:3000/boards/abc와 같이 id를 abc와 같은 값으로 보내면 파이프에서 먼저 처리하여number 타입이 아니기 때문에 에러를 발생시킨다.
Pipe를 이용한 유효성 체크
게시물을 생성할 때, 파이프를 이용하여 유효성 체크를 해보도록 하자
- 필요한 모듈들이 있다.
class-validator, class-transformer 를 설치해보자
다음의 명령어를 입력해주자
npm install class-validator class-transformer --save
https://github.com/typestack/class-validator
https://github.com/typestack/class-transformer사용법은 해당 docs를 보면 된다.
'Today I Learned > TIL 08' 카테고리의 다른 글
2023 - 08 - 09 nest 미들웨어에서 무한로딩 에러 해결 (0) 2023.08.14 2023- 08- 08 Trello - Nest.js로 만들기 (1) (0) 2023.08.09 2023 - 08 - 06 Nest.js 프로젝트 @module, 데코레이터, 루트모듈, imports, controllers, providers, exports, 의존성 주입 DI, IoC, DI, 제어 역전, 의존성(DI) (0) 2023.08.06 2023- 08 - 05 Nest.js : Express의 단점을 보완, feat. 레이어드 아키텍쳐 (0) 2023.08.05 2023 - 08 - 04 타입스크립트 프로젝트 - 도서관 프로그램 (0) 2023.08.04 - Data Transformation