티스토리 뷰
Pipe은 무엇인가?
파이프는 @Injectable() 데코레이터로 주석이 달린 클래스입니다.
파이프는 1) data transformation 과 2)data validation을 위해 사용됩니다.
파이프는 컨트롤러 경로 처리기에 의해 처리되는 인수에 대해 작동합니다.
Nest는 메소드가 호출되기 직전에 파이프를 삽입하고 파이프는
메소드로 향하는 인수를 수신하고 이에 대해 작동합니다.
Client --- post Request { "title":"hello"} ------> Pipe - data transformation, data validation
| |
| |
| | 실패
|
|
통과
|
|
|
@Get()
Route Handler{
Client <<----------------
}
1)What is Data Transformation ?
입력 데이터를 원하는 형식으로 변혼( 예: 문자열에서 정수로)
만약 숫자를 받길 원하는데 문자열 형식으로 온다면 파이프에서 자동으로 숫자로 바꿔준다
String to Integer Ex) string '7' => Integer 7
2)What is Data validation?
입력 데이터를 평가하고 유효한 경우 변경되지 않은
상태로 전달하면 된다. 그렇지 않으면 데이터가 올바르지 않을 때 예외를
발생시킨다.
만약 이름의 길이가 10자 이하여야 하는데 10자 이상이 되면 에러를 발생시킨다.
파이프는 위의 두가지 경우에서
라우터 핸들러(Route Handler)가 처리하는 인수에 대해서 작동합니다.
그리고 파이프는 메소드를 바로 직전에 작동해서 메소드로 향하는 인수에
대해서 변환하고 유효성 체크를 위해서도 호출됩니다.
PIPE 사용하는 법(Binding Pipes)
파이프를 사용하는 방법은 세가지로 나눠질 수 있습니다.
(1) Handler-level Pipes, (2)Parameter-level Pipes, (3)Global-level Pipes입니다.
이름에서 말하는 것 그대로 핸들러 레벨, 파라미터 레벨, 글로벌 레벨로 파이프
사용를 사용할 수 있습니다.
(1)Handler-level Pipes
핸들러 레벨에서 @UsePipes() 데코레이터를 이용해서 사용할 수 있다.
이 파이프는 모든 파라미터에 적용된다 (title, description)
@Post()
@UsePipes(pipe) <--
createBoard(
@Body('title') title,
@Body('description') description
){
}
(2)Parameter-level Pipes
파라미터 레벨의 파이프이기에 특정한
파라미터에게만 적용되는 파이프입니다.
아래와 같은 경우에는 title만 파라미터 파이프가 적용됩니다.
@Post
createBoard(
@Body('title',ParameterPipe) title,
@Body('description') description
)
(3) Global Pipes
글로벌 파이프로서 애플리케이션 레벨의 파이프입니다.
클라이언트에서 들어오는 모든 요청에 적용됩니다.
가장 상단여역인 main.ts에 넣어주면 됩니다.
async function bootscript(){
const app = await NestFactory.create(AppModule)
app.useGlobalPipes(GlobalPipes);
await app.listen(3000);
}
bootstrap();
Built-in Pipes
NestJS에는 기본적으로 사용할 수 있게 만들어 놓은 6가지의 파이프가 있습니다.
-ValidationPipe
-ParseIntPipe
-ParseBoolPipe
-ParseArrayPipe
-ParseUUIDPipe
-DefaultValuePipe
Custom Pipes
Custom Pipe를 만들려면
먼저 PipeTransform이라는 인터페이스를 새롭게 만들 커스텀 파이프에
구현해줘야 합니다.
*PipeTransform인터페이스는 모든 파이프에서 구현해줘야 하는 인터페이스입니다.
그리고 이것과 함께 모든 파이프는 transform()메소드를 필요로 합니다.
이 메소드는 Nest.js가 인자(arguments)를 처리하기 위해서 사용됩니다.
transform() 메소드
이 메소드는 두 개의 파라미터를 가집니다.
첫 번째 파라미터는 처리가 된 인자의 값(value)이며
두 번째 파라미터는 인자에 대한 메타 데이터를 포함한 객체입니다.
transform()메소드에서 Return된 값은 Route핸들러로 전해집니다.
만약 예외(Exception)가 발생하면 클라이언트에 바로 전해집니다.
'Node.js' 카테고리의 다른 글
DTO ( Data Transfer Object) (0) | 2021.12.29 |
---|---|
DI (Dependecy Injection) (0) | 2021.12.29 |
Providers (0) | 2021.12.29 |
Nest.js Core (0) | 2021.12.29 |
Express 미들웨어 (0) | 2021.09.03 |