인터 셉터
NestJs에는 인터셉터라는것이 있다.
처음에는 미들웨어의 다른 용어라고 생각했는데 미들웨어는 따로 있다.
미들웨어와 비슷해보이지만 그림 처럼 요청이 핸들러로 들어가기 전에 요청을 가로채거나,
응답하기 전에 가로채서 변형이 가능하다.
Nest의 생명주기에서 미들웨어가 가장 먼저 실행되기 때문에 요청 부분은 미들웨어를 쓰지 않을까,
응답할때 응답을 변형하거나 로그를 찍는등의 역할을 하면 좋겠다 정도의 생각만 들었다.
아직 이 인터셉터라는 개념의 유용함과 편리함에 대해 느껴보지 못해서 정확히는 감이 안잡힌다.
인터셉터 만들어보기
import { CallHandler, ExecutionContext, NestInterceptor } from "@nestjs/common";
import { map, Observable } from "rxjs";
export class userInterceptor implements NestInterceptor{
intercept(context: ExecutionContext, next: CallHandler<any>): Observable<any> | Promise<Observable<any>> {
const req = context.switchToHttp().getRequest();
console.log('Request data:',req.body);
return next
.handle()
.pipe(
map(data =>{
console.log('Original Response data:', data);
const modifiedData ={
...data,
bug: "This is Modified",
};
return modifiedData;
})
);
}
}
인터셉터는 NestInerceptor 인터페이스를 상속 받아서 만든다.
Intercept라는 함수를 구현해야 하는데,
context 는 현재 요청에 대한 메타데이터를 제공한다.
코드에보면 context.switchToHttp().getRequest() 를 통해 리퀘스트 변수를 가져왔다.
next는 다음 처리 단계로 요청을 전달하는 역할을 한다.
intercept 함수의 반환타입은 Observable이다.
CallHandler 인터페이스에 들어가보면 handle함수는 Observable을 리턴한다.
그래서 intercept 함수에는 next.handle() 만 리턴해주어도 되지만, rxjs를 통해 데이터 변환과 같은 추가적인 작업을 할 수 있다.
pipe함수는 안에서 rxjs를 사용해 Observable의 여러 연산자들을 체이닝 할 수 있는 역할을 한다.
C#의 링큐로 예를 들면 where(조건).Select(어쩌구) 이런식으로 연속되게 함수를 쓸 수 있는 공간을 만들어 준다고 이해하면 될 것 같다.
map 연산자는 데이터를 변환하는 역할을 한다.
난 안에서 응답을 가져와서 바꾸는 작업을 했다.
@UseInterceptors(userInterceptor)
@Post('create')
createUser(@Body() body: createUserDto) {
return this.userService.createUser(body);
인터셉터를 사용하기 위해선 UseInterceptors 데코레이터를 사용하면 된다.
컨트롤러로 가서 인터셉터를 추가해주었다.
제대로 잘 작동한다.
'서버 > NestJs' 카테고리의 다른 글
[NestJS] TypeORM 과 동적 모듈 (0) | 2024.10.24 |
---|---|
[NestJs] 데코레이터,컨트롤러,서비스,모듈 (0) | 2024.10.23 |
[NestJs] NestJs 시작하기 (2) | 2024.10.23 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!