-
NestJS 기본강의 - 2. PipeNestJS/NestJS 기본강의 2022. 7. 7. 18:02
Pipe은 무엇인가? ( 필터같음 )
- 파이프는 @Injectable () 데코레이터로 주석이 달린 클래스이다
- 파이프는 data transformation과 data validation을 위해서 사용
- 파이프는 컨트롤러 경로 처리기에 의해 처리되는 인수에 대해 작동
- Nest는 메소드가 호출되기 직전에 파이프를 삽입하고 파이프는 메소드로 향하는 인수를 수신하고 이에 작동
Data Transformation
- 입력 데이터를 원하는 형식으로 변환 ( 예 : 문자열에서 정수로 )
- 만약 숫자를 받길 원하는데 문자열 형식으로 온다면 파이프에서 자동으로 숫자로 변경
Data validation
- 입력 데이터를 평가하고 유효한 경우 변경되지 않은 상태로 전달하면 된다
- 그렇지 않으면 데이터가 올바르지 않을 때 예외를 발생
파이프는 Data Transformation, Data validation 두가지 모든 경우에서..
- 라우트 핸들러 ( Route Handler ) 가 처리하는 인수에 대해서 작동
- 그리고 파이프는 메소드를 바로 직전에 작동해서 메소드로 향하는 인수에 대해서 변환할 것이 있으면 변환하고 유효성 체크를 위해서 호출
PIPE 사용하는 법(Binding Pipes)
- 파이프를 사용하는 방법(Binding pipes)은 세가지로 나눠진다.
- Handler-level Pipes, Parameter-level Pipes, Global-level Pipes
Handler-level Pipes
- 핸들러 레벨에서 @UsePipes() 데코레이터를 이용해서 사용할 수 있다
- 이 파이프는 모든 파라미터에 적용
@Post() @UsePipes(pipe) createBoard( @Body('title') title, @Body('description') description ){ }
Parameter-level Pipes
- 파라미터 레벨의 파이프이기에 특정한 파라미터에게만 적용이 되는 파이프이다
@Post() createBoard( @Body('title', ParameterPipe) title, @Body('description') description ){ }
Global Pipes
- 글로벌 파이프로서 애플리케이션 레벨의 파이프이다
- 클라이언트에서 들어오는 모든 요청에 적용
- 가장 상단 영역인 main.ts에 넣어주면 된다.
async function bootstrap() { const app = await NestFactory.create(AppModule); app.useGlobalPipes(GlobalPipes); await app.listen(3000); } bootstrap();
Built-in Pipes
- Nest JS에 기본적으로 사용할 수 있게 만들어 놓은 6가지의 파이프가 있다
ㆍValidationPipe
ㆍParseIntPipe : 문자열 요청받으면 에러
ㆍParseBoolPipe
ㆍParseArrayPipe
ㆍParseUUIDPipe
ㆍDefaultValuePipe
파이프 생성 시 필요한 모듈
- class-validator, class-transformer
npm install class-validator class-transformer --save
커스텀 파이프 구현 방법
- 먼저 PipeTransform이란 인터페이스를 새롭게 만들 커스텀 파이프에 구현해줘야한다.
- 이 PipeTransform 인터페이스는 모든 파이프에서 구현해줘야하는 인터페이스
- 이것과 함께 모든 파이프는 transform() 메서드를 필요
- 이 메서드는 NestJS가 인자(arguments)를 처리하기 위해서 사용
export class BoardStatusValidationPipe implements PipeTransform { transform(value:any, metadata: ArgumentMetadata) { console.log('value', value); console.log('metadata',metadata); return value; } }
transform() 메서드
- 이 메서드는 두개의 파라미터를 가진다.
- 첫번째 파라미터는 처리가 된 인자의 값(value)이며
두번째 파라미터는 인자에 대한 메타 데이터를 포함한 객체이다
- transform()메서드에서 Return 된 값은 Route 핸들러로 전해진다
- 만약 예외(Exception)가 발생하면 클라이언트로 바로 전해진다.
* readonly class property
- 접두사(prefix) readonly는 속성을 일기 전용으로 만드는 데 사용
- 읽기 전용 멤버는 클래스 외부에서 액세스 할 수 있지만 해당 값을 변경할 수는 없다.
'NestJS > NestJS 기본강의' 카테고리의 다른 글
NestJS 기본강의 - 5. 권한 & 로그 & 설정 (0) 2022.07.11 NestJS 기본강의 - 4. 인증 (0) 2022.07.08 NestJS 기본강의 - 3. TypeORM (0) 2022.07.08 NestJS 기본강의 - 1. 시작 (0) 2022.07.07