티스토리 뷰
📡 프로토콜 버퍼 (Protocol Buffers)
프로토콜 버퍼는 구조화된 데이터를 직렬화하는 방식으로, 구글에서 개발하으며 gRPC에서 데이터를 주고받기 위해 기본으로 사용되는 방식입니다.
프로토콜 버퍼는 다음과 같은 주요 특징을 가지고 있습니다.
- 효율적인 이진 직렬화: 다른 형식(XML 또는 JSON)에 비해 더 작은 데이터 크기로 더 빠른 데이터 전송 및 저장이 가능합니다.
- 스키마 정의: '.proto' 파일을 사용하여 프로토콜 버퍼 메시지를 스키마로 정의할 수 있습니다.
- 다양한 언어 지원: 현재 프로토콜 버퍼는 C++, Java, Python, Go 등 총 11개 언어로의 컴파일을 지원하고 있습니다.
- 업데이트 및 상호 호환성: 데이터 스키마에 새 필드를 추가하거나 수정 또는 제거하는 업데이트가 이루어지더라도, 기존 데이터와의 상호 호환성이 유지됩니다. 예를 들어, 추가되거나 제거된 필드는 기본값을 가지고 repeated 필드인 경우 빈 값을 가집니다.
📜 프로토콜 버퍼 파일(.proto) 구성
1. 문법 지정
.proto 파일의 최상단에 사용할 프로토콜 버퍼 문법을 지정합니다. 사용할 수 있는 문법에는 'proto2'와 'proto3'가 있는데 일반적으로 'proto3'을 사용합니다.
syntax = "proto3";
2. 패키지 지정
패키지는 .proto 파일이 속하는 네임스페이스를 정의합니다. 패키지는 다른 .proto 파일과 동일한 프로토콜 버퍼 메시지를 정의한 경우 이들을 구분하기 위해 사용합니다.
package todo.v1;
3. 열거형 정의
열거형은 'enum' 키워드로 시작하여 상수를 정의하는데 사용합니다. 중괄호 '{}' 내에서 상수 이름에 해당하는 값을 지정할 수 있습니다.
enum Priority {
UNKNOWN = 0;
LOW = 1;
MEDIUM = 2;
HIGH = 3;
}
3. 메시지 정의
메시지는 데이터 구조를 설명하는 가장 중요한 부분으로, 'message' 키워드로 시작합니다. 중괄호 '{}' 내에 필드 정의를 포함하며, 각 필드는 이름 그리고 고유한 번호로 구성됩니다.
message Todo {
string id = 1;
string title = 2;
string description = 3;
Priority priority = 4;
bool done = 5;
}
4. 서비스 정의
서비스는 RPC 메서드를 정의합니다. RPC 메서드에는 Unary, Client Streaming, Server Streaming 그리고 Bidirectional Streaming 네 가지 형태가 존재합니다.
service TodoService {
rpc Create(CreateTodoRequest) returns (Todo);
rpc CreateMany(stream CreateTodoRequest) returns (stream Todo);
rpc Get(GetTodoRequest) returns (Todo);
rpc GetAll(Empty) returns (stream Todo);
rpc Update(UpdateTodoRequest) returns (UpdateTodoResponse);
rpc UpdateMany(stream UpdateTodoRequest) returns (UpdateTodoResponse);
rpc Delete(DeleteTodoRequest) returns (DeleteTodoResponse);
rpc DeleteAll(Empty) returns (DeleteTodoResponse);
}
5. 주석
두 개의 슬래시 (//) 또는 /*와 */ 사이에 주석을 추가하여 스키마와 필드에 대한 설명을 제공할 수 있습니다.
// this is a comment
/* this is a comment */
📖 참고자료
글에서 수정이 필요한 부분이나 설명이 부족한 부분이 있다면 댓글로 남겨주세요!
'Go > 코딩 하기' 카테고리의 다른 글
[Go] 우아하게 종료하기 (Graceful shutdown) (0) | 2023.10.24 |
---|---|
[Go] 아파치 카프카를 사용한 간단한 이벤트 기반 서비스 구현 (0) | 2023.10.15 |
[Go] gRPC 파헤치기 - gRPC란? (0) | 2023.10.11 |
[Go] 문자열과 바이트 슬라이스를 상호 변환하는 여러가지 방법 (0) | 2023.10.01 |
[Go] 잠자는 이발사 문제 (0) | 2023.09.30 |