✅ 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 |