Pipes에 관한 내용을 번역과 동시에 제 생각을 넣은 글입니다. 더 정확한 사실을 알고 싶다면 해당 링크를 방문해 주세요. 번역 시작하겠습니다.
파이프(Pipes)는 @Injectable 데코레이터가 달린 클래스임과 동시에 PipeTransform 인터페이스로 구현이 되어있습니다.
이제부터 파이프가 어떻게 진행되는지에 대한 내용을 얘기해 보겠습니다. 파이트는 두 가지의 전형적인 유스 케이스를 갖고 있습니다.
첫 번째, Transformation(변환)입니다. 이것은 요구되는 형태(form)에 맞춘 입력 데이터를 전환합니다. 예를 들어서, string을 정수로 변환한다던지에 관한 것을 의미합니다.
두 번째, Validation(검증)입니다. 이것은 입력 데이터가 활용 가능한 데이터인지 평가합니다. 그리고 유효한 경우 변환 없이 전달하게 됩니다. 그렇지 않으면 exception을 적용해 반환합니다.
위에 작성된 내용과 같이 NestJS에서 파이프(Pipes)는 컨트롤러의 라우트 핸들러가 처리하는 인자(arguments)에 대해 Transformation(변환), Validation(검증)을 수행하는 기능을 제공합니다. 즉, 파이프는 컨트롤러의 라우트 핸들러(route handler)가 처리하는 인자들에 대해 작동한다는 의미를 갖고 있습니다.
파이프는 컨트롤러의 라우트 핸들러가 받는 인자에 대해 사전 처리를 합니다. 파이프는 컨트롤러에 접근하기 전에 처리를 하는 것이라고 보면 됩니다. 즉, 클라이언트로부터 요청이 들어오면 요청 데이터가 라우트 핸들러로 전달되기 전에 파이프를 통해 유효성 검사나 변환 작업이 이루어집니다. 이를 통해 핸들러는 항상 예상된 형식과 조건을 만족하는 데이터만 처리할 수 있게 됩니다.
또한, NestJS는 즉시 사용할 수 있는 여러 개의 내장 파이프와 함께 제공되고, 커스텀 파이프를 만들 수도 있습니다. Nest 공식문서에서는 내장된 파이프를 소개하고 라우트 핸들러에서 내장된 파이프를 어떻게 묶어서 보여줄 것인지도 소개해줍니다. 해당 글에서는 이에 해당하는 내용은 지금 당장은 존재하지 않습니다. 왜냐하면, 지금은 필요한 내용만 정리할 예정이기 때문입니다.
그리고, 파이프는 예외 영역 내에서 실행됩니다. 즉, 파이프가 예외를 던질 때 예외 계층에서 처리됩니다. 전역 예외 필터 및 현재 콘텍스트에 적용되는 모든 예외 필터를 포함합니다.
위의 내용을 고려할 때 예외가 파이프에 던져지면 이후에 어떤 컨트롤러 방식도 실행되지 않음을 분명히 해야합니다. 이러한 내용은 파이프가 예외를 발생시키게 된다면? 자동으로 Exception Filter에 의해 처리된다는 것입니다. 예외처리의 계층적 관리가 이루어진다는 것이고, 각각의 계층은 예외가 발생했을 때 이를 캡처하고 적절히 응답할 수 있습니다.
아래는 예외 처리가 이루어지는 과정입니다.
1. 컨트롤러가 요청을 받습니다.
2. 요청 데이터는 Pipes를 통해 유효성 검사 및 변환을 거칩니다.
3. Pipes에서 예외가 발생하면, 예외가 exceptions zone에 의해 캡처되고 Exception Filters에 전달됩니다.
4. Exception Filters는 적절한 HTTP 응답 코드와 메시지를 클라이언트에 반환합니다.
Client Request
|
V
Controllers ---> Pipes (Transform & Validate) ---> Services ---> Repositories
| |
| V
| Exception Filters (Handle Errors)
V
Client Response
잠깐 들여다 보는 NestJS의 계층 아키텍처
NestJS는 여러 계층으로 구성된 아키텍처를 따르고 있습니다. 여기서 계층(Layer)은 보통 다음과 같은 모듈이나 기능별로 구분할 수 있습니다.
Layer | Function |
Controllers | HTTP 요청을 받아들이고, 요청을 처리할 서비스에 전달합니다. |
Services | 비즈니스 로직을 수행합니다. 데이터베이스와 상호작용하거나 다른 서비스들과 통신할 수 있습니다. |
Repositories | 데이터베이스와의 직접적인 상호작용을 담당합니다. |
Pipes | 요청 데이터를 가공하거나 유효성 검사를 수행합니다. |
Guards | 요청이 처리되기 전에 특정 조건을 검사해 접근을 제어합니다. |
Interceptors | 요청이나 응답을 가로채 추가 작업을 수행합니다. |
Exception Filters | 애플리케이션 전반에서 발생하는 예외를 처리합니다. |
'Project > Nest.js' 카테고리의 다른 글
[번역] Passport란 무엇인가? (0) | 2024.08.31 |
---|---|
[번역] Guard란 무엇인가? (0) | 2024.08.29 |