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)
댓글 남기기