
깃허브의 수많은 레포지스토리 중 가장 인기 있는 레파지스토리는 무엇일까?
다음 링크를 타고 넘어가면 깃허브의 최대 이슈 레파지스토리를 확인 가능하다.
★개수가 기본 2000이 넘어가는 중

거의 대부분 구글이 만든 대형 프로젝트 아키텍쳐들이다.
다른 이유가 아니라,
README 파일은 개발자들이 머리를 싸매고 이 프로젝트를 이해시키기위해서 발악한 결과물이다.
영어고 읽기 싫지만 몇번 읽어보면 적응된다.
그래서 정리하자면
마이크로서비스 아키텍처(MSA)나 gRPC(Google Remote Procedure Call) 통신에서 '실제'쓰고 있는 코드라고 합니다.
대부분 컴퓨터 비전에서
왜 이렇게까지 해야하는가?
처럼 필요성의 질문에는 무조건
효율성, 편의성, 성능 때문에
이라고 답을 하면 맞는다.
따라서 이 프로젝트도 그런 맥락이다.
이제 중요한 개념설명들을 하기전에 원치 않는 분들이 99%라고 생각합니다.
이제 그런 걸 기대하는 씹덕프사님들께 욕망해소의 링크를 첨부해드립니다.


유니짱 다이스키
현대 데이터 처리 방식은 주로 json 과 XML방식이 많이 채택되는 모습이다.
출처: https://moldstud.com/articles/p-what-are-the-latest-trends-in-xml-development
와! 매우 과학적인 스택오버플로우!
그러면 프로토콜 버퍼는 몇위정도 채택률을 가질까?

30분동안 아무리 찾아도 데이터 protobuf의 점유율을 조사한 결과는 없어서 그냥 Gemini돌리고 간단히 사실 유무 체크 하는 "대답 재확인"기능을 돌렸다. 빨간색 표시는 믿지 않는게 좋고 대충 초록색이면 신뢰가능한 정보라는 뜻. 따라서 대충 4~5위정도 Protobuf가 시장점유율을 가진다고 보면된다.
와! 매우과학적인 Gemini !!
프로토콜 버퍼(이하 Protobuf)는 구조화된 데이터를 저장하거나 교환하기 위한 형식(Format)이자 규칙(Protocol)이다. 텍스트 기반인 JSON이나 XML과 달리, Protobuf는 데이터를 *바이너리(Binary) 형식으로 직렬화하여 크기가 작고 처리 속도가 빠르다는 장점을 가진다.
[바이너리 형식(파일)]: 0과 1로만 이루어진 이진법으로 표현된 데이터 또는 파일.
텍스트는 문자와 숫자로 이루어져 있으며, 아스키 코드나 유니코드와 같은 문자 인코딩 방식을 사용하여 표현됩니다.
따라서 인코딩을 한 번 거치는 텍스트보다 당연히 0과 1로 이루어진 파일이 빠를 수 밖에 없겠죠.
이해가 안되신다면
→ Python보다 C언어가 빠르고
→ C언어보다 assemble언어가 빠르고
→ assemble보다
→ 기계어가 빠르다
는처럼 생각하면 됩니다.

