[NestJs] - Pipe

김영훈·2025년 4월 6일

NestJS

목록 보기
6/9

NestJS 의 기본적인 요청 라이프사이클


Pipe 란?

파이프는 Controller 에 제공되는 argument 들에 적용된다.
이 argument 에는 @Body, @Param 등 이미 우리가 사용하고 있는 입력 @Annotation 들이 모두 포함된다.

Pipe 는 argument 데이터를 가공 후 , Controller 에 값들을 넘겨준다.

transformation : 데이터를 원하는 형태로 변형한다. (예: string 에서 number로 변환)
validation: 입력된 값이 정상적인 값인지 확인한다. 아니라면 에러를 던진다.

Global Pipe

기본제공되는 ValidationPipe 또한 GlobalPipe 의 일종이다.

async function bootStrap(){
	const app = await NestFactory.create(AppModule);
	app.useGlobalPipes(new ValidationPipe()); /* GlobalPipe 적용 */
	await app.listen(3000);
}
bootStrap();

Controller Pipe

컨트롤러에만 적용되는 파이브.
아래는 컨트롤러 파이프에 ValidationPipe 를 적용한 것

@Controller('movie')
@UsePipes(new ValidationPipe()) /* Controller 파이프 적용 */
export class MovieController(){
	constructor(private readonly movieService: MovieService){}
	@Get()
	getMovies(@Query('title') title?: string){
		return this.movieService.findAll(title);
	}
}

Route Pipe

@Controller('movie')
export class MovieController(){
	constructor(private readonly movieService: MovieService){}
	@Patch(':id')
	@UsePipes(new ValidationPipe()) /* Route Pipe 적용 */ 
	patchMovie(@Param('id') id: number, @Body() body: UpdateMovieDTO){
		return this.movieService.update(id, body);
	}
}

Route Prameter Pipe

라우트 파라미터에 적용하는 파이프.
기본 제공되는 여러 파이프가 존재한다.

@Controller('movie')
export class MovieController(){
	constructor(private readonly movieService: MovieService){}
	@Patch(':id')
	patchMovie(@Param('id', ParseIntPipe /* 파이프 적용 */) id: number, @Body() body: UpdateMovieDTO){
		return this.movieService.update(id, body);
	}
}

기본 Pipe 타입

이름설명
ValidationPipe모든 Validation Annotation 을 적용
ParseIntPipeInt 값으로 변환, 검증
ParseFloatPipeFloat 값으로 변환, 검증
ParseBooleanPipeBool 값으로 변환, 검증
ParseArrayPipeArray값으로 변환, 검증
ParseUUIDPipeUUID 값으로 변환 , 검증
ParseEnumPipeEnum 값으로 변환 , 검증한다.
DefaultValuePipe기본값을 설정한다.
ParseFilePipe파일을 검증한다.

커스텀 Pipe 설정

@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. ${val} is Not a Valid Number.`
			)
		}
		return val;
	}
}

기본제공되는 ParseIntPipe 를 커스텀 pipe 로 만든다면 이런식으로 만들 수 있다.

0개의 댓글