상태 업데이트의 유효성 검사 기능을 수행하는 커스텀 파이프를 만들다.
1. Custom Pipe
커스텀 파이프는 Pipe Transform이란 인터페이스에서 transform 메서드를 사용해서 NestJS가 인자를 처리하게 만들 수 있다. transform 메서드는 value와 metatdat 파라미터를 가지는데, value는 실제 값, metadata는 value에 대한 자세한 정보가 담겨있는 메타데이터이다. value만 있어도 된다. transform 메서드에서 Return 된 값은 Route 핸들러로 전해지고, 예외가 발생하면 클라이언트에 바로 전해진다.
2. 커스텀 파이프 폴더 및 파일 생성
boards 폴더에 pipes 폴더를 새로 생성한다. pipes 폴더 내에 파이프 파일을 만든다. 나는 보드의 상태가 유효한 상태인지 검사하기 위한 파이프이기 때문에 board-status-validation.pipe.ts로 지었다.
/* eslint-disable prettier/prettier */
/* eslint-disable @typescript-eslint/no-unused-vars */
import { ArgumentMetadata, BadRequestException, PipeTransform } from '@nestjs/common';
import { BoardStatus } from '../board.model';
export class BoardStatusValidationPipe implements PipeTransform {
readonly StatusOptions = [BoardStatus.PUBLIC, BoardStatus.PRIVATE];
transform(value: any, metadata: ArgumentMetadata) {
// value는 status 값, metatdata는 그냥 메타데이터
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);
// indexOf의 반환값은 있으면 인덱스값 없으면 -1
// 따라서 밑의 return은 있으면 true, 없으면 false
return index !== -1;
}
}
보드의 상태 옵션을 만들고 검사 메소드를 만들어서 있는지 없는지 확인하는 로직을 만든다. 있으면 return value로 넘어가고 없으면 if문이 true가 돼서 throw로 예외처리가 된다.
파이프는 요청을 보내고 요청 수행하기 직전에 사용된다고 했다. 요청은 controller에서 다루고 지금 상태는 전 게시물에서 배웠던 파라미터 핸들러 상황이기 때문에 Body 파라미터에 사용하면 된다.
@Patch('/:id/status')
updateBoardStatus(
@Param('id') id: string,
@Body('status', BoardStatusValidationPipe) status: BoardStatus,
) {
return this.boardsService.updateBoardStatus(id, status);
}
'Back-End > NestJS' 카테고리의 다른 글
[NestJS] TypeORM (0) | 2024.01.19 |
---|---|
[NestJS] 특정 값 찾기에서 없을 때 예외처리 (0) | 2024.01.16 |
[NestJS] Pipe란 / Pipe 적용하기 (0) | 2024.01.15 |
[NestJS] Param을 활용한 ID기준 게시물 찾기 (0) | 2024.01.11 |
[NestJS] DTO 만들기 (0) | 2024.01.09 |