학습 키워드
- pipe
학습정리
1. Pipe란?
Pipe는 요청 데이터를 변환(transform)하거나 검증(validation)하는 데 사용되는 NestJS의 핵심 컴포넌트이다.
컨트롤러 메서드가 호출되기 전에 실행되며 컨트롤러로 전달되는 데이터를 사전에 가공하거나 유효성 검사를 실행하기 위해 사용된다.
- 주요 사용 사례
- 변환 (Transformation): 데이터를 원하는 형식으로 변환 (예: 문자열 → 정수).
- 검증 (Validation): 데이터를 평가하여 유효하면 통과, 유효하지 않으면 예외 발생.
Pipe의 기본 구성 요소
- @Injectable() 데코레이터를 사용해 정의.
- PipeTransform 인터페이스를 구현하며, transform 메서드가 필수.
import { Injectable, PipeTransform, ArgumentMetadata } from '@nestjs/common';
@Injectable()
export class ExamplePipe implements PipeTransform {
transform(value: any, metadata: ArgumentMetadata) {
// 변환 또는 검증 로직
return value;
}
}
2. 기본 내장 Pipe
NestJS는 여러 내장 Pipe를 제공합니다. 주요 내장 Pipe를 학습하면서 사용 사례를 알아보자
주요 내장 Pipe
- ValidationPipe
- class-validator와 연동하여 DTO 객체를 검증.
- 주로 POST, PUT 요청에서 request body의 유효성을 검사.
- ParseIntPipe
- 문자열 값을 정수로 변환.
- 변환 실패 시 400 예외를 발생.
- ParseUUIDPipe
- UUID 문자열 검증 및 변환.
- DefaultValuePipe
- 파라미터 값이 없을 때 기본값 설정.
3. Pipe 사용법
메서드 파라미터 레벨 바인딩
- Pipe를 특정 파라미터에만 적용.
@Get(':id')
async findOne(@Param('id', ParseIntPipe) id: number) {
return this.catsService.findOne(id);
}
메서드 레벨 바인딩
- @UsePipes 데코레이터를 사용해 메서드에 적용.
@Post()
@UsePipes(new ValidationPipe())
async create(@Body() createCatDto: CreateCatDto) {
this.catsService.create(createCatDto);
}
글로벌 레벨 바인딩
- 모든 요청에 Pipe를 적용.
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe());
await app.listen(3000);
}
4. Custom Pipe 생성
1) ValidationPipe 예제
- 데이터 검증 로직 구현.
import { PipeTransform, Injectable, BadRequestException } from '@nestjs/common';
@Injectable()
export class CustomValidationPipe implements PipeTransform {
transform(value: any) {
if (!value || typeof value !== 'string') {
throw new BadRequestException('Validation failed');
}
return value;
}
}
2) TransformationPipe 예제
- 데이터 변환 로직 구현.
import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common';
@Injectable()
export class CustomParseIntPipe implements PipeTransform {
transform(value: string): number {
const parsed = parseInt(value, 10);
if (isNaN(parsed)) {
throw new BadRequestException('Validation failed');
}
return parsed;
}
}
5. 고급 학습
class-validator와 연동한 ValidationPipe
- DTO 클래스에 데코레이터를 추가하여 유효성 검사.
typescript
코드 복사
import { IsString, IsInt } from 'class-validator';
export class CreateCatDto {
@IsString()
name: string;
@IsInt()
age: number;
@IsString()
breed: string;
}
Zod를 활용한 Schema 기반 검증
- zod 라이브러리로 유연한 검증 로직 구현.
typescript
코드 복사
import { z } from 'zod';
import { PipeTransform, Injectable, BadRequestException } from '@nestjs/common';
export const createCatSchema = z.object({
name: z.string(),
age: z.number(),
breed: z.string(),
});
@Injectable()
export class ZodValidationPipe implements PipeTransform {
constructor(private schema: typeof createCatSchema) {}
transform(value: any) {
try {
return this.schema.parse(value);
} catch {
throw new BadRequestException('Validation failed');
}
}
}
6. 실습 및 연습 과제
- 기본 Pipe 활용
- ParseIntPipe를 사용하여 숫자 입력 검증.
- ValidationPipe 활용
- class-validator를 활용하여 DTO 검증.
- Custom Pipe 구현
- 문자열을 Base64로 인코딩/디코딩하는 TransformationPipe 생성.
- ZodValidationPipe 구현
- Zod를 사용하여 복잡한 객체 검증 로직 작성.
7. 심화 학습 주제
- Pipe와 Middleware의 차이점
- Pipe는 컨트롤러 내부 파라미터 처리, Middleware는 요청/응답 흐름 처리.
- Async Pipe 사용
- 데이터베이스 호출이나 비동기 검증이 필요한 Pipe 작성.
- 모듈화된 글로벌 Pipe 관리
- 글로벌 Pipe를 종속성을 가지는 형태로 설정.
'Dev Framework > NestJS' 카테고리의 다른 글
[NestJS] enableCors( ) (1) | 2024.11.21 |
---|---|
[NestJS][TypeORM] Data Mapper Pattern (0) | 2024.11.19 |
[NestJS][TypeORM] Activate Record Pattern (0) | 2024.11.18 |
[NestJS] Provider란? (0) | 2024.10.27 |