개발/Node & Javascript

Nest.js 탐험기 7 - microservice (grpc) 를 사용해보자 - 인터셉터

말고기 2022. 3. 6. 23:58
728x90
반응형

개요

  • 공통된 로직을 처리해야 할 경우 interceptor를 활용할 수 있다.
  • nest.js grpc의 경우에도 interceptor를 활용할 수 있게 제공이 되는데, 이를 활용해 보도록 하자.

예제

1. Interceptor 생성

아래와 같이 interceptor에 대한 code를 작성해준다.

@Injectable()
export class GrpcLoggingInterceptor implements NestInterceptor {
  private readonly logger = new Logger(GrpcLoggingInterceptor.name);

  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    this.logger.log('Before...');
    const rpcContext = context.switchToRpc(); // context를 rpc로 변경한다.
    const metadata: Metadata = rpcContext.getContext(); // context data를 가져온다. rpc의 경우 metadata를 반환한다.
    const data = rpcContext.getData(); // data object를 반환한다.
    this.logger.log(`${JSON.stringify(metadata.toJSON())}`);
    this.logger.log(`${metadata.get('a')[0]}`); // metadata의 value는 array로 가져오게 된다.
    this.logger.log(`${JSON.stringify(data)}`);
    const now = Date.now();

    return next
      .handle()
      .pipe(
        tap(() => this.logger.log(`After... ${Date.now() - now}ms`)),
      );
  }
}

2. Interceptor 등록

interceptor의 경우 controller 레벨에서도 등록가능하고, application level 단위로 등록이 가능하다.
이번 예제에서는 controller에 등록을 해두도록 하자.

@UseInterceptors(GrpcLoggingInterceptor)
@Controller()
export class HeroesController {
  @GrpcMethod('HeroesService', 'FindOne')
  findOne(data: HeroById, metadata?: Metadata, call?: ServerUnaryCall<any,any>): Hero {
    //...
  }
  //  ...
//

3. 결과 확인

  • 아래와 같이 로깅 데이터를 확인할 수 있다.
  • 주의점은 metadata의 경우 array로 오는 것을 주의만 하면 된다.
[Nest] 19964  - 03/06/2022, 11:56:44 PM     LOG [GrpcLoggingInterceptor] Before...
[Nest] 19964  - 03/06/2022, 11:56:44 PM     LOG [GrpcLoggingInterceptor] {"a":["b"],"malgogi":["3"],"user-agent":["grpc-node/1.24.7 grpc-c/8.0.0 (osx; chttp2; ganges)"]}
[Nest] 19964  - 03/06/2022, 11:56:44 PM     LOG [GrpcLoggingInterceptor] b
[Nest] 19964  - 03/06/2022, 11:56:44 PM     LOG [GrpcLoggingInterceptor] {"id":1}

출처

728x90
반응형