Nodejs

 

1. gRPC 설치 (2025년)

 

1. 필수 패키지 설치

 

pnpm install @nestjs/microservices @grpc/grpc-js @grpc/proto-loader



  • @nestjs/microservices → NestJS에서 gRPC 클라이언트/서버 기능 제공

  • @grpc/grpc-js → Node.js 공식 gRPC 구현체 (네이티브 모듈 필요 없음)

  • @grpc/proto-loader → .proto 파일 로딩

 

 

2. proto 파일 생성

예: proto/hero.proto

syntax = "proto3";

package hero;

service HeroService {
  rpc FindOne (HeroById) returns (Hero) {}
}

message HeroById {
  int32 id = 1;
}

message Hero {
  int32 id = 1;
  string name = 2;
}

 

 

 

3. NestJS 서버 설정 (gRPC Provider)

main.ts

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { MicroserviceOptions, Transport } from '@nestjs/microservices';
import { join } from 'path';

async function bootstrap() {
  const app = await NestFactory.createMicroservice<MicroserviceOptions>(AppModule, {
    transport: Transport.GRPC,
    options: {
      package: 'hero',
      protoPath: join(__dirname, '../proto/hero.proto'),
    },
  });
  await app.listen();
}
bootstrap();

 

 

4. 서비스 구현

hero.service.ts

import { Injectable } from '@nestjs/common';

@Injectable()
export class HeroService {
  findOne(data: { id: number }) {
    return { id: data.id, name: 'Superman' };
  }
}

 

 

5. 모듈 등록

import { Module } from '@nestjs/common';
import { HeroService } from './hero.service';

@Module({
  providers: [HeroService],
})
export class AppModule {}

 

 

6. 클라이언트에서 호출

NestJS에서도 클라이언트를 만들 수 있고, 외부 Node.js/Go/Python 클라이언트에서도 호출할 수 있습니다.
NestJS 클라이언트 예제:

import { ClientGrpc, Client, Transport } from '@nestjs/microservices';
import { join } from 'path';
import { Injectable, OnModuleInit } from '@nestjs/common';

interface HeroService {
  findOne(data: { id: number }): any;
}

@Injectable()
export class HeroClient implements OnModuleInit {
  @Client({
    transport: Transport.GRPC,
    options: {
      package: 'hero',
      protoPath: join(__dirname, '../proto/hero.proto'),
    },
  })
  private client: ClientGrpc;

  private heroService: HeroService;

  onModuleInit() {
    this.heroService = this.client.getService<HeroService>('HeroService');
  }

  getHero() {
    return this.heroService.findOne({ id: 1 });
  }
}

 

 

✅ 정리하면:

 

  • NestJS에서는 npm으로 설치 (@nestjs/microservices, @grpc/grpc-js, @grpc/proto-loader)

  • proto 정의 후 NestJS Microservice Transport=GRPC 설정

  • 서비스 구현 후 클라이언트에서 호출 가능

 

 

 

 

 

2. gRPC 설치 방식 변화 (운영체제별 → 언어별)

 

1. 초기 (2015~2019)

  • **Node.js gRPC 패키지(grpc)**는 C++ 기반 네이티브 애드온을 사용.

  • 결과적으로 설치 시 OS마다 빌드 툴이 필요했음:

    • Windows → Visual Studio Build Tools, Python2, node-gyp 필수

    • Linux → gcc, make

    • macOS → Xcode Command Line Tools

  • 설치 중 "precompiled binary not found" 오류가 자주 발생 → 직접 빌드 필요.

  • 따라서 gRPC는 운영체제별 설치 가이드가 필수적이었음.

 

 

2. 전환기 (2018~2020)

  • 커뮤니티와 구글 내부에서 "운영체제 의존성을 줄이자"는 요구가 커짐.

  • grpc 패키지는 유지보수 비용이 크고, Node.js 새 버전이 나올 때마다 빌드 호환 문제가 발생.

  • 이에 따라 순수 JavaScript 기반 구현체 개발이 시작됨 → @grpc/grpc-js.

 

 

3. 현재 (2020~현재)

  • @grpc/grpc-js 정식 출시 → Node.js에서 네이티브 빌드 의존성이 사라짐.

  • 설치 방식 변화:

    • 예전: 운영체제별 빌드 툴 준비 → npm install grpc

    • 지금: 단순히 npm install @grpc/grpc-js @grpc/proto-loader

  • 따라서 gRPC 문서도 운영체제별 가이드 → 언어별 가이드로 개편.

  • Python, Go, .NET 등도 마찬가지로 "언어별 패키지 설치" 중심으로 단순화됨.

 

 

