NestJS에서 Pipe
는 요청 데이터의 유효성 검사(validation)와 변환(transformation)을 위해 사용되는 강력한 도구입니다. Pipe
는 요청이 처리되기 전에 데이터의 형식을 변경하거나 유효성을 검증하는 데 주로 사용됩니다. 예를 들어, 클라이언트에서 받은 데이터를 특정 형식으로 변환하거나 특정 조건에 맞는지 확인하는 데 활용할 수 있습니다.
Pipe의 역할
데이터 변환 (Transformation)
Pipe
는 클라이언트가 보내온 데이터를 컨트롤러에서 사용할 수 있도록 변환합니다. 예를 들어, 문자열로 받아온 데이터를 숫자로 변환하는 등의 작업을 할 수 있습니다.데이터 유효성 검사 (Validation)
데이터가 올바른 형식인지, 특정 조건을 만족하는지 검증합니다. 예를 들어, 이메일 형식인지, 숫자가 음수가 아닌지 등을 검사할 수 있습니다. 유효성 검사를 통과하지 못하면 요청을 거부하고 클라이언트에 오류 메시지를 반환할 수 있습니다.
Pipe 적용 위치
Pipe는 NestJS에서 메서드와 파라미터 단위로 적용할 수 있으며, 전역으로 설정하여 모든 요청에 적용할 수도 있습니다. 다음과 같은 위치에 적용할 수 있습니다.
- 메서드 단위: 컨트롤러의 특정 메서드에만 Pipe를 적용합니다.
- 파라미터 단위: 메서드의 특정 파라미터에만 Pipe를 적용합니다.
- 전역 단위: 모든 요청에 Pipe를 적용합니다.
내장된 Pipe
NestJS는 몇 가지 기본 Pipe를 제공합니다.
ValidationPipe
데이터 유효성 검사를 수행합니다. DTO 클래스와 함께 사용하여 요청 데이터가 DTO에서 정의한 조건을 충족하는지 검사합니다.
예를 들어,
@IsString()
,@IsInt()
같은 데코레이터를 활용하여 특정 형식의 데이터를 검사합니다.ParseIntPipe
문자열로 들어온 파라미터를 정수로 변환합니다. 변환에 실패하면
BadRequestException
을 발생시킵니다.ParseBoolPipe
문자열을 불리언 값으로 변환합니다.
true
,false
,1
,0
등으로 변환 가능합니다.ParseUUIDPipe
파라미터가 UUID 형식인지 검사하고, 올바른 형식이 아니면 예외를 발생시킵니다.
DefaultValuePipe
파라미터가 없을 때 기본값을 설정합니다.
ParseArrayPipe
요청 데이터를 배열로 변환하고 각 요소에 대해 유효성 검사를 수행할 수 있습니다.
Custom Pipe 만들기
NestJS에서는 기본 Pipe 외에도 커스텀 Pipe를 만들어 사용할 수 있습니다. 커스텀 Pipe는 PipeTransform
인터페이스를 구현하여 만듭니다.
예제: 요청 데이터를 대문자로 변환하는 커스텀 Pipe
import { Injectable, PipeTransform } from '@nestjs/common';
@Injectable()
export class UppercasePipe implements PipeTransform {
transform(value: string) {
return value.toUpperCase();
}
}
이제 UppercasePipe
를 컨트롤러의 메서드 파라미터에 적용하면, 해당 데이터가 자동으로 대문자로 변환됩니다.
Pipe 사용 예시
아래는 NestJS의 ValidationPipe
와 ParseIntPipe
를 활용하여 데이터 유효성 검사를 수행하는 예시입니다.
import { Controller, Get, Param, ParseIntPipe, UsePipes, ValidationPipe } from '@nestjs/common';
@Controller('users')
export class UsersController {
@Get(':id')
getUserById(@Param('id', ParseIntPipe) id: number) {
// id는 자동으로 정수로 변환되어 처리됩니다.return { userId: id };
}
@Post()
@UsePipes(ValidationPipe)
createUser(@Body() createUserDto: CreateUserDto) {
// createUserDto의 유효성 검사가 자동으로 이루어집니다.
}
}
위 코드에서 ParseIntPipe
는 id
를 정수로 변환하며, ValidationPipe
는 CreateUserDto
에 정의된 유효성 규칙을 검사합니다.
전역 Pipe 설정
전역으로 Pipe를 설정하면 모든 요청에 대해 동일한 Pipe가 적용됩니다. 전역 Pipe는 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);
// 전역 ValidationPipe 적용
app.useGlobalPipes(new ValidationPipe({
whitelist: true,
forbidNonWhitelisted: true,
transform: true,
}));
await app.listen(3000);
}
bootstrap();
위 예시에서 전역으로 설정된 ValidationPipe
는 요청 데이터를 DTO에 정의된 필드만 남기고 나머지를 제거(whitelist)하거나, 허용되지 않은 필드가 있으면 오류를 발생(forbidNonWhitelisted)하게 설정되었습니다.
요약
- Pipe는 데이터의 변환과 유효성 검사를 위해 사용됩니다.
- NestJS의 기본 Pipe:
ValidationPipe
,ParseIntPipe
등 다양한 기본 Pipe가 제공됩니다. - Custom Pipe:
PipeTransform
인터페이스를 구현하여 커스텀 Pipe를 만들 수 있습니다. - 전역 Pipe: 모든 요청에 Pipe를 일관되게 적용하기 위해 전역 설정이 가능합니다.
'NestJS' 카테고리의 다른 글
NestJS Guard (0) | 2024.11.16 |
---|---|
NestJS 핫리로드 트러블슈팅 (1) | 2024.11.16 |
회원가입로직 (2) | 2024.11.14 |
NestJS DI(Dependency Injection) (0) | 2024.11.06 |
NestJS 초기 파일들의 의미 (3) | 2024.11.04 |