Nodejs

 

 NestJS로 gRPC 기반 Product Microservice 구축하기

 

이번 글에서는 NestJS에서 gRPC를 활용해 ProductMicroservice를 구축하는 과정을 정리합니다. 이전에 UserMicroservice를 gRPC로 전환했던 경험을 바탕으로, 동일한 방식으로 Product 도메인을 마이크로서비스로 분리하고 연결합니다.

 

환경 설정

.env 파일에 gRPC URL을 정의합니다:

GRPC_URL=product:3002

 

gRPC 서버 설정

main.ts에서 gRPC 서버를 설정합니다:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { MicroserviceOptions, Transport } from '@nestjs/microservices';
import { ProductMicroservice } from '@app/common';
import { join } from 'path';
import { ConfigService } from '@nestjs/config';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  const configService = app.get(ConfigService);

  app.connectMicroservice<MicroserviceOptions>({
    transport: Transport.GRPC,
    options: {
      package: ProductMicroservice.protobufPackage,
      protoPath: join(process.cwd(), 'proto/product.proto'),
      url: configService.getOrThrow('GRPC_URL'),
    },
  });

  await app.startAllMicroservices();
}
bootstrap();

 

 

 컨트롤러 구현

gRPC 인터페이스에 맞춰 컨트롤러를 구현합니다. ProductServiceController를 구현하고, 반환 타입을 proto 정의에 맞게 조정합니다.

@Controller('product')
export class ProductController
  implements ProductMicroservice.ProductServiceController
{
  constructor(private readonly productService: ProductService) {}

  async createSamples() {
    console.log('????product microservice Controller createSamples');
    const resp = await this.productService.createSamples();

    return {
      success: resp,
    };
  }

  async getProductsInfo(@Payload() data: GetProductsInfo) {
    console.log('????getProductsInfo');
    const resp = await this.productService.getProductsInfo(data.productIds);

    return {
      products: resp,
    };
  }
}

 주의할 점

  • gRPC에서 반환 타입은 proto 정의에 맞춰야 하며, 단순 boolean이나 배열을 직접 반환하면 타입 오류가 발생합니다.
  • 예를 들어 createSamples()는 { success: boolean } 형태로 반환해야 하며, getProductsInfo()는 { products: Product[] } 형태로 반환해야 합니다.

 

 

 

 

 

 

 

 

 

 

 

about author

PHRASE

Level 60  라이트

아이는 아버지를 존경하지 않으면 안 된다. -탈무드

댓글 ( 0)

댓글 남기기

작성