Protobuf란? (1)

wldbs._.·2024년 12월 5일

WEB-STUDY

목록 보기
6/9
post-thumbnail

AppMaster: Protobuf란 무엇인가요?
GoDoc: protobuf module
Protobuf 란?
ProtoBuf에 대한 정리 와 예제를 통한 사용 방법 확인
Google Protocol Buffers 3 with GO
CHATGPT

이번에 진행하게 된 프로젝트에서 protobuf라는 것을 사용하게 되었다.
protobuf? protocol buffer? 처음 들어보는 용어라 정리가 필요할 것 같아 작성하게 되었다.


Protobuf

Protocol Buffers(일반적으로 Protobuf라고 불림)는
Google이 개발한 데이터 직렬화(Serialization) 프레임워크이다.

데이터를 효율적으로 구조화하고 직렬화/역직렬화할 수 있도록 설계된 이진 데이터 포맷과 함께
데이터 구조를 정의하기 위한 IDL(Interface Definition Language)을 제공한다.

쉽게 말해서, Protobuf는 데이터를 작은 크기로 직렬화해서 빠르게 전송하거나 저장할 수 있게 해주는 도구이다.
JSON이나 XML과 같은 데이터 포맷과 비슷한 역할을 하지만, 더 간결하고 빠르다.

  • 구조화된 데이터를 이진 형식으로 효율적이고 컴팩트하게 저장하여, 네트워크 연결을 통해 더 빠르게 전송할 수 있다.
  • 다양한 프로그래밍 언어를 지원하고, 플랫폼 독립적이므로, 이를 사용하여 작성된 프로그램을 다른 플랫폼으로 쉽게 포팅할 수 있다.

1. 주요 특징

  1. 효율성: 이진 데이터 포맷을 사용
    JSON이나 XML보다 데이터 크기가 작고, 처리 속도가 빠르다.

  2. 플랫폼 독립적: 다양한 언어(Java, Python, Go, C++, JavaScript 등)를 지원, 플랫폼 간 호환성을 보장

  3. 스키마 기반: 데이터 구조를 .proto 파일에 정의한 뒤, 이를 기반으로 코드 생성기가 각 언어에 맞는 데이터 클래스(또는 구조체)를 생성
    → 이 스키마 덕분에 데이터 구조를 명확히 정의하고, 변경이 용이하다.

  4. 직렬화/역직렬화 지원: 데이터를 이진 포맷으로 직렬화(Serialize)하거나, 다시 읽을 수 있는 객체로 역직렬화(Deserialize)

  5. 기타:

  • 웹 서비스, 데이터베이스, RPC 시스템 및 파일 형식과 같은 다양한 응용 프로그램에서 사용할 수 있는 구조화된 데이터를 만드는 효율적이고 강력한 방법

    • RPC (원격 프로시저 호출): 응용 프로그램이 네트워크를 통해 서로 통신할 수 있도록 하는 통신 유형
      → 호출 응용 프로그램(클라이언트)에서 다른 응용 프로그램(서버)으로 요청을 보내고 응답을 받는 방식으로 작동
  • 문자열, 정수, 부동 소수점, 부울, 열거형(열거형), 지도(연관 배열) 등을 비롯한 많은 데이터 유형을 지원

  • 언어 독립적 구문을 사용하면 선택한 서로 다른 프로그래밍 언어를 사용하여 작성된 프로그램이 서로 안정적으로 통신 가능

  • 서로 다른 통신 프로토콜의 미묘한 차이에 대해 걱정할 필요 없이, 서로 상호 작용할 수 있는 클라이언트/서버 응용 프로그램을 만들 수 있음


2. 사용되는 곳

  • 네트워크 통신: 클라이언트-서버 간 빠르고 효율적인 데이터 교환.
  • 데이터 저장: 데이터베이스 또는 파일 시스템에 저장하기 위해 데이터 크기를 줄임.
  • 분산 시스템: 서버 간 메시지 전송.
  • 응용 프로그램 간의 RPC 통신: 애플리케이션이 동일한 메시지 구조를 사용하여 데이터를 단순히 직렬화/역직렬화할 수 있으므로 애플리케이션이 서로 효율적으로 쉽게 통신
    • Protobuf 형식을 사용하여 두 애플리케이션 간에 전송되는 메시지를 정의

3. JSON vs Protobuf

ProtobufJSON 의 주요 차이점은 데이터가 인코딩되는 방식이다.

Protobuf 는 바이너리 형식으로 데이터를 인코딩하는 반면,
JSON 은 사람이 읽을 수 있는 일반 텍스트 형식을 사용한다.

이로 인해 ProtobufJSON 보다 동일한 양의 정보를 전송하는 데 더 적은 대역폭이 필요하기 때문에
네트워크를 통해 데이터를 전송하는 데 훨씬 더 빠르고 효율적이다.

Protobuf 형식은 XML 또는 JSON 과 같은 다른 형식에 비해 몇 가지 이점을 제공한다.

  1. 구조화된 데이터는 바이너리 형식으로 저장되기 때문에 ,
    XML이나 JSON 형식과 같은 텍스트 기반 형식보다 훨씬 작아 네트워크를 통한 전송이 더 빠르다.

  2. 또한 Protobuf 는 확장하기 쉽도록 설계되어 ,
    빠르게 변화하는 데이터 구조와 새로운 기능을 처리하는 데 이상적이다.

  3. 마지막으로 Protobuf 에서 특별히 생성된 소스 코드는 속도를 최적화할 수 있으므로 ,
    더 적은 메모리를 사용하여 더 빠른 애플리케이션을 만들 수 있다.

Protobuf 는 속도, 크기 효율성 및 복잡한 데이터 유형이 필요한 애플리케이션에 선호되는 데이터 형식이다.
네트워크 대역폭이 제한된 분산 시스템 또는 모바일 앱을 개발하는 데 탁월한 선택이다.

이에 비해 JSON 은 더 간단하고 많은 언어와 플랫폼에서 지원하므로 더 널리 받아들여진다.
따라서 성능보다 호환성과 단순성을 원하는 상황에서 사용할 수 있다.

결론적으로 ProtobufJSON 모두 애플리케이션을 구축할 때 어떤 기능을 가장 우선시하느냐에 따라 장단점이 있다.

빠른 읽기/쓰기 속도, 더 작은 파일 크기 및 복잡한 데이터 유형이 필요한 경우 Protobuf 가 더 나은 선택이다.
그러나 단순성플랫폼 호환성이 더 중요한 경우 JSON 이 더 나을 수 있다.

필드와 값의 분리 동작 방식에서 보았듯이
JSON의 경우 필드값과 데이터 값을 가지지만,
Protocol Buffer의 경우 정의된 플래그 값으로 대체 시켜 버린다.


4. 사용 방법 (Python)

  1. .proto 파일 작성
    : 데이터 구조를 정의하는 스키마 파일 작성
syntax = "proto3";

message Person {
  int32 id = 1;
  string name = 2;
  string email = 3;
}
  1. 코드 생성
    : Protobuf 컴파일러(protoc)를 사용하여 정의된 .proto 파일로부터 각 언어에 맞는 클래스 파일을 생성
protoc --python_out=. your_file.proto
  1. 데이터 직렬화 및 역직렬화
    : 생성된 클래스를 사용해 데이터를 직렬화/역직렬화
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)
profile
공부 기록용 24.08.05~ #LLM #RAG

0개의 댓글