파이프는 파이프 변환 인터페이스를 구현하는 @Injectable() 데코레이터가 달린 클래스 입니다.
파이프에는 두 가지 일반적인 사용 사례가 있습니다.
두 경우 모두 파이프는 컨트롤러 라우트 핸들러 arguments에서 처리중인 상태에서 작동합니다. Nest는 메소드가 호출되기 직전에 파이프를 삽입하고 파이프는 메소드로 향하는 인수를 수신하고 작동합니다. 모든 변환과 유효성 검사는 그 시간에 발생하며 그 후에 컨트롤러에 변환된 인수와 함께 호출됩니다.
먼저 컨트롤러에서 @Param()을 사용하여 값을 받아보겠습니다.
catsController
// cats/:id
@Get(':id')
getOneCat(@Param() param) {
console.log(param);
return 'one cat';
}
호출이 잘 되었습니다. 콘솔에 로그를 확인해 보겠습니다.
json 객체로 콘솔 로그가 남습니다. 여기서 명확하게 id를 준다면?
dog가 콘솔 로그에 남게 됩니다.
// cats/:id
@Get(':id')
getOneCat(@Param('id') param) {
console.log(param);
console.log(typeof param);
return 'one cat';
}
// dog
// string
여기에 typeof로 param의 타입을 출력해보았습니다. string이 나옵니다.
이 값을 파이프를 사용하여 number로 변환해보도록 하겠습니다.
Nest는 즉시 사용할 수 있는 9개의 파이프와 함께 제공됩니다.
변환 사용 시 변환에 실패하면 예외를 발생시킵니다.
파이프를 사용하려면 파이프 클래스의 인스턴스를 적절한 컨텍스트에 바인딩해야 합니다.
// cats/:id
@Get(':id')
getOneCat(@Param('id', ParseIntPipe) param: number) {
console.log(param);
return 'one cat';
}
// 123123
ParseIntPipe를 사용하여 id는 number 타입만 들어올 수 있게 하였습니다.
localhost:8000/cats/123123 를 호출했을 때 123123이 잘 출력되는 것을 확인할 수 있습니다. 만약 number type이 아닌 'catking'을 넣어보도록 하겠습니다.
변환 하는 과정에서 exception이 발생하였기 때문에 콘솔 로그에는 아무것도 남지 않고, 전역 filter로 설정한 HttpExceptionFilter를 거쳐서 응답하는 것을 확인할 수 있습니다.
해당 게시글은 "NestJS 공식 홈페이지"와
인프런 강의 "탄탄한 백엔드 NestJS, 기초부터 심화까지(윤상석)"을 참고하여 만들었습니다.