커스텀 파이프란,
지금까지는 NestJS에서 이미 구성해놓은 built-in 파이프를 사용했다.
하지만, 이것 말고도 따로 생성해서 사용할 수 있는 커스텀 파이프도 있다.
커스텀 파이프는 built-in에서 지원하지 않는 Validation이 있으면, 따로 Validation 검증을 진행하는
커스텀 파이프를 생성해서 Validation 검증을 진행한다.
커스텀 파이프 구성
Pipe Transform 인터페이스
우선 Pipe Transform이라는 인터페이스를 새롭게 만들 커스텀 파이프에 구현해줘야 한다.
Pipe Transform 인터페이스는 모든 파이프에서 구현해줘야 하는 인터페이스이다.
그리고 이것과 함께 모든 파이프는 transform() 메소드를 필요로 한다.
이 메소드는 NestJS가 인자를 처리하기 위해서 사용된다.
tansform() 메소드
이 메소드는 두개의 파라미터를 가진다.
첫번째 파라미터는 처리가 된 인자의 값 (Value)이며,
두번째 파라미터는 인자에 대한 메타 데이터를 포함한 객체이다.
transform() 메소드에서 Return 된 값은 Route 핸들러로 전해진다.
만약 예외가 발생하면 클라이언트에 바로 전해진다.
커스텀 파이프 정리
파이프 클래스는 다음과 같이 구성되어져 있고,
들어온 인자에 대해서 Validation 검증을 진행하고,
유효하다면, return해서 라우터로 값을 전달한다.
유효하지 않다면, 예외에러를 발생시켜 클라이언트에게 바로 전달한다. (라우터에게 전달하지 않음.)
Status 데이터의 Validation 검증을 진행하는
커스텀 파이프를 생성
커스텀 파이프 구현 - Status Validation 검증
transform() 메소드를 통해 Params에 대한 Value 값을 가져오고,
Value를 가지고 Status Validation 검증을 진행했다.
이때, transform() 메소드의 return 값은
라우터로 전달된다.
그리고, 예외에러는 클라이언트에게 바로 전달된다.
이에 대해선 NestJS의 파이프 개발규칙이다.
import { ArgumentMetadata, BadRequestException, PipeTransform } from "@nestjs/common";
import { BoardStatus } from "../board.model";
// PipeTransform 인터페이스를 토대로 커스텀 파이프 구성
export class BoardStatusValidationPipe implements PipeTransform {
// Status 값에 대해 규정함. - 모델 객체에 정의한 게시글 데이터 규칙을 토대로 pipe에서도 규정함.
// 개발에 대한 규칙을 구조화 - 체계적인 개발가능
// readonly 타입은 외부에서 읽기로만 가능한 타입이다.
readonly StatusOption = [
BoardStatus.PRIVATE,
BoardStatus.PUBLIC
]
// transform() 메소드를 이용해 커스텀 파이프를 구현한다.
transform(value: any, metadata: ArgumentMetadata){
value = value.toUpperCase();
if(!this.isStatusValid(value)){
throw new BadRequestException(`${value} isn't in the status options`);
}
return value;
}
// Params의 Status와 게시글 Status가 데이터형태가 일치한 지 검사
private isStatusValid(status: any){
const index = this.StatusOption.indexOf(status);
return index !== -1;
}
}
Controller 구현 - Params level 커스텀 Pipe 적용
Status Validation 검증은 status에 대해서만 필요하기에 Params level 단위의 Pipe를 사용했다.
이처럼, 상황에 적합하게 파이프를 사용하면 되겠다~ (답은 없고, 적합한 것 사용하면 됨.)
import { BoardStatusValidationPipe } from './pipes/board-status-validation.pipe';
/*
특정 ID 게시글 상태 업데이트 API Part. 1-5
*/
@Patch('/:id/status')
updateBoardStatus(
@Param('id') id: string,
// Params-level Pipe을 이용해 커스텀 파이프 적용
@Body('status', BoardStatusValidationPipe) status: BoardStatus
): Board {
return this.boardsService.updateBoardStatus(id, status);
}
마치며..
# NestJS에서 흥미롭게 보았던 특징들
NestJS에선 Pipe라는 Data Validation을 위한 클래스가 존재한다.
그래서, 클라이언트 - 서버의 요청에서 클라이언트의 요청에 대한 Data Validation 검증을
Pipe에서 진행한다.
이는 NestJS의 개발 규칙이고, NestJS 개발자들 간의 약속이다. (체계화된 개발이 가능하다.)
# 여기까지 NestJS를 공부하면서 느낀 사항
지금까지 NestJS를 공부하면서,
Node.js 보다 API 구현 시 고려할 사항들이 훨씬 많고, 개념들도 더 많다는 걸 알 수 있었다.
하지만, NestJS에서 개발할 때 유의할 사항들에 대해서 규칙을 세워두니
개발 아키텍처에 대한 혼동이 생길 우려가 적었고,
체계적으로 코드를 작성할 수 있다는 걸 깨닫고 있다.
(Node.js는 Validation에 대한 별다른 규약이 없고, DTO, model 클래스 파일처럼
요청 객체, 반환 객체에 대한 데이터 형태에 대해서도 규약이 없다.
그래서, Node.js로 개발을 하고자할 땐 자유로운 개발이 가능하지만 그만큼 통일화된 개발을 하기가 힘들다
첫 부분에 아키텍처 단일화에 대한 비즈니스 소통 비용이 많이 소비된다.)
# 백엔드 개발 언어를 대하는 자세 - 초심을 잃지 말자.
NestJS는 node.js에 비해 더 체계화된 개발 규칙으로 비즈니스 소통 비용을 줄일 수 있을 것 같다.
아직 NestJS에 대해서 많이 사용해보지 않았지만, 더 다뤄보면서 NestJS가 사용할 만한 적합한 환경에 대해서 정의하겠다.
그래도, NestJS가 완벽한 백엔드 개발언어다라고 생각하는 건 아니고, NestJS만의 장정, Node.js만의 장점을 이해하고
상황에 적합한 개발환경을 구성할 줄 아는 개발자로 성장할 것이다.
- 지금 배우고있는 NestJS가 백엔드 언어의 왕이 아니다. 답은 없고, 좋은 백엔드 개발언어 중 하나이다.
'📚 스터디 > 백엔드' 카테고리의 다른 글
[개인 스터디] NestJS 정복하기 #06 - Pipe 사용법 (0) | 2022.10.29 |
---|---|
[개인 스터디] NestJS 정복하기 #05 - Pipe { Data Transformation & Validation } (0) | 2022.10.29 |
[개인 스터디] NestJS 정복하기 #04 - DTO | Data Transfer Object (0) | 2022.10.29 |
[개인 스터디] NestJS 정복하기 #03 - 게시글 생성 API | Create API (0) | 2022.10.28 |
[개인 스터디] NestJS 정복 - CRUD API 구현 (0) | 2022.10.27 |