Nodejs

 

gRPC 함수 실행하기 - 45.GatewayMicroservice 작업하기

 

 

1. Gateway 내부 서비스 구조

게이트웨이는 크게 세 가지 마이크로서비스와 연결됩니다:

  1. ProductService → 상품 관련 처리

  2. OrderService → 주문 생성 처리

  3. AuthService → 회원가입 / 로그인 인증 처리

아래 코드에서 하나씩 살펴보겠습니다.

 

 

 

2. ProductService (상품 관련)

import { PRODUCT_SERVICE, ProductMicroservice } from '@app/common';
import { Inject, Injectable, OnModuleInit } from '@nestjs/common';
import { ClientGrpc } from '@nestjs/microservices';
import { lastValueFrom } from 'rxjs';

@Injectable()
export class ProductService implements OnModuleInit {
  productService: ProductMicroservice.ProductServiceClient;

  constructor(
    @Inject(PRODUCT_SERVICE)
    private readonly productMicroservice: ClientGrpc,
  ) {}

  onModuleInit() {
    this.productService =
      this.productMicroservice.getService<ProductMicroservice.ProductServiceClient>(
        'ProductService',
      );
  }

  async createSamples() {
    console.log('????gateway createSamples');
    return lastValueFrom(this.productService.createSamples({}));
  }
}

 

주요 포인트:

  • gRPC를 통해 ProductService 인터페이스를 불러와 직접 사용합니다.

  • createSamples()는 상품 더미 데이터를 만드는 API인데, 기존 메시지 방식(send) 대신 gRPC 호출로 전환되었습니다.

 

 

 

 

 

 

 

 

 

3. OrderService (주문 처리)

import {
  ORDER_SERVICE,
  OrderMicroservice,
  UserMeta,
  UserPayloadDto,
} from '@app/common';
import { Inject, Injectable, OnModuleInit } from '@nestjs/common';
import { ClientGrpc } from '@nestjs/microservices';
import { CreateOrderDto } from './dto/create-order.dto';

@Injectable()
export class OrderService implements OnModuleInit {
  orderService: OrderMicroservice.OrderServiceClient;

  constructor(
    @Inject(ORDER_SERVICE) private readonly orderMicroservice: ClientGrpc,
  ) {}

  onModuleInit() {
    this.orderService =
      this.orderMicroservice.getService<OrderMicroservice.OrderServiceClient>(
        'OrderService',
      );
  }

  async createOrder(
    createOrderDto: CreateOrderDto,
    userPayload: UserPayloadDto,
  ) {
    return this.orderService.createOrder({
      ...createOrderDto,
      meta: { user: userPayload },
    });
  }
}

 

주요 포인트:

  • OrderServiceClient를 gRPC로 주입받아 사용.

  • 주문을 생성할 때 **유저 메타 정보(UserPayloadDto)**를 함께 넘겨, 추후 결제/배송 과정에서도 추적이 가능하도록 설계.

 

 

 

 

4. AuthService (회원 인증)

import { USER_SERVICE, UserMicroservice } from '@app/common';
import { Inject, Injectable, OnModuleInit } from '@nestjs/common';
import { ClientGrpc } from '@nestjs/microservices';
import { lastValueFrom } from 'rxjs';
import { RegisterDto } from './dto/register.dto';

@Injectable()
export class AuthService implements OnModuleInit {
  authService: UserMicroservice.AuthServiceClient;

  constructor(
    @Inject(USER_SERVICE)
    private readonly userMicroservice: ClientGrpc,
  ) {}

  onModuleInit() {
    this.authService =
      this.userMicroservice.getService<UserMicroservice.AuthServiceClient>(
        'AuthService',
      );
  }

  register(token: string, registerDto: RegisterDto) {
    console.log(' *** gateway registerUser token:', token);
    return lastValueFrom(
      this.authService.registerUser({ ...registerDto, token }),
    );
  }

  login(token: string) {
    return lastValueFrom(this.authService.loginUser({ token }));
  }
}

 

주요 포인트:

  • AuthServiceClient를 통해 회원가입(registerUser)과 로그인(loginUser) 호출 가능.

  • API Gateway에서 인증을 직접 처리하는 대신, UserMicroservice에 위임하여 **관심사 분리(Separation of Concerns)**를 달성.

 

 

5. 정리

이번 강의에서 게이트웨이는 다음과 같이 변화했습니다:

  • ClientProxy → ClientGrpc 전환

  • gRPC 인터페이스를 직접 주입받아 사용

  • Product / Order / Auth 세 가지 핵심 도메인 API를 Gateway에 집약

즉, Gateway는 단순 라우팅 계층이 아니라,
외부 API 요청을 내부 gRPC 마이크로서비스 호출로 변환하는 중추적 역할을 하게 되었습니다.

 

 

 

 

about author

PHRASE

Level 60  라이트

물이 깊을수록 소리가 없다 , 사람이 잘날수록 잘 난 체하거나 떠벌리거나 하지 않는다는 말.

댓글 ( 0)

댓글 남기기

작성