상세 컨텐츠

본문 제목

[nestJS] Pipetransform을 사용한 예

카테고리 없음

by esoesmio 2024. 5. 10. 17:11

본문

NestJS에서 `PipeTransform` 인터페이스는 데이터의 변환 및 유효성 검사를 위해 사용되며, 주로 요청 데이터가 컨트롤러의 핸들러 메서드로 전달되기 전에 데이터를 처리하는 데 활용됩니다. `PipeTransform`을 구현하는 클래스는 `transform` 메서드를 정의해야 하며, 이 메서드 내에서 입력 데이터를 원하는 형태로 변환하거나 유효성 검사를 수행할 수 있습니다.

### 예시 1: 문자열을 정수로 변환하는 파이프

```typescript

import { PipeTransform, Injectable, BadRequestException } from '@nestjs/common';

@Injectable()
export class ParseIntPipe implements PipeTransform {
  transform(value: string): number {
    const val = parseInt(value, 10);
    if (isNaN(val)) {
      throw new BadRequestException('Validation failed');
    }
    return val;
  }
}


```

이 파이프는 입력된 문자열 값을 정수로 변환합니다. 변환이 실패하면 `BadRequestException`을 발생시킵니다.

### 예시 2: 입력 값의 길이 제한 검증 파이프

```typescript

import { PipeTransform, Injectable, BadRequestException } from '@nestjs/common';

@Injectable()
export class ValidateStringLengthPipe implements PipeTransform {
  constructor(private readonly maxLength: number) {}

  transform(value: string): string {
    if (value.length > this.maxLength) {
      throw new BadRequestException(`The length of the input data can not exceed ${this.maxLength} characters.`);
    }
    return value;
  }
}


```

이 파이프는 생성자를 통해 최대 길이를 설정받고, 입력된 문자열의 길이가 이를 초과하면 예외를 발생시킵니다.

### 예시 3: 사용자 정의 DTO 유효성 검사 파이프

```typescript

import { PipeTransform, Injectable, BadRequestException } from '@nestjs/common';
import { CreateUserDto } from './create-user.dto';
import { validateOrReject } from 'class-validator';

@Injectable()
export class CreateUserPipe implements PipeTransform {
  async transform(value: CreateUserDto) {
    await validateOrReject(value).catch(errors => {
      throw new BadRequestException('Validation failed');
    });
    return value;
  }
}


```

이 파이프는 `class-validator`를 사용하여 `CreateUserDto` 객체의 유효성을 비동기적으로 검사합니다. 유효성 검사에 실패하면 예외를 발생시킵니다.

### 예시 4: 요청된 데이터를 정규화하는 파이프

```typescript

import { PipeTransform, Injectable } from '@nestjs/common';

@Injectable()
export class NormalizeEmailPipe implements PipeTransform {
  transform(value: any): any {
    if (typeof value.email === 'string') {
      value.email = value.email.trim().toLowerCase();
    }
    return value;
  }
}


```

이 파이프는 입력된 이메일 주소의 공백을 제거하고, 모든 문자를 소문자로 변환합니다.

### 설명

NestJS의 파이프는 유효성 검사 및 데이터 변환을 위한 중앙 집중식 위치를 제공하므로, 비즈니스 로직을 실행하기 전에 데이터가 정확한 형식과 조건을 만족하도록 보장합니다. 각 파이프는 특정 타입의 데이터 처리에 특화되어 있으며, 컨트롤러 레벨이나 글로벌 레벨에서 적용될 수 있습니다. 이를 통해 코드의 재사용성과 유지 보수성을 향상시킬 수 있습니다.

댓글 영역