AppMaster: Protobuf란 무엇인가요?
GoDoc: protobuf module
Protobuf 란?
ProtoBuf에 대한 정리 와 예제를 통한 사용 방법 확인
Google Protocol Buffers 3 with GO
CHATGPT
이번에 진행하게 된 프로젝트에서 protobuf라는 것을 사용하게 되었다.
protobuf? protocol buffer? 처음 들어보는 용어라 정리가 필요할 것 같아 작성하게 되었다.

Protocol Buffers(일반적으로 Protobuf라고 불림)는
Google이 개발한 데이터 직렬화(Serialization) 프레임워크이다.
데이터를 효율적으로 구조화하고 직렬화/역직렬화할 수 있도록 설계된 이진 데이터 포맷과 함께
데이터 구조를 정의하기 위한 IDL(Interface Definition Language)을 제공한다.
쉽게 말해서, Protobuf는 데이터를 작은 크기로 직렬화해서 빠르게 전송하거나 저장할 수 있게 해주는 도구이다.
JSON이나 XML과 같은 데이터 포맷과 비슷한 역할을 하지만, 더 간결하고 빠르다.
효율성: 이진 데이터 포맷을 사용
→ JSON이나 XML보다 데이터 크기가 작고, 처리 속도가 빠르다.
플랫폼 독립적: 다양한 언어(Java, Python, Go, C++, JavaScript 등)를 지원, 플랫폼 간 호환성을 보장
스키마 기반: 데이터 구조를 .proto 파일에 정의한 뒤, 이를 기반으로 코드 생성기가 각 언어에 맞는 데이터 클래스(또는 구조체)를 생성
→ 이 스키마 덕분에 데이터 구조를 명확히 정의하고, 변경이 용이하다.
직렬화/역직렬화 지원: 데이터를 이진 포맷으로 직렬화(Serialize)하거나, 다시 읽을 수 있는 객체로 역직렬화(Deserialize)
기타:
웹 서비스, 데이터베이스, RPC 시스템 및 파일 형식과 같은 다양한 응용 프로그램에서 사용할 수 있는 구조화된 데이터를 만드는 효율적이고 강력한 방법
문자열, 정수, 부동 소수점, 부울, 열거형(열거형), 지도(연관 배열) 등을 비롯한 많은 데이터 유형을 지원
언어 독립적 구문을 사용하면 선택한 서로 다른 프로그래밍 언어를 사용하여 작성된 프로그램이 서로 안정적으로 통신 가능
서로 다른 통신 프로토콜의 미묘한 차이에 대해 걱정할 필요 없이, 서로 상호 작용할 수 있는 클라이언트/서버 응용 프로그램을 만들 수 있음
Protobuf 형식을 사용하여 두 애플리케이션 간에 전송되는 메시지를 정의Protobuf 와 JSON 의 주요 차이점은 데이터가 인코딩되는 방식이다.
Protobuf 는 바이너리 형식으로 데이터를 인코딩하는 반면,
JSON 은 사람이 읽을 수 있는 일반 텍스트 형식을 사용한다.
이로 인해 Protobuf 는 JSON 보다 동일한 양의 정보를 전송하는 데 더 적은 대역폭이 필요하기 때문에
네트워크를 통해 데이터를 전송하는 데 훨씬 더 빠르고 효율적이다.

Protobuf 형식은 XML 또는 JSON 과 같은 다른 형식에 비해 몇 가지 이점을 제공한다.
구조화된 데이터는 바이너리 형식으로 저장되기 때문에 ,
XML이나 JSON 형식과 같은 텍스트 기반 형식보다 훨씬 작아 네트워크를 통한 전송이 더 빠르다.
또한 Protobuf 는 확장하기 쉽도록 설계되어 ,
빠르게 변화하는 데이터 구조와 새로운 기능을 처리하는 데 이상적이다.
마지막으로 Protobuf 에서 특별히 생성된 소스 코드는 속도를 최적화할 수 있으므로 ,
더 적은 메모리를 사용하여 더 빠른 애플리케이션을 만들 수 있다.
Protobuf는 속도, 크기 효율성 및 복잡한 데이터 유형이 필요한 애플리케이션에 선호되는 데이터 형식이다.
네트워크 대역폭이 제한된 분산 시스템 또는 모바일 앱을 개발하는 데 탁월한 선택이다.
이에 비해
JSON은 더 간단하고 많은 언어와 플랫폼에서 지원하므로 더 널리 받아들여진다.
따라서 성능보다 호환성과 단순성을 원하는 상황에서 사용할 수 있다.
결론적으로 Protobuf 와 JSON 모두 애플리케이션을 구축할 때 어떤 기능을 가장 우선시하느냐에 따라 장단점이 있다.
더 빠른 읽기/쓰기 속도, 더 작은 파일 크기 및 복잡한 데이터 유형이 필요한 경우 Protobuf 가 더 나은 선택이다.
그러나 단순성과 플랫폼 호환성이 더 중요한 경우 JSON 이 더 나을 수 있다.

필드와 값의 분리 동작 방식에서 보았듯이
JSON의 경우 필드값과 데이터 값을 가지지만,
Protocol Buffer의 경우 정의된 플래그 값으로 대체 시켜 버린다.
.proto 파일 작성syntax = "proto3";
message Person {
int32 id = 1;
string name = 2;
string email = 3;
}
protoc)를 사용하여 정의된 .proto 파일로부터 각 언어에 맞는 클래스 파일을 생성protoc --python_out=. your_file.proto
from your_file_pb2 import Person
# 데이터 생성
person = Person(id=1, name="Alex", email="alex@example.com")
# 직렬화
serialized_data = person.SerializeToString()
# 역직렬화
new_person = Person()
new_person.ParseFromString(serialized_data)