Skip to content

Commit

Permalink
nestjs interceptor
Browse files Browse the repository at this point in the history
  • Loading branch information
JadenKim-dev committed Jul 1, 2023
1 parent 3ec2da4 commit 36749a5
Showing 1 changed file with 58 additions and 0 deletions.
58 changes: 58 additions & 0 deletions Spring/NestJS/인터셉터.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# 인터셉터

## 인터셉터란?

NestJS의 인터셉터는 메서드 실행 전/후에 추가적으로 로직을 붙여서, 함수에서 반환된 결과를 변환하거나 기능을 확장하는데 사용한다.

## 예시 코드

이번 프로젝트에서 사용한 예시 코드는 아래와 같다.

먼저 Interceptor를 사용하는 부분의 코드는 아래와 같이 작성할 수 있다.
로그인 handler에서는 인증 처리를 마치고, Token 정보를 반환한다.

```ts
@UseInterceptors(SetTokenCookieInterceptor)
async login(@RequestUser() user: User): Promise<Token> {
const token = await this.authService.jwtSign(user);
return token;
}
```

`UseInterceptors` 어노테이션을 통해 해당 메서드에서 Interceptor를 사용한다고 선언한다.
인증 결과인 Token을 반환한다는 점을 기억하자.

이제 Interceptor의 코드는 아래와 같이 작성할 수 있다.

```ts
@Injectable()
export class SetTokenCookieInterceptor implements NestInterceptor {
constructor(private readonly configService: ConfigService) {}

intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
const res = context.switchToHttp().getResponse<Response>();
return next.handle().pipe(
map((token: Token): LoginResponseDto => {
res.cookie("token", token.value, {
httpOnly: true,
maxAge: +this.configService.get("TOKEN_EXPIRATION_TIME"),
});
return LoginResponseDto.fromJwtSignResult(token);
})
);
}
}
```

`intercept` 메서드 안에서 `next.handle()`을 호출하면 interceptor를 붙인 원본 메서드를 호출하게 된다.
해당 메서드를 호출한 결과는 연달아 호출한 `pipe` 메서드 내에서 `map` 메서드에서 받아서 사용할 수 있다.
(pipe 메서드의 경우 Rxjs에서 사용하는 메서드이다.)

위 인터셉터에서는 전달받은 Token 객체에서 토큰 값을 추출해서, 이를 쿠키에 넣어주고 있다.
intercept 메서드에서 매개변수로 받는 context를 이용해서 response를 가져올 수 있고, 이를 이용해서 쿠키에 값을 넣을 수 있다.

최종적으로 map 메서드에서는 받은 token 객체를 Response DTO 형태로 변환해서 반환하므로써, 응답 형식을 결정하고 있다.

## 마치며

인터셉터에는 기본적으로 RxJS의 인터페이스가 사용되고 있기 떄문에, 더 잘 활용하기 위해서는 RxJS에 대한 학습이 필요할 것 같다.

0 comments on commit 36749a5

Please sign in to comment.