1. AppModule 설정
@nestjs/common, @nestjs/microservices, @nestjs/config 등을 활용해 모듈을 구성.
ConfigModule.forRoot로 환경 변수 검증 스키마를 설정:
HTTP_PORT
USER_HOST, USER_TCP_PORT
PRODUCT_HOST, PRODUCT_TCP_PORT
ORDER_HOST, ORDER_TCP_PORT
ClientsModule.registerAsync를 이용하여 gRPC 클라이언트를 서비스별로 등록:
USER_SERVICE → user.proto
PRODUCT_SERVICE → product.proto
ORDER_SERVICE → order.proto
각 서비스는 ConfigService를 통해 *_GRPC_URL 환경 변수를 가져와 연결.
app.module.ts
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common'; import { OrderModule } from './order/order.module'; import { ProductModule } from './product/product.module'; import { AuthModule } from './auth/auth.module'; import { ClientsModule, Transport } from '@nestjs/microservices'; import { ORDER_SERVICE, OrderMicroservice, PRODUCT_SERVICE, ProductMicroservice, USER_SERVICE, UserMicroservice, } from '@app/common'; import { ConfigModule, ConfigService } from '@nestjs/config'; import * as Joi from 'joi'; import { BearerTokenMiddleware } from './auth/middleware/bearer-token.middleware'; import { join } from 'path'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, validationSchema: Joi.object({ HTTP_PORT: Joi.number().required(), USER_HOST: Joi.string().required(), // ✅ 추가 USER_TCP_PORT: Joi.number().required(), // ✅ 추가 PRODUCT_HOST: Joi.string().required(), // ✅ 추가 PRODUCT_TCP_PORT: Joi.number().required(), // ✅ 추가 ORDER_HOST: Joi.string().required(), // ✅ 추가 ORDER_TCP_PORT: Joi.number().required(), // ✅ 추가 }), }), ClientsModule.registerAsync({ clients: [ { name: USER_SERVICE, useFactory: (configService: ConfigService) => ({ transport: Transport.GRPC, options: { package: UserMicroservice.protobufPackage, protoPath: join(process.cwd(), 'proto/user.proto'), url: configService.getOrThrow('USER_GRPC_URL'), }, }), inject: [ConfigService], }, { name: PRODUCT_SERVICE, // ✅ 추가 useFactory: (configService: ConfigService) => ({ transport: Transport.GRPC, options: { package: ProductMicroservice.protobufPackage, protoPath: join(process.cwd(), 'proto/product.proto'), url: configService.getOrThrow('PRODUCT_GRPC_URL'), }, }), inject: [ConfigService], }, { name: ORDER_SERVICE, useFactory: (configService: ConfigService) => ({ transport: Transport.GRPC, options: { package: OrderMicroservice.protobufPackage, protoPath: join(process.cwd(), 'proto/order.proto'), url: configService.getOrThrow('ORDER_GRPC_URL'), }, }), inject: [ConfigService], }, ], isGlobal: true, }), OrderModule, ProductModule, AuthModule, ], }) export class AppModule implements NestModule { configure(consumer: MiddlewareConsumer) { consumer.apply(BearerTokenMiddleware).forRoutes('order'); } }
.env
HTTP_PORT=3000 USER_HOST=user USER_TCP_PORT=3001 USER_GRPC_URL=user:3001 PRODUCT_HOST=product PRODUCT_TCP_PORT=3001 PRODUCT_GRPC_URL=product:3001 ORDER_HOST=order ORDER_TCP_PORT=3001 ORDER_GRPC_URL=order:3001 PAYMENT_HOST=payment PAYMENT_TCP_PORT=3001 PAYMENT_GRPC_URL=payment:3001
2. 인증 미들웨어 적용
BearerTokenMiddleware를 구현하여 JWT 인증을 처리.
AppModule의 configure 메서드에서 다음과 같이 설정:
consumer.apply(BearerTokenMiddleware).forRoutes('order');
즉, Order 관련 API 요청은 반드시 인증 토큰 검증 과정을 거침.
3. Gateway의 역할
클라이언트 → Gateway → (gRPC) → User/Product/Order 서비스 흐름으로 동작.
API Gateway는 다음과 같은 기능을 수행:
요청 라우팅: 클라이언트 요청을 해당 마이크로서비스로 전달.
보안: 인증/인가 처리.
통합 지점: 여러 서비스의 응답을 조합하여 클라이언트에 반환.
댓글 ( 0)
댓글 남기기