Nodejs

 

gRPC 함수 실행하기 -  46. 마무리 및 테스트하기 – 전체 플로우 점검

 

 

 

1. 들어가며

이제까지 User, Product, Order, Payment, Notification, Gateway 마이크로서비스를

gRPC 기반으로 하나씩 리팩터링해왔습니다. 이번 마지막 강의에서는 전체 서비스를 연결하고, 인증 미들웨어와 통합 테스트 과정을 통해 실제 서비스 흐름을 확인합니다.

 

 

2. 애플리케이션 초기화

테스트 실행 전, NestJS 앱을 초기화합니다.

await app.init();

???? 여기서 app.init()은 모든 모듈, 마이크로서비스 클라이언트, 미들웨어를 로딩하여 실제 서비스와 동일한 실행 환경을 만들어줍니다.

 

 

3. BearerTokenMiddleware 구현

게이트웨이에서 외부 요청이 들어오면, JWT 토큰 검증을 거쳐야 합니다. 이를 담당하는 것이 BearerTokenMiddleware 입니다.

import { USER_SERVICE, UserMicroservice } from '@app/common';
import {
  Inject,
  Injectable,
  NestMiddleware,
  OnModuleInit,
  UnauthorizedException,
} from '@nestjs/common';
import { ClientGrpc } from '@nestjs/microservices';
import { lastValueFrom } from 'rxjs';

@Injectable()
export class BearerTokenMiddleware implements NestMiddleware, OnModuleInit {
  authService: UserMicroservice.AuthServiceClient;

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

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

  async use(req: any, res: any, next: (error?: any) => void) {
    // 1) Authorization 헤더에서 토큰 추출
    const token = this.getRawToken(req);

    if (!token) {
      next();
      return;
    }

    // 2) User 서비스에 토큰 검증 요청
    const payload = await this.verifyToken(token);

    // 3) 검증된 payload를 req.user에 저장
    req.user = payload;
    next();
  }

  getRawToken(req: any): string | null {
    const authHeader = req.headers['authorization'];
    return authHeader;
  }

  async verifyToken(token: string) {
    const result = await lastValueFrom(
      this.authService.parseBearerToken({ token }),
    );
    return result;
  }
}

???? 주요 포인트:

  1. 토큰 추출: Authorization 헤더에서 Bearer <token> 값을 가져옴.

  2. 토큰 검증: UserMicroservice의 AuthService.parseBearerToken() 호출.

  3. Payload 저장: req.user에 저장하여 이후 컨트롤러/서비스에서 활용.

 

 

4. 컨트롤러를 gRPC와 연결

@NotificationMicroservice.NotificationServiceControllerMethods() 데코레이터를 통해, Notification 마이크로서비스 컨트롤러를 gRPC와 연결합니다.

즉, 결제 완료 시 알림(Notification) 을 gRPC로 호출하여 전송할 수 있습니다.

각 마이크로서비스들을 이와 같이 작업 

 

 

 

5. 전체 시나리오 테스트

  1. 회원가입 및 로그인 → JWT 토큰 획득.

  2. 토큰을 헤더에 포함해 요청 → Gateway에서 BearerTokenMiddleware가 검증 수행.

  3. 상품 조회 및 주문 생성 → OrderMicroservice로 gRPC 호출.

  4. 결제 처리 → PaymentMicroservice로 위임.

  5. 알림 발송 → NotificationMicroservice가 트리거됨.

 

 

6. 정리

전체 마이크로서비스가 하나의 큰 그림으로 이어졌습니다.

  • app.init()으로 통합 환경 구성

  • BearerTokenMiddleware를 통한 인증 처리

  • Notification 연동으로 사용자 경험 완성

  •  

 이제 모든 마이크로서비스가 gRPC 기반으로 연결되었고, 실제 요청이 들어왔을 때

회원가입 → 로그인 → 주문 → 결제 → 알림 흐름을 정상적으로 테스트할 수 있게 되었습니다.

 

 

 

 

about author

PHRASE

Level 60  라이트

새도 가지를 가려서 앉는다 , 처신을 가려서 하라는 말.

댓글 ( 0)

댓글 남기기

작성