gengminy
갱미니의 코딩일지
gengminy
전체 방문자
오늘
어제
  • 분류 전체보기 (61)
    • 🚀 프로젝트 (16)
      • 🎸 고스락 티켓 (4)
      • 🌞 내친소 (5)
      • 🥁 두둥 (7)
    • 📡 백엔드 (31)
      • 🌱 Spring Boot (13)
      • 🐱 Nest.js (10)
      • ⭐ Node.js (8)
    • 🏭 Infra (11)
      • ⚙ 준비를 위한 준비 (2)
      • 🥑 AWS (3)
      • 🐳 Docker (3)
      • ⚡ Github Actions (3)
    • 🌊 프론트엔드 (1)
      • 🌌 React.js (1)
    • 😎 주저리 (2)

블로그 메뉴

  • 💻Github
  • 📸Instagram
  • ✨Blog

공지사항

인기 글

태그

  • JWT
  • SlackAPI
  • oauth2
  • github
  • 네스트
  • nestjs
  • 스프링
  • nodejs
  • 스프링부트
  • 깃헙액션
  • 도커
  • springboot
  • docker
  • nest
  • AWS
  • OAuth
  • JSON
  • Spring
  • GithubActions
  • 슬랙알림

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
gengminy

갱미니의 코딩일지

[NestJs] 따라하면서 배우는 NestJs - 3 (pipe와 validation)
📡 백엔드/🐱 Nest.js

[NestJs] 따라하면서 배우는 NestJs - 3 (pipe와 validation)

2022. 7. 4. 18:17

 

✅ Pipe

 

데이터 변환과 데이터 유효성 검사를 위한 클래스

핸들러 레벨 / 파라미터 레벨 / 글로벌 레벨의 3가지 레벨에서 사용할 수 있음

 

 

 

✅ 모듈 설치

npm i class-validator class-transformer --save

 

📝 class-validator docs

https://github.com/typestack/class-validator#manual-validation

 

 

 

✅ class-validator 적용

 

📝 ./boards/dto/create-board.dto.ts

import { IsNotEmpty } from 'class-validator';

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

    @IsNotEmpty()
    description: string;
}

 

📝 ./boards/boards.controller.ts

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

핸들러 레벨 파이프는 @UsePipes 를 적고

유효성 검사와 관련된 파이프를 사용하기 때문에 인자로 ValidationPipe를 넣어준다

기본 빌트인 파이프는 6가지로 NestJs가 기본적으로 제공한다

 

- ValidationPipe

- ParseIntPipe

- ParseBoolPipe

- ParseArrayPipe

- ParseUUIDPipe

- DefaultValuePipe

 

확실히 데코레이터를 사용하니까 구조적으로 눈에 잘 띄고

기본적인 파이프도 제공해서 편리하다

노드의 편리함과 스프링의 명확한 구조가 합쳐진 느낌

 

 

 

✅ READ - 없는 board를 가져오려 할 때 예외 처리

 

📝 ./boards/boards.service.ts

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

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

    return found;
}

NotFoundException 또한 Nest가 기본적으로 제공하는 인스턴스

인자로 문자열을 주면 response에 해당 message가 실려 나간다

 

 

 

✅ DELETE - 없는 board를 지우려 할 때 예외 처리

 

📝 ./boards/boards.service.ts

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

getBoardById에 이미 예외처리 구문을 설정했으므로

일단 찾아서 일치하는지 확인해주는 라인만 추가

만약 해당 id에 해당하는 board가 없다면 getBoardById 메서드에서 예외 처리 진행

 

 

 

✅ 커스텀 파이프 구현

 

📝 ./boards/pipes/board-status-validation.pipe.ts

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

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

    transform(value: any, metadata: ArgumentMetadata) {
        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;
    }
}

커스텀 파이프를 구현하기 위해서는 반드시

1. PipeTransform 인터페이스를 가져와서

2. transform 메서드를 오버라이딩 해주어야 한다

 

PipeTransform 인터페이스 또한 Nest가 기본적으로 가지고 있다

 

여기서는 BoardStatus 의 두가지 상태를 가져와서

이 두 상태가 아닌 인자가 전달이 되면 400 에러를 응답하도록 했다

 

 

아직까지는 편리한 기능이 많은 거 같고 쉽다

아마도?

저작자표시 (새창열림)

'📡 백엔드 > 🐱 Nest.js' 카테고리의 다른 글

[NestJs] 따라하면서 배우는 NestJs - 5 (레포지토리 구현 및 DB 이용 CRUD)  (0) 2022.07.07
[NestJs] TypeORM 사용 시 RepositoryNotFoundError 해결하기  (0) 2022.07.06
[NestJs] 따라하면서 배우는 NestJs - 4 (Postgres, TypeORM 적용)  (0) 2022.07.05
[NestJs] 따라하면서 배우는 NestJs - 2 (기본적인 CRUD 수행)  (0) 2022.07.04
[NestJs] 따라하면서 배우는 NestJs - 1 (기본 세팅 및 구조 파악)  (0) 2022.07.04
    '📡 백엔드/🐱 Nest.js' 카테고리의 다른 글
    • [NestJs] TypeORM 사용 시 RepositoryNotFoundError 해결하기
    • [NestJs] 따라하면서 배우는 NestJs - 4 (Postgres, TypeORM 적용)
    • [NestJs] 따라하면서 배우는 NestJs - 2 (기본적인 CRUD 수행)
    • [NestJs] 따라하면서 배우는 NestJs - 1 (기본 세팅 및 구조 파악)
    gengminy
    gengminy
    코딩

    티스토리툴바