🌐 웹개발

gRPC

gRPC Remote Procedure Call

Google의 고성능 RPC 프레임워크. Protocol Buffers 사용. HTTP/2 기반.

상세 설명

gRPC(gRPC Remote Procedure Call)는 Google이 개발한 고성능 RPC 프레임워크입니다. Protocol Buffers(protobuf)를 기본 직렬화 포맷으로 사용하며, HTTP/2 기반으로 동작합니다.

REST API의 텍스트 기반 JSON과 달리, gRPC는 바이너리 프로토콜을 사용해 더 작은 페이로드와 빠른 직렬화/역직렬화를 제공합니다. 마이크로서비스 간 통신에서 특히 강점을 발휘합니다.

Kubernetes, Envoy, etcd 등 클라우드 네이티브 도구들이 gRPC를 채택하고 있어 마이크로서비스 아키텍처의 사실상 표준이 되었습니다.

코드 예제

.proto 파일 정의

syntax = "proto3"; package user; // 서비스 정의 service UserService { // 단일 요청-응답 rpc GetUser(GetUserRequest) returns (User); // 서버 스트리밍 rpc ListUsers(ListUsersRequest) returns (stream User); // 양방향 스트리밍 rpc Chat(stream ChatMessage) returns (stream ChatMessage); } // 메시지 타입 정의 message User { int32 id = 1; string name = 2; string email = 3; } message GetUserRequest { int32 id = 1; }

Node.js 서버 구현

const grpc = require('@grpc/grpc-js'); const protoLoader = require('@grpc/proto-loader'); // proto 파일 로드 const packageDefinition = protoLoader.loadSync('user.proto'); const userProto = grpc.loadPackageDefinition(packageDefinition).user; // 서비스 구현 const server = new grpc.Server(); server.addService(userProto.UserService.service, { getUser: (call, callback) => { const user = { id: call.request.id, name: '홍길동', email: 'hong@example.com' }; callback(null, user); }, listUsers: (call) => { users.forEach(user => call.write(user)); call.end(); }, }); server.bindAsync('0.0.0.0:50051', grpc.ServerCredentials.createInsecure(), () => { server.start(); });

Node.js 클라이언트

const client = new userProto.UserService( 'localhost:50051', grpc.credentials.createInsecure() ); // 단일 요청 client.getUser({ id: 1 }, (err, user) => { console.log(user); // { id: 1, name: '홍길동', email: '...' } }); // 스트리밍 수신 const stream = client.listUsers({}); stream.on('data', (user) => console.log(user)); stream.on('end', () => console.log('완료'));

실무 대화 예시

아키텍트

"마이크로서비스 간 통신을 REST에서 gRPC로 전환하는 게 어때요?"

개발자

"성능은 확실히 좋아지겠죠. 근데 디버깅이 좀 불편해요. JSON처럼 curl로 테스트하기 어렵고요."

아키텍트

"grpcurl이나 Postman gRPC 기능 쓰면 돼. 그리고 외부 API는 REST 유지하고, 내부 서비스 간 통신만 gRPC로 가자."

주의사항

브라우저 직접 호출 불가

일반 브라우저에서 gRPC 호출이 불가능합니다. 웹 클라이언트는 gRPC-Web이나 REST 게이트웨이가 필요합니다.

proto 파일 관리

.proto 파일 변경 시 모든 서비스의 코드를 재생성해야 합니다. proto 파일 버전 관리와 호환성 유지가 중요합니다.

디버깅 복잡성

바이너리 프로토콜이라 네트워크 패킷을 직접 읽기 어렵습니다. 전용 도구(grpcurl, Postman)가 필요합니다.

관련 용어

더 배우기