Nest.js의 Pipe란?
클라이언트의 요청 데이터를 변환하거나 유효성을 검사하는데 사용되는 중간 처리기이다.
Pipe는 메서드 실행 전에 데이터를 사전 처리하고, 유효성 검사 및 변환 작업을 수행하여 요청의
유효성을 보장하고 일관된 데이터 형식으로 변환할 수 있다.
Pipe의 주요 목적
- 데이터 변환
들어오는 요청 데이터를 원하는 형식으로 변환한다.
예를들어 문자열을 숫자로 변환하거나, 문자열의 공백을 제거하는 등의 작업을 수행할 수 있다. - 데이터 유효성 검사
들어오는 요청 데이터의 유효성을 검사한다.
예를 들어 데이터의 길이, 형식, 범위, 필수 여부 등을 확인하여 올바른 데이터인지 확인할 수 있다. - 예외 처리
유효성 검사를 통과하지 못한 경우 Pipe는 예외를 throw하여 해당 요청을 처리하는 핸들러로 예외를 전달한다.
이를 통해 예외 처리를 중앙에서 관리하고 일관된 방식으로 예외를 처리할 수 있다.
Nest.js에서 Pipe는 빌트인 파이프와 커스텀 파이프의 두 종류가 있다.
빌트인 파이프는 Nest.js에서 기본적으로 제공하는 것이고 커스텀 파이프는 사용자가 정의하는 것이다.
자주 사용되는 빌트인 파이프의 종류는 다음과 같다.
- ValidationPipe
들어오는 요청 데이터의 유효성을 검사하는데 사용되는 Pipe이다.
class-validator와 class-transformer 라이브러리와 함께 사용하여 객체 유효성 검사를 간편하게 처리할 수 있다. - ParsIntPipe
문자열을 숫자로 변환하는 Pipe이다.
들어오는 요청 파라미터나 쿼리 문자열을 숫자로 자동 변환한다. - DefaultValuePipe
들어오는 요청 파라미터나 쿼리에서 값을 가져오지 못한 경우 기본값을 제공하는 Pipe이다. - TransformPipe
요청 데이터를 원하는 형식으로 변환하는 일반적인 목적의 Pipe이다.
사용자 정의 변환 로직을 구현할 수 있다.
Pipe는 @UsePipes() 데코레이터를 통해 컨트롤러나 핸들러에 적용할 수 있다.
예시 코드
@UsePipes(new ValidationPipe())
빌트인 Pipe 적용 코드
게시물 삭제 api이다.
param으로 받은 id를 숫자로 변환해주는 pipe를 적용하였다.
// controller 계층
@Delete('/:id')
deleteBoard(@Param('id', ParseIntPipe) id): Promise<void> {
return this.boardsService.deleteBoard(id);
}
커스텀 Pipe 적용 코드
게시물의 상태를 변경하는 api이다.
게시물의 상태는 private 또는 public으로 설정되어 있는데 해당 api를 통해 body로 변경할 상태 값을 받으면
board-status-validation.pipe.ts에 설정해둔 커스텀 pipe인 BoardStatusValidationPipe를 통해
데이터의 유효성을 검사하고 값을 대문자로 변경해준다.
// controller 계층
@Patch('/:id/status')
updateBoardStatus(
@Param('id', ParseIntPipe) id: number,
@Body('status', BoardStatusValidationPipe) status: BoardStatus
) {
return this.boardsService.updateBoardStatus(id, status);
}
// board-status-validation.pipe.ts file
import { ArgumentMetadata, BadRequestException, PipeTransform } from "@nestjs/common";
import { BoardStatus } from "../board-status.enum";
export class BoardStatusValidationPipe implements PipeTransform {
readonly StatusOptions = [
BoardStatus.PRIVATE,
BoardStatus.PUBLIC
]
transform(value: any){
value = value.toUpperCase();
if(!this.isStatusValid(value)) {
throw new BadRequestException(`${value} 올바른 옵션이 아닙니다.`)
}
return value;
}
private isStatusValid(status: any) {
const index = this.StatusOptions.indexOf(status);
return index !== -1
}
}
'Development > TIL' 카테고리의 다른 글
Typeorm Transaction (0) | 2023.05.29 |
---|---|
NestJS_Configuration (0) | 2023.05.26 |
Nest.js(feat.DTO) (0) | 2023.05.22 |
기획 단계의 소통과 의사 결정에 대하여 (0) | 2023.05.20 |
최종 프로젝트 시작 (0) | 2023.05.20 |