Nodejs

 

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는 다음과 같은 기능을 수행:

    • 요청 라우팅: 클라이언트 요청을 해당 마이크로서비스로 전달.

    • 보안: 인증/인가 처리.

    • 통합 지점: 여러 서비스의 응답을 조합하여 클라이언트에 반환.

 

 

 

 

about author

PHRASE

Level 60  라이트

동냥은 혼자 간다 , 무엇을 얻는 일에 여럿이 가면 몫이 적어지게 마련이라는 말.

댓글 ( 0)

댓글 남기기

작성