gRPC 함수 실행하기 - 45.GatewayMicroservice 작업하기
1. Gateway 내부 서비스 구조
게이트웨이는 크게 세 가지 마이크로서비스와 연결됩니다:
ProductService → 상품 관련 처리
OrderService → 주문 생성 처리
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 마이크로서비스 호출로 변환하는 중추적 역할을 하게 되었습니다.













댓글 ( 0)
댓글 남기기