본문 바로가기
nestJS

NestJS | Pipe

by 리잼 2024. 11. 20.
반응형

Pipe

NestJS에서 Pipe는 요청 데이터의 변환, 검증, 또는 가공을 수행하는 클래스이다.

Pipe는 컨트롤러의 핸들러 메서드로 전달되는 데이터가 사용되기 전에 실행되며, 요청 데이터를 처리하거나 필터링하는 데 유용하다.

Pipe의 주요 역할

  1. 데이터 변환 (Transformation)
    • 입력 데이터를 컨트롤러에서 사용할 수 있는 형식으로 변환
    • 예: 문자열을 숫자로 변환
  2. 데이터 검증 (Validation)
    • 요청 데이터가 유효한지 확인하고, 유효하지 않은 경우 예외를 던짐.
    • 예: 필수 필드가 누락되었거나, 형식이 올바르지 않을 때 에러 반환.

Pipe의 종류

1. Built-in Pipes (내장 Pipe)

  • ValidationPipe
    • 데이터 유효성을 검사
    • 주로 DTO와 함께 사용되며, class-validator와 통합된다.
    • 예: 요청 데이터가 DTO에 정의된 조건을 충족하지 않으면 에러 발생.
  • ParseIntPipe
    • 입력 값을 정수로 변환
    • 변환에 실패하면 예외를 발생.
  • ParseBoolPipe
    • 요청 값을 불리언으로 변환.
  • ParseUUIDPipe
    • 입력 값을 UUID 형식으로 확인.
  • DefaultValuePipe
    • 요청 데이터가 없는 경우 기본값을 설정.
  • ParseArrayPipe
    • 입력 데이터를 배열로 변환.

2. Custom Pipes (사용자 정의 Pipe)

요청 데이터의 특정 형식을 강제하거나 커스텀 로직을 추가해서 사용자 요구에 따라 직접 Pipe를 구현가능

모든 파이프는 'PipeTransform''transform' 메서드를 구현해야한다.

1. PasswordPipe

  • 기능:
    • 입력된 비밀번호(value)의 길이가 8자 이하인지 확인.
    • 길이가 8자 초과인 경우, BadRequestException을 발생시킴.
  • 사용 목적:
    비밀번호의 길이를 유효성 검사할 때 사용.
@Injectable()
export class PasswordPipe implements PipeTransform {
  transform(value: any, metadata: ArgumentMetadata) {
    if (value.toString().length > 8) {
      throw new BadRequestException('Password must be at least 8 characters');
    }
    return value.toString();
  }
}

 

2. MaxLengthPipe

  • 기능:
    • 입력 데이터의 길이가 지정된 최대 길이(length)를 초과하는지 확인.
    • 초과 시, BadRequestException을 발생시키며 커스텀 메시지를 반환.
  • 사용 목적:
    문자열의 최대 길이를 제한할 때 사용.
@Injectable()
export class MaxLengthPipe implements PipeTransform {
  constructor(
    private readonly length: number,
    private readonly subject: string,
  ) {}

  transform(value: any, metadata: ArgumentMetadata) {
    if (value.toString().length > this.length) {
      throw new BadRequestException(`${this.subject} 최대 길이는 ${this.length} 입니다.`);
    }

    return value.toString();
  }
}

3. MinLengthPipe

  • 기능:
    • 입력 데이터의 길이가 지정된 최소 길이(length)보다 짧은지 확인.
    • 짧을 경우, BadRequestException을 발생시키며 커스텀 메시지를 반환.
  • 사용 목적:
    문자열의 최소 길이를 제한할 때 사용.
@Injectable()
export class MinLengthPipe implements PipeTransform {
  constructor(private readonly length: number) {}

  transform(value: any, metadata: ArgumentMetadata) {
    if (value.toString().length < this.length) {
      throw new BadRequestException(`최초 길이는 ${this.length} 입니다.`);
    }

    return value.toString();
  }
}

 

  • 사용 예
@Post('register/email')
  postRegisterEmail(
    @Body('nickname') nickname: string,
    @Body('email') email: string,
    @Body('password', new MaxLengthPipe(8, '비밀번호'), new MinLengthPipe(3)) password: string,
  ) {
    return this.authService.registerWithEmail({
      nickname,
      email,
      password,
    });
  }
  • MaxLength, MinLength Pipe 는 생성자를 넣어줌으로서 동적인 값을 받아 재사용성을 높힐 수 있다.
반응형

'nestJS' 카테고리의 다른 글

NestJS | Class Validator, Transformer  (1) 2024.11.20
NestJS | Guard  (0) 2024.11.20
NestJS | TypeORM Table Inheritance  (0) 2024.11.12
NestJS | TypeORM Entity Embedding  (2) 2024.11.12
NestJS | TypeORM Column Annotation  (1) 2024.11.12