**gRPC(Google Remote Procedure Call)**는 구글에서 개발한 오픈소스 RPC(Remote Procedure Call) 프레임워크로서, HTTP/2 프로토콜을 기반으로 높은 성능, 스트리밍, 양방향 통신 등을 지원합니다. Protobuf(Protocol Buffers)라는 IDL(Interface Definition Language)를 사용하여 직렬화/역직렬화 성능이 뛰어나고, 다양한 언어에서 클라이언트/서버를 작성할 수 있다는 장점이 있습니다.
주요 특징
**멀티플렉싱(multiplexing)**이란, 하나의 TCP 연결에서 여러 개의 스트림(stream)을 동시에 전송할 수 있게 하는 기능을 말합니다. 전통적인 HTTP/1.1에서는 요청 하나당 하나의 연결(또는 시리얼하게 순차 요청) 방식을 주로 사용했으나, HTTP/2에서는 여러 요청 및 응답을 병렬로 처리 가능합니다.
**Protocol Buffers(프로토콜 버퍼)**는 구글에서 개발한 언어 중립적, 플랫폼 중립적 데이터 직렬화/역직렬화 방식입니다. .proto
라는 IDL(Interface Definition Language) 파일에 메시지 구조를 정의하고, 해당 파일을 컴파일하여 언어별 코드를 생성해 사용합니다.
.proto
정의에 필드를 추가/삭제해도 과거 클라이언트와 어느 정도 호환되도록 설계되었습니다(규칙에 따라 필드 번호와 타입만 주의하면 하위 호환성 유지 가능)..proto
파일syntax = "proto3"; // messaage type 정의
package example;
message Person {
string name = 1;
int32 age = 2;
}
코드 생성
protoc --go_out=. --go_opt=paths=source_relative \\
--go-grpc_out=. --go-grpc_opt=paths=source_relative \\
sample/helloworld.proto
protoc
: 프로토콜 버퍼(Protocol Buffers) 컴파일러--go_out=.
: .proto 파일을 Go 언어용 코드로 생성(*.pb.go
파일) 할 때, 출력 위치 지정--go_opt=paths=source_relative
: Go 코드 생성 시, 생성된 .pb.go
파일의 경로 구조를 어떻게 설정할지 지정하는 옵션--go-grpc_out=.
: gRPC 서비스 스텁(.pb.go
안에 gRPC 관련 인터페이스, 클라이언트/서버 구조체 등)을 Go 언어로 생성 할 때의 출력 위치--go-grpc_opt=paths=source_relative
: gRPC 코드 생성 시에도, 생성된 파일의 경로 구조를 어떻게 설정할지 지정하는 옵션_pb.go
파일Protobuf 메시지 정의 및 직렬화 관련 코드를 포함합니다.
.proto
파일에서 정의한 메시지(message) 구조체를 생성합니다.
Protobuf 메시지를 **직렬화(Serialize) 및 역직렬화(Deserialize)**가 가능하도록 합니다.
proto.Marshal()
및 proto.Unmarshal()
같은 함수를 통해 바이너리 데이터를 변환할 수 있도록 지원합니다.
.proto
파일syntax = "proto3";
package example;
message Point {
int32 latitude = 1;
int32 longitude = 2;
}
point_pb.go
파일
Protobuf 메시지 자체를 정의하며, gRPC 서비스 관련 코드는 포함되지 않습니다.
package example
import (
"google.golang.org/protobuf/proto"
)
type Point struct {
Latitude int32 `protobuf:"varint,1,opt,name=latitude,proto3" json:"latitude,omitempty"`
Longitude int32 `protobuf:"varint,2,opt,name=longitude,proto3" json:"longitude,omitempty"`
}
func (m *Point) Reset() { *m = Point{} }
func (m *Point) String() string { return proto.CompactTextString(m) }
func (*Point) ProtoMessage() {}
_grpc.pb.go
파일gRPC 서비스 관련 코드를 포함합니다.
.proto
파일에서 정의한 서비스(service) 인터페이스를 생성합니다.