구글이 쓰는 10배빠른 데이터 전송법

환리·2025년 7월 14일

깃허브의 Trending을 확인하며

깃허브의 수많은 레포지스토리 중 가장 인기 있는 레파지스토리는 무엇일까?

GitHub트렌딩사이트

다음 링크를 타고 넘어가면 깃허브의 최대 이슈 레파지스토리를 확인 가능하다.

★개수가 기본 2000이 넘어가는 중

이게 사람이 할 짓인가 싶을 정도로 레파지스토리 하나하나가 살인적인 용량을 자랑한다.

거의 대부분 구글이 만든 대형 프로젝트 아키텍쳐들이다.

오늘은 그중에서 맨 상단 protobuf에 대해서 알아보자

Protobuf GitHub사이트

이런 대형 프로젝트 레파지스토리의 정체를 알기위한 꿀팁

바로 README파일 읽어보자!

다른 이유가 아니라,
README 파일은 개발자들이 머리를 싸매고 이 프로젝트를 이해시키기위해서 발악한 결과물이다.

영어고 읽기 싫지만 몇번 읽어보면 적응된다.

그래서 정리하자면

마이크로서비스 아키텍처(MSA)나 gRPC(Google Remote Procedure Call) 통신에서 '실제'쓰고 있는 코드라고 합니다.

이런 게 왜 필요한데?

대부분 컴퓨터 비전에서

왜 이렇게까지 해야하는가?

처럼 필요성의 질문에는 무조건

효율성, 편의성, 성능 때문에

이라고 답을 하면 맞는다.

따라서 이 프로젝트도 그런 맥락이다.

이제 중요한 개념설명들을 하기전에 원치 않는 분들이 99%라고 생각합니다.

이제 그런 걸 기대하는 씹덕프사님들께 욕망해소의 링크를 첨부해드립니다.

★☆ㅣ9@gold_pr@t●_u출_♥♡


유니짱 다이스키

프로토콜 버퍼(Protocol Buffers) 완벽 가이드: 기본 개념부터 고급 아키텍처까지

현대 데이터 처리 방식은 주로 json 과 XML방식이 많이 채택되는 모습이다.

출처: https://moldstud.com/articles/p-what-are-the-latest-trends-in-xml-development

와! 매우 과학적인 스택오버플로우!

그러면 프로토콜 버퍼는 몇위정도 채택률을 가질까?

30분동안 아무리 찾아도 데이터 protobuf의 점유율을 조사한 결과는 없어서 그냥 Gemini돌리고 간단히 사실 유무 체크 하는 "대답 재확인"기능을 돌렸다. 빨간색 표시는 믿지 않는게 좋고 대충 초록색이면 신뢰가능한 정보라는 뜻. 따라서 대충 4~5위정도 Protobuf가 시장점유율을 가진다고 보면된다.

와! 매우과학적인 Gemini !!

1. 기본 개념: 프로토콜 버퍼란 무엇인가?

프로토콜 버퍼(이하 Protobuf)는 구조화된 데이터를 저장하거나 교환하기 위한 형식(Format)이자 규칙(Protocol)이다. 텍스트 기반인 JSON이나 XML과 달리, Protobuf는 데이터를 *바이너리(Binary) 형식으로 직렬화하여 크기가 작고 처리 속도가 빠르다는 장점을 가진다.

[바이너리 형식(파일)]: 0과 1로만 이루어진 이진법으로 표현된 데이터 또는 파일.

텍스트는 문자와 숫자로 이루어져 있으며, 아스키 코드나 유니코드와 같은 문자 인코딩 방식을 사용하여 표현됩니다.

따라서 인코딩을 한 번 거치는 텍스트보다 당연히 0과 1로 이루어진 파일이 빠를 수 밖에 없겠죠.

이해가 안되신다면
→ Python보다 C언어가 빠르고
→ C언어보다 assemble언어가 빠르고
→ assemble보다
→ 기계어가 빠르다

는처럼 생각하면 됩니다.

위에 사진처럼 바이너리는 읽기/쓰기 모두 문자/숫자간에 통신이 문제가 없는 반면에, 기존 텍스트 방식 json이나 XML은 읽기쓰기에 제약이 있는 모습이다.

주요 이점:

  • 성능: 바이너리 인코딩을 통해 데이터 크기와 파싱 속도를 획기적으로 개선합니다.

  • 엄격한 스키마: 데이터 구조를 미리 정의하므로 데이터 타입 불일치로 인한 런타임 오류를 방지합니다.

  • 호환성: 스키마에 필드를 추가하거나 변경하더라도 하위 및 상위 호환성을 유지하는 명확한 규칙을 제공하여 시스템의 유연한 진화를 지원합니다.

    한마디로 개쩐다는 것

2. 핵심 워크플로우: .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;
}

Protobuf 객체 스키마

객체 (Message)필드 (Field)타입 (Type)설명
Personnamestring사람의 이름
idint32고유 식별자
emailstring이메일 주소
phonesrepeated전화번호 목록 (PhoneNumber)
PhoneNumbernumberstring실제 전화번호
typeenum전화번호 타입
(Enum)MOBILE휴대폰
HOME집 전화
WORK직장 전화
AddressBookpeoplerepeated주소록에 포함된 사람 목록

이후 .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와 각 언어별 예제 파일들을 참고하여 주요 언어에 대한 컴파일 방법을 설명합니다.

1. C++

C++ 코드를 생성하려면 --cpp_out 옵션을 사용합니다.

  1. 코드 생성:
    터미널에서 다음 명령어를 실행하여 C++ 헤더(addressbook.pb.h) 및 소스(addressbook.pb.cc) 파일을 생성합니다.
    protoc --cpp_out=. addressbook.proto
  2. 애플리케이션과 함께 컴파일:
    생성된 파일들을 애플리케이션 코드와 함께 컴파일합니다. 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.ccexamples/list_people.cc 파일에서 생성된 클래스를 어떻게 사용하는지 확인할 수 있습니다.

2. Python

Python의 경우 --python_out 옵션을 사용하여 Python 모듈을 생성합니다.

  1. 코드 생성:
    다음 명령어를 실행하면 addressbook_pb2.py 파일이 생성됩니다.
    protoc --python_out=. addressbook.proto
  2. 모듈 사용:
    생성된 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.pyexamples/list_people.py에서 사용 예시를 찾아볼 수 있습니다.

3. Java

Java는 --java_out 옵션을 사용합니다. 일반적으로 Maven이나 Gradle 같은 빌드 도구를 통해 관리됩니다.

  1. 코드 생성:
    다음 명령어로 Java 소스 파일을 생성합니다.
    protoc --java_out=. addressbook.proto

    이 명령어는 tutorial/AddressBookProtos.java 파일을 생성하며, 그 안에 Person, AddressBook 등의 클래스가 포함됩니다.

  2. 프로젝트에 통합:
    생성된 Java 파일을 프로젝트의 소스 디렉터리로 옮기고, 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 = "홍길동"과 같이 객체의 속성에 접근하듯 데이터를 조작하고 직렬화할 수 있습니다.

3. 실무에서는 왜 쓸까?

실무 환경에서는 아마 다음과 같은 효과를 기대해볼 수 있겠네요.

  • 성능 최적화
  • gRPC를 통한 언어 독립적 API
  • 견고한 API 버전 관리

마치며

프로토버프쓰샘

B포 프ro토Bㅓ프

F터 P로to퍼f

profile
늙고병듦.

1개의 댓글

comment-user-thumbnail
2025년 7월 14일

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

답글 달기