4. 정리

  • 변화 시점: 약 2019~2020년 사이

  • 이유: 네이티브 모듈의 OS별 빌드 문제, 유지보수 비용, 설치 오류 다발

  • 결과: 지금은 운영체제 상관없이, 언어별 설치 패키지만 사용하면 됨

 

 

 

 

 

3.@grpc/proto-loader vs protoc

 

1. @grpc/proto-loader

  • Node.js 런타임에서 .proto 파일을 읽어들이는 라이브러리

  • 실행 시점(runtime)에 .proto → JS 객체로 변환해서 gRPC 서버/클라이언트가 바로 사용 가능

  • 즉, 코드 생성 없이 동적 로딩

  • NestJS 예제에서 많이 쓰는 방식

 

import * as protoLoader from '@grpc/proto-loader';
import * as grpc from '@grpc/grpc-js';

const packageDef = protoLoader.loadSync('hero.proto', {});
const proto = grpc.loadPackageDefinition(packageDef);

 

 

2. protoc (Protocol Buffers Compiler)

 

  • 구글에서 제공하는 실행 파일 (C++ 기반 컴파일러)

  • .proto 파일을 언어별 소스 코드로 사전 컴파일해줌

    • 예: protoc --js_out=... --grpc-web_out=... hero.proto

  • TypeScript/JavaScript에서는 ts-proto, grpc-tools 같은 플러그인과 같이 쓰기도 함.

  • 즉, 정적 코드 생성 방식

 

 

✅차이 정리

 

 

 

 

NestJS 공식 문서나 예제에서는 보통 @grpc/proto-loader만 설치해서 런타임 로딩을 사용합니다.
✅ 하지만 TypeScript에서 타입 안전성을 높이고 싶다면 → protoc + ts-proto 조합을 많이 씁니다.

 

 

 

 

 

4.Windows에서 protoc 설치 방법 (2025년 기준)

 

Protocol Buffers Compiler(protoc)는 .proto 파일을 각 언어별 코드로 변환해주는 도구입니다. 윈도우 환경에서 설치하는 방법은 다음과 같습니다.

 

1. 최신 릴리스 다운로드

  1. GitHub의 공식 저장소로 이동: protocolbuffers/protobuf Releases

  2. 최신 버전의 protoc-<버전>-win64.zip 파일을 다운로드합니다.

    • 예: protoc-27.3-win64.zip

 

 

2. 압축 해제

  1. 다운로드한 ZIP 파일을 원하는 경로에 압축 해제합니다.

    • 예: C:\tools\protoc
      (폴더 안에는 bin, include 디렉토리가 있음)

 

 

3. 환경 변수 등록

  1. 시작 메뉴 → 환경 변수 편집 검색 → PATH 편집

  2. C:\tools\protoc\bin 경로를 추가

 

 

4. 설치 확인

PowerShell 또는 CMD에서 다음 명령 실행:

protoc --version

정상적으로 설치되었다면 예를 들어:


 

libprotoc 27.3

이 출력됩니다.

 

 

5. 사용 예시

예: hero.proto 파일을 JavaScript/TypeScript 코드로 변환

  • JavaScript 코드 생성

 

protoc --js_out=import_style=commonjs,binary:./generated --grpc_out=./generated --plugin=protoc-gen-grpc=node_modules/.bin/grpc_tools_node_protoc_plugin hero.proto

 

TypeScript 코드 생성(ts-proto 플러그인 사용)
 

protoc --plugin=protoc-gen-ts=node_modules/.bin/protoc-gen-ts --ts_out=./generated hero.proto

 

6. 요약

  • protoc = .proto를 코드로 변환하는 컴파일러

  • 윈도우 설치 방법: GitHub 릴리스 ZIP 다운로드 → 압축 해제 → PATH 등록 → protoc --version 확인

  • NestJS/Node.js에서 타입 안전성을 원한다면 protoc + ts-proto 조합 사용을 권장

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

about author

PHRASE

Level 60  라이트

하나의 가정을 원만하게 다스린다는 것은 한 나라를 통제하는 것보다 더 어려운 일이다. -몽테뉴

댓글 ( 0)

댓글 남기기

작성