- BOJ 30029
- BOJ 30028
- 27173
- BOJ 30027
- 27114
- BOJ 30026
- 2023 Engineering Pair
- voronoi diagram
- BOJ 31226
- 누텔라트리(hard)
- 알고리즘
- fortune's algorithm
- hhs2003
- Delaunay triangulation
- boj 30788
- solved.ac
- CodeForces
- K8s
- BOJ17139
- boj23054
- 2025acpc
- 2023 SW - IT Contest
- 컴퓨터융합학부
- 백준
- 느리게 갱신되는 세그먼트 트리
- 오일러투어트리
- 충남대학교 2023 SW - IT
- dx dy
- 수열과 쿼리 43
- 세그먼트 트리
황현석 일지
proto3 (gRPC) 에 대하여, 본문
https://protobuf.dev/programming-guides/proto3/
Language Guide (proto 3)
Covers how to use the proto3 revision of the Protocol Buffers language in your project.
protobuf.dev
gRPC & Proto3가 무엇인가요?
gRPC(Google Remote Procedure Call)는 구글이 개발한 오픈소스 고성능 RPC(원격 프로시저 호출) 프레임워크입니다.
일반적인 REST API가 HTTP/1.1과 JSON을 사용하여 텍스트 기반으로 통신하는 것과 달리, gRPC는 HTTP/2를 기반으로 하며 이진(Binary) 데이터로 통신합니다. 이를 통해 네트워크 효율성이 극대화되고, 서로 다른 언어로 작성된 서비스 간에도 마치 로컬 함수를 호출하듯 매끄럽게 통신할 수 있습니다.
최근에는 Kubernetes에서 각 Go 프로그램들이 MicroService 형태를 띄고 있고, 그것들이 어떻게 통신을 하는지에 대해 공부하고 있었습니다. 이때, 각 Service들은 gRPC & proto3 라는 프로토콜로 굉장히 빠르게 통신을 하고 있었습니다.
.proto 파일에 대하여,
.proto 파일은 IDL(Interface Definition Language)로, 어떤 데이터를 주고받을지, 어떤 기능을 제공할지를 정의하는 일종의 명세서 입니다. 이 파일 하나만 있으면 서버와 클라이언트가 서로 어떤 언어(Go, Java, Python 등)를 쓰든 상관없이 소통할 수 있게 됩니다.

JS/TS 에서 흔히, Data를 보내기 전에, 객체의 상태로 Data Transfer Object를 정의하곤 합니다. proto3에서도 유사하게, Transfer 상태들을 다 정의한다고 생각하면 됩니다.
쿠버네티스 내의 여러 Go 서비스들이 서로 통신할 때, "내가 이런 데이터를 보낼 테니, 너는 저런 형식으로 응답해줘" 라는 규칙을 이 파일에 정의합니다. 텍스트 기반의 JSON과 달리, .proto는 필드에 고유한 번호를 부여하여 이진(Binary) 데이터로 직렬화하기 때문에 압도적인 통신 속도와 효율성을 자랑합니다.
Go 언어로의 Compile
이제 proto확장자를 가진 파일에 IDL을 다 작성했으면, 이것을 Go 언어로 컴파일 해봅시다.
우선은 각 언어마다, 컴파일 하는 방법이 다릅니다. Go의 경우에는 Go 언어로 컴파일 해주는 protoc을 설치해야합니다.
protoc --go_out=. --go-grpc_out=. worker.proto #Go의 경우
protoc --java_out=. --grpc-java_out=. worker.proto #Java의 경우
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. worker.proto
protoc --cpp_out=. --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` worker.proto

Go는 폴더 단위로 패키징 된다. 즉, 저 worker 패키지에는 gRPC 통신에 필요한 Client와 Server Struct를 제공하고 있다고 생각하면 됩니다.
실제 Client와 Server 의 사용

우선, gRPC를 받는 Server는 proto3에서 명세 된 모든 services들을 구현해야 합니다. worker에서 서버 등록함수를 제공하기 때문에, 우린 그 proto3로 구현된 인터페이스를 Duct type으로 만족시키는 구조체를 작성하여 구현해야합니다. 이때, 임베딩 패턴을 사용합니다.
만약, gRPC에 새로운 매서드를 추가 했다고 합시다. 그럼, 우리는 코드에서 그 매서드가 무엇을 실제로 하는지 implement 해야합니다.
우선적으로, UnimplementedWorkerServiceServer를 구조체에 포함 할 경우, 모든 메서드를 "아직 구현되지 않음" 에러를 반환하도록 기본적으로 구현됩니다. 따라서, 기존 코드가 잘 작동하게 됩니다.

grpc.Server 객체를 만들 시간입니다.
우선 gRPC의 핵심 엔진을 초기화 합니다. 그 후, 자동으로 구현 된 worker패키지에 있는 RegisterWorkerServiceServer에, source인 gRPC서버와, 우리가 실제로 구현한 Server 구조체를 넣어 gRPC서버에 등록합니다. 후, server를 리턴합니다.

추후, net을 이용해 tcp통신하는 포트하나를 뚫고, 이곳을 gRPC서버가 사용하도록 하면 됩니다.

이번에는 Client입장입니다. 기본적으로 Go의 gRPC 모듈을 사용하여, gRPC Server에 연결할 수 있는 객체를 만듭니다.
그 후, worker Package 에 있는 NewWorkerServiceClient, Go 로 컴파일 된 Client를 호출하여 사용하면 됩니다.

다음과 같이, client는 proto3에 명세 된 모든 함수와 인자가 구현되어 있습니다. 따라서, 강력한 타입검사와 더불어, 안정적인 구현이 가능합니다.
'Kubernetes' 카테고리의 다른 글
| Kubernetes - Registry:2 적용기 (0) | 2026.04.08 |
|---|---|
| 클라우드 서버 구축 트러블 슈팅 - 01 K3s API Server Connection (0) | 2026.01.14 |
| Kubernetes - 01 (2) | 2025.07.19 |