Pipe 란?
파이프는 @injectable() 데코레이터로 주석이 달린 "클래스"이다.
파이프는 Data transformation과 Data Validation을 위해서 사용된다. {데이터 변형 & 데이터 유효성 검사}
파이프는 컨트롤러 경로 처리기에 의해 처리되는 인수에 대해 작동한다.
Nest는 메소드가 호출되기 직전에
파이프를 삽입하고 파이프는 메소드로 향하는 인수{Request 값}로 수신하고 이에 대해 작동한다.
아래는 Pipe를 포함시킨 클라이언트 - 서버의 동작논리를 나타낸 것이다. 참고하길 바란다.
Pipe를 통해 클라이언트가 요청 Data에 대한
Transformation & Validation을 처리해준다.
Pipe는 API 작동에 있어서 유효한 데이터인지를 검증하는 "클래스"로 API 구현에 도움을 주는 도구이다.
반면에,
node.js는 Pipe가 존재하지 않으며,
유효한 데이터인지 검증하는 과정은 Controller에 구현되어야 한다.
그래서, 어떤 방법이 좋은 방법이다 라고 말할 수 없으며,
NestJS에서는 데이터 유효성 검증을 Pipe를 통해서 이뤄진다는 것을 알아두면 된다. (Nest의 개발 규칙인 셈이다.)
Pipe의 Data Transformation 이란?
입력 데이터를 원하는 형식으로 변환한다. (예 : 문자열에서 정수로)
만약 숫자를 받길 원하는데 문자열 형식으로 온다면 파이프에서 "자동으로" 숫자로 바꿔준다.
String to Integer Ex) string '7' => Integer 7
Pipe의 Data Validation 이란?
입력 데이터를 평가하고 유효한 경우 변경되지 않은 상태로 전달된다.
만약 그렇지않으면, 데이터가 올바르지 않을 때 예외오류를 발생시킨다. (BaseResponse 같은 것들)
Ex) 이름의 길이가 10자 이하여야 하는데 10자 이상이 되면 에러를 발생시킨다.
Pipe 사용하는 법 { Binding Pipes }
파이프를 사용하는 방법은 세가지로 나눠진다.
Handler-level Pipes, Parameter-level Pipes, Global-level Pipes 이다.
이름에서 말하는 것 그대로 핸들러 레벨, 파라미터 레벨, 글로벌 레벨로 파이프를 사용할 수 있다.
그럼, Pipe 종류에 대해 알아보았으니, 자세하게 알아보자.
Handler-level Pipes
핸들러 레벨에서 @UsePipe() 데코레이터를 이용해서 사용할 수 있다.
이 파이프는 모든 파라미터에 적용이 된다.
특정 API에서 할당되는 모든 파라미터에 대해 파이프가 적용이 되는 것임.
아래와 같은 경우에는
Params인 title, description에 대해서 Pipe가 적용
@Post()
// Handler-level Pipes 사용
@UsePipes(pipe)
createBoard(
@Body('title') title,
@Body('description') description
) {
}
Parameter-level Pipes
파라미터 레벨의 파이프이기에
특정한 파라미터에게만 적용이 되는 파이프이다.
아래와 같은 경우에는
Pipe를 지정해둔 Param인 title만 파라미터 Pipe가 적용
@Post()
createBoard(
@Body('title', ParameterPipe) title,
@Body('description') description
) {
}
Global Pipes
글로벌 파이프로서 애플리케이션 레벨의 파이프이다.
클라이언트에서 들어오는 모든 요청에 적용이 된다.
가장 상단 영역인 main.ts에 넣어줘서 Global Pipe를 설정한다.
async function bootstrap(){
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(GlobalPipes);
await app.listen(3000);
}
bootstrap();
NestJS의 Pipe
NestJS에서는 Pipe를 커스텀하게 만들어서 사용할 수 있다. (Pipe 커스텀마이징이 가능하다.)
그리고,
NestJS에 기본적으로 사용할 수 있게 만들어 놓은 6가지의 파이프가 있다.
다음은, 이름을 보면 각각의 파이프가 어떠한 역할을 하는지 짐작을 할 수 있다.
그중에서 ParseIntPipe를 이용해서 간단히 파이프를 체험해보겠다.
아래와 같이 ParseIntPipe를 사용한 코드를 구성한다.
@Get(':id')
findOne(@Param('id', ParseIntPipe) id: number) {
return;
}
그리고, 파라미터 값으로 숫자가 아닌 'abc' 문자열을 보내보자.
그러면, 이렇게 에러가 발생한다.
해당 에러는 Pipe에서 발생시키는 예외에러이다.
{
"statusCode": 400,
"error": "Bad Request",
"message": "Validation failed (numeric string is expected)"
}
마치며,
NestJS에서는 Pipe를 이용해 파라미터 데이터에 대한 유효성 검증을 진행한다.
이는, NestJS에서 지원하는 데이터 유효성 검증 도구이며,
필요에 따라 선택해서 사용할 수 있다.
반면에, Node.js는 Pipe가 없기에, 유효성 검증은 Controller에서 반드시 거쳐야한다.
항상 API를 만들 때 유효성 검증을 거쳐야했다.
어떤 개발방법이 정답은 없다.
하지만, NestJS와 같이 Pipe를 통한 데이터 유효성 검증 도구를 제공하며,
이를 필요에 따라 사용할 수도 있고, 사용하지 않을 수 있어서 편한 것 같다.
그리고, Pipe를 통해 새로운 개발 규칙이 확립되었기에 더욱 더 체계적인 개발을 할 수 있다.
한마디로, NestJS는 node.js에서 확장된 백엔드 프로그래밍 언어인 사실이 분명하다 ㅎㅎ
(그치만, 정답은 없기에 상황에 따라 적합한 방법을 사용하는 자세를 지니자.)
'📚 스터디 > 백엔드' 카테고리의 다른 글
[개인 스터디] NestJS 정복하기 #07 - 커스텀 Pipe 구현 (0) | 2022.10.30 |
---|---|
[개인 스터디] NestJS 정복하기 #06 - Pipe 사용법 (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 |