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[] } 형태로 반환해야 합니다.













댓글 ( 0)
댓글 남기기