위에 사진처럼 바이너리는 읽기/쓰기 모두 문자/숫자간에 통신이 문제가 없는 반면에, 기존 텍스트 방식 json이나 XML은 읽기쓰기에 제약이 있는 모습이다.
주요 이점:
성능: 바이너리 인코딩을 통해 데이터 크기와 파싱 속도를 획기적으로 개선합니다.
엄격한 스키마: 데이터 구조를 미리 정의하므로 데이터 타입 불일치로 인한 런타임 오류를 방지합니다.
호환성: 스키마에 필드를 추가하거나 변경하더라도 하위 및 상위 호환성을 유지하는 명확한 규칙을 제공하여 시스템의 유연한 진화를 지원합니다.
한마디로 개쩐다는 것
.proto 파일과 코드 생성Protobuf의 모든 것은 .proto 파일의 작성에서 시작됩니다. 다음은 간단한 주소록을 정의하는 예시입니다.
// addressbook.proto
syntax = "proto3";
package tutorial;
message Person {
string name = 1;
int32 id = 2;
string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
string number = 1;
PhoneType type = 2;
}
repeated PhoneNumber phones = 4;
}
message AddressBook {
repeated Person people = 1;
}
| 객체 (Message) | 필드 (Field) | 타입 (Type) | 설명 |
|---|---|---|---|
| Person | name | string | 사람의 이름 |
id | int32 | 고유 식별자 | |
email | string | 이메일 주소 | |
phones | repeated | 전화번호 목록 (PhoneNumber) | |
| PhoneNumber | number | string | 실제 전화번호 |
type | enum | 전화번호 타입 | |
| (Enum) | MOBILE | 휴대폰 | |
HOME | 집 전화 | ||
WORK | 직장 전화 | ||
| AddressBook | people | repeated | 주소록에 포함된 사람 목록 |
이후 .proto 파일을 protoc 컴파일러로 처리하면 됩니다.
컴파일을 위해서는 먼저 Protocol Buffers 컴파일러인 protoc가 설치되어 있어야 합니다. protoc는 .proto 파일을 특정 프로그래밍 언어에 맞는 데이터 접근 클래스로 변환하는 역할을 합니다.
일반적인 컴파일 명령어 형식은 다음과 같습니다.
protoc -I=$SRC_DIR --<lang>_out=$DST_DIR $SRC_DIR/addressbook.proto
$SRC_DIR: .proto 파일이 있는 소스 디렉터리 (예: .)$DST_DIR: 생성된 코드를 저장할 목적지 디렉터리 (예: .)--<lang>_out: 대상 프로그래밍 언어를 지정하는 옵션 (예: --cpp_out, --python_out, --java_out)프로젝트의 examples 디렉터리 내의 CMakeLists.txt와 각 언어별 예제 파일들을 참고하여 주요 언어에 대한 컴파일 방법을 설명합니다.
C++ 코드를 생성하려면 --cpp_out 옵션을 사용합니다.
addressbook.pb.h) 및 소스(addressbook.pb.cc) 파일을 생성합니다.
protoc --cpp_out=. addressbook.proto
protobuf 라이브러리와 링크해야 합니다.
g++ your_app.cc addressbook.pb.cc -o your_app `pkg-config --cflags --libs protobuf`
또는
g++ your_app.cc addressbook.pb.cc -o your_app -lprotobuf
examples/add_person.cc와 examples/list_people.cc 파일에서 생성된 클래스를 어떻게 사용하는지 확인할 수 있습니다.
Python의 경우 --python_out 옵션을 사용하여 Python 모듈을 생성합니다.
addressbook_pb2.py 파일이 생성됩니다.
protoc --python_out=. addressbook.proto
addressbook_pb2.py 파일을 다른 Python 스크립트에서 import하여 사용합니다.
import addressbook_pb2 person = addressbook_pb2.Person() person.id = 123 person.name = "John Doe" person.email = "jdoe@example.com" # ...
examples/add_person.py와 examples/list_people.py에서 사용 예시를 찾아볼 수 있습니다.
Java는 --java_out 옵션을 사용합니다. 일반적으로 Maven이나 Gradle 같은 빌드 도구를 통해 관리됩니다.
protoc --java_out=. addressbook.proto
이 명령어는 tutorial/AddressBookProtos.java 파일을 생성하며, 그 안에 Person, AddressBook 등의 클래스가 포함됩니다.
protobuf-java 라이브러리를 의존성에 추가하여 빌드합니다. java/pom.xml 파일에서 볼 수 있듯이 Maven 프로젝트의 경우 pom.xml에 의존성을 추가합니다.
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>LATEST_VERSION</version>
</dependency>
예를 들어, Python에서는 person.name = "홍길동"과 같이 객체의 속성에 접근하듯 데이터를 조작하고 직렬화할 수 있습니다.
실무 환경에서는 아마 다음과 같은 효과를 기대해볼 수 있겠네요.
프로토버프쓰샘


아니 왜 velog는 토글버튼 구현 못함?