내배캠 94일차

·2023년 2월 15일
0

내일배움캠프

목록 보기
103/142
post-thumbnail

1. Pipe

파이프는 @Injectable() 데코레이터로 주석이 달린 클래스.

파이프는 data transformation(데이터 변형)과 data validation(데이터 유효성검사)을 위해서 사용 됩니다.
파이프는 컨트롤러 경로 처리기(라우트 핸들러)에 의해 처리되는 인수에 대해 작동합니다.

Nest는 메소드가 호출되기 직전에 파이프를 삽입하고, 파이프는 메소드로 향하는 인수를 수신하고 이에 대해 작동합니다.

data transformation?

입력 데이터를 원하는 형식으로 변환(예: 문자열에서 정수로)

만약 숫자를 받길 원하는데 문자열 형식으로 온다면 파이프에서 자동으로 숫자로 바꿔준다.

data validation?

입력 데이터를 평가하고 유효한 경우 변경되지 않은 상태로 전달.
그렇지 않으면 데이터가 올바르지 않을 때 예외를 발생.

만약 이름의 길이가 10자 이하여야 하는데 10자 초과라면 에러를 발생시킨다.

Pipe 사용하는 법

파이프를 사용하는 방법(Binding pipes)은 3가지

  1. Handler-level Pipes
  2. Parameter-level Pipes
  3. Global-level Pipes

Handler-level Pipes

핸들러 레벨에서 @UsePipes() 데코레이터를 이용해서 사용가능

이 파이프는 모든 파라미터에 적용됨!

Parameter-level Pipes

파이프를 적용하고 싶은 파라미터에 ParameterPipe사용

파라미터 레벨의 파이프는 특정한 파라미터에서만 적용

Global-level Pipes

글로벌 파이프로서 애플리케이션 레벨의 파이프!
가장 상단 영역인 main.tsapp.useGlobalPipes(GlobalPipes)넣어주면 됨.

클라이언트에서 들어오는 모든 요청에 적용

Built-in Pipes

NestJS에 기본적으로 사용할 수 있게 만들어 놓은 6가지 파이프가 존재

  1. ValidationPipe
  2. ParseIntPipe
  3. ParseArrayPipe
  4. ParseUUIDPipe
  5. ParseBoolPipe
  6. DefaultValuePipe

2. 파이프를 이용한 유효성 체크

필요한 모듈 class-validator, class-transformer
npm i class-validator class-transformer --save

파이프 생성하기

현재는 게시물을 생성할 떄 이름과 설명에 아무런 값을 주지 않아도 생성이 됨.

create-board.dto.ts

IsNotEmpty 파이프 추가

import { IsNotEmpty } from 'class-validator';

export class CreateBoardDto {
  @IsNotEmpty()
  title: string;

  @IsNotEmpty()
  description: string;
}

board.controller.ts

핸들러 레벨의 파이프를 추가

@Post()
  @UsePipes(ValidationPipe)
  createBoard(@Body() createBoardDto: CreateBoardDto): Board {
    return this.boardsService.createBoard(createBoardDto);
  }

원하는 대로 빈 값을 넣어 생성하려고 하면 에러가 발생함!!

3. 특정 게시물이 없는 경우 처리

현재는 특정아이디의 게시물이 없는 경우에도 에러문구가 뜨지 않음

예외 인스턴스 생성

이러한 경우에는 NotFoundException() 예외 인스턴스를 생성해서 이용해주면 된다.

getBoardById(id: string): Board {
    const found = this.boards.find((board) => board.id === id);

    if (!found) {
      throw new NotFoundException();
    }

    return found;
  }

이런식으로 원하는 문구를 나오도록 할 수 있다.

throw new NotFoundException(`Can't find Board with id ${id}`);

정상적으로 에러가 발생하는 것을 볼 수 있다!

4. 없는 게시물을 지우려 할 때 처리

위에서 예외 인스턴스를 처리해준 메소드 getBoardById를 이용!

deleteBoardById(id: string): void {
    const found = this.getBoardById(id);
    this.boards = this.boards.filter((board) => board.id !== found.id);
  }

5. 커스텀 파이프를 이용한 유효성 체크

앞에서는 NestJS의 built-in 파이프를 사용함.
하지만 직접 생성해서 사용할 수 있는 CUSTOM PIPE도 존재

커스텀 파이프 구현 방법

먼저 PipeTransform이란 인터페이스를 새롭게 만들 커스텀 파이프에 구현해줘야 합니다.
PipeTransform 인터페이스는 모든 파이프에서 구현해줘야 하는 인터페이스입니다.
그리고 PipeTransform 인터페이스와 함꼐 모든 파이프는 transform() 메소드를 필요로 합니다.
transform() 메소드는 NestJS가 인자(Arguments)를 처리하기 위해서 사용됩니다.

transform() 메소드

이 메소드는 두 개의 파라미터를 가집니다.
첫번째는 처리가 된 인자의 값(value)이고, 두번째는 인자에 대한 메타 데이터를 포함한 객체입니다.

transform() 메소드에서 return 된 값은 Route 핸들러로 전해집니다.
만약 예외가 발생하면 클라이언트에 바로 전해집니다.

value와 metadata 값 콘솔로 확인

  1. 커스텀 파이프를 사용할 폴더(현재는 boards)안에 pipes 폴더 생성.
  2. pipes 폴더안에 pipe 파일 생성(board-status-validtion.pipe.ts)
  3. 게시물의 상태를 업데이트하는 핸들러(컨트롤러에 있음)에 커스텀 파이프 넣어주기
  4. Thunder Client 또는 포스트 맨으로 요청 보내기

커스텀 파이프로 실제 기능 구현

구현할 기능 : 상태(status)는 PUBLIC과 PRIVATE만 올 수 있기 때문에 이외의 값이 온다면 에러를 발생시킬 것

import { BadRequestException, PipeTransform } from '@nestjs/common';
import { BoardStatus } from '../board.model';

export class BoardStatusValidationPipe implements PipeTransform {
  readonly StatusOptions = [BoardStatus.PRIVATE, BoardStatus.PUBLIC];

  transform(value: any) {
    value = value.toUpperCase();

    if (!this.isStatusValid(value)) {
      throw new BadRequestException(`${value} isn't in the status options`);
    }

    return value;
  }

  private isStatusValid(status: any) {
    const index = this.StatusOptions.indexOf(status);
    return index !== -1;
  }
}

indexof

주어진 값이 존재하지 않으면 -1을 반환

profile
개발자 꿈나무

0개의 댓글