NestJS로 gRPC 기반 Payment Microservice 구축하기
이번 글에서는 NestJS에서 gRPC를 활용해 PaymentMicroservice를 구축하는 과정을 정리합니다. 이전에 User, Product 마이크로서비스를 gRPC로 전환했던 흐름을 그대로 따라가며, 결제 도메인을 마이크로서비스로 분리하고 연결합니다.
1.환경 설정
.env 파일에 gRPC URL을 정의합니다:
GRPC_URL=payment:3001
2.gRPC 서버 설정
main.ts에서 gRPC 서버를 설정합니다:
import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { MicroserviceOptions, Transport } from '@nestjs/microservices'; import { join } from 'path'; import { ConfigService } from '@nestjs/config'; import { PaymentMicroservice } from '@app/common'; async function bootstrap() { const app = await NestFactory.create(AppModule); const configService = app.get(ConfigService); app.connectMicroservice<MicroserviceOptions>({ transport: Transport.GRPC, options: { package: PaymentMicroservice.protobufPackage, protoPath: join(process.cwd(), 'proto/payment.proto'), url: configService.getOrThrow('GRPC_URL'), }, }); await app.startAllMicroservices(); } bootstrap();
3.클라이언트 모듈 설정
AppModule에서 Notification Microservice에 연결하기 위한 클라이언트 설정을 추가합니다:
ClientsModule.registerAsync({ clients: [ { name: NOTIFICATION_SERVICE, useFactory: (configService: ConfigService) => ({ transport: Transport.GRPC, options: { package: NotificationMicroservice.protobufPackage, protoPath: join(process.cwd(), 'proto/notification.proto'), url: configService.getOrThrow('GRPC_URL'), }, }), inject: [ConfigService], }, ], isGlobal: true, })
4. 컨트롤러 구현
gRPC 인터페이스에 맞춰 컨트롤러를 구현합니다. PaymentServiceController를 구현하고, 반환 타입을 proto 정의에 맞게 조정합니다.
@Controller() export class PaymentController implements PaymentMicroservice.PaymentServiceController { constructor(private readonly paymentService: PaymentService) {} async makePayment(payload: PaymentMicroservice.MakePaymentRequest) { console.log('????PaymentController makePayment', payload); return this.paymentService.makePayment({ ...payload, paymentMethod: payload.paymentMethod as PaymentMethod, }); } }
주의할 점
- paymentMethod는 enum 타입으로 정의되어 있으므로, as PaymentMethod로 명시적 캐스팅이 필요합니다.
- gRPC에서 enum은 문자열로 전달되기 때문에, 클라이언트에서 전송 시 정확한 enum 값으로 보내야 합니다.
댓글 ( 0)
댓글 남기기