NestJS

In NestJS's microservice, let it fix that cannot refer another microservice (2)

kahnco 2023. 4. 8. 02:37

지난 글에서, NestJS 프레임워크의 microservice에서 다른 microservic를 참조하려고 할때 module init이 정상적으로 이뤄지지 않는 이슈가 있다고 설명했습니다.

 

해당 글을 작성한 이후에 NestJS의 INestApplication 쪽을 추가적으로 찾아보다가 아래 문서에서 INestApplicationContext 인터페이스를 inherit 하는 인터페이스가 2개 있다는 것을 발견했습니다.

http://nestjs-doc.exceptionfound.com/interfaces/inestapplicationcontext.html

 

하나는 INestApplication이고 다른 하나는 INestMicroservice 였습니다.

 

INestApplication은 일반적인 monolisic 형태의 웹 앱을 제공하는 application 객체의 인터페이스인 것은 알겠는데, INestMicroservice는 처음보는 인터페이스였습니다.

 

하지만 뭔가 네이밍에서 microservice 인스턴스를 띄워서 가동시키는 것 같은 인터페이스인 것 같은 느낌이 들었습니다.

 

그래서 기존 server(microservice를 제공하는 사이드)의 main.ts를 INestMicroservice로 application 객체를 생성하도록 수정해보았습니다.

 

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { userGrpcClientOptions } from './user/protos/user-grpc.option';

async function bootstrap() {
  // 새롭게 수정한 application 객체 생성 코드
  const app = await NestFactory.createMicroservice(
    AppModule,
    userGrpcClientOptions,
  );
  await app.listen();

  // 기존에 사용하던 application 객체 생성 코드
  // const app = await NestFactory.create(AppModule);
  // await app.listen(50051);
  // await app.connectMicroservice(userGrpcClientOptions);
  // await app.startAllMicroservices();
}
bootstrap();

 

그리고, client이자 API Gateway 역할을 하던 프로젝트의 main.ts를 INestApplication으로 application 객체를 생성하도록 수정해주었습니다.

 

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { accoGrpcClientOptions } from './acco/protos/acco-grpc.option';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
}
bootstrap();

 

위와 같이 수정하고 Postman으로 테스트해본 결과, 너무나도 정상적으로 돌아가는 NestJS Application을 확인할 수 있었습니다.

 

이전 글에서는 Server 쪽에서 INestApplication으로 객체를 생성하고 강제로 포트를 열어서 통신을 가능하는 편법에 가까운 방법을 기술했으나, 지금 작성 중인 솔루션이 훨씬 더 NestJS의 지향점에 맞는 솔루션인 것 같습니다.

 


글을 작성한 이후에, 다시 한번 NestJS 공식 문서의 microservice 파트를 찾아보다가... overview에서 다음과 같은 내용을 발견했습니다.

 

허...

To instantiate a microservice, use the createMicroservice() method of the NestFactory class.

 

그렇습니다... 이미 공식문서는 정답을 알려주고 있었고, gRPC 프로토콜을 사용하기 위해서 overview는 건너뛰고 gRPC만 봤던 무지한 개발자는 뻘짓을 하고 있었던 거였습니다...

 

역시 공식문서만한 것이 없고, 읽을거면 제대로 다 읽어야한다는 것을 오늘도 몸소 체감했습니다...

반응형