[gRPC] 프로토콜 버퍼 (Protocol Buffers) 알아보기.

728x90
반응형

 

 

들어가며

gRPC를 보다보니, gRPC는 기본적으로 프로토콜 버퍼를 함께 사용합니다. 저도 아직 실무에서 사용해본적은 없지만 이번기회에 개념을 같이 정리해보았습니다. 

 

 

 

 

개요

프로토콜 버퍼는 구조화된 데이터를 직렬화하기 위한 구글에서 개발하고, 공개한 언어 중립적, 플랫폼 중립적,

확장 가능한 구조입니다. (Serialized Data Structure)

 

다양한 언어를 지원하며, XML 보다 작고, 빠르고, 간단하며, 일반적으로 RESTFul API 사용시 JSON을 많이 사용하며, 이와 유사한 직렬화 데이터 구조입니다.

 

JSON, XML의 경우 일반 사람들이 육안으로 데이터 확인이 가능하다면, 프로토콜 버퍼의 구조는 16진수로 인코딩 하기때문에, 직접적인 확인은 불가능하다는 단점이 있지만, 데이터 구조화 를 한번 정의한 다음, 특수 생성 소스 코드를 사용하여 다양한 데이터 스트림과 다양한 언어를 사용하여 구조화된 데이터를 쉽게 쓰고 읽을 수 있습니다.

 

 

 

 

 

사용범위

  • 프로토콜 버퍼는 언어 중립적, 플랫폼 중립적, 확장 가능한 방식으로 구조화된 레코드와 같은 유형 데이터를 직렬화해야 하는 모든 상황에 이상적입니다.
  • 통신 프로토콜 정의(gRPC와 함께) 및 데이터 저장에 가장 자주 사용됩니다.

 

 

장점

  • 컴팩트한 데이터 스토리지
  • 빠른 구문 분석
  • 많은 프로그래밍 언어에서 사용 가능
  • 자동 생성 클래스를 통한 최적화된 기능

 

 

단점

  • 16진수 형태의 byte 로 변환되기 때문에, 직관적으로 데이터를 읽기 어렵습니다.
  • 타 언어의 경우 .proto 확장자 파일이 있어야, protobuf 로 쓰여진 데이터를 읽을 수 있습니다.

 

 

 

언어 간 호환성

지원되는 모든 프로그래밍 언어로 작성된 코드로 동일한 메시지를 읽을 수 있습니다. 한 플랫폼의 Java 프로그램이 한 소프트웨어 시스템에서 데이터를 캡처하고 .proto정의에 따라 직렬화한 다음 다른 플랫폼에서 실행되는 별도의 Python 응용 프로그램에서 직렬화된 데이터에서 특정 값을 추출하도록 할 수 있습니다.

  • C++, C#, Java, Kotlin, Objective-C, PHP, Python, Ruby

 

https://martin.kleppmann.com/2012/12/05/schema-evolution-in-avro-protocol-buffers-thrift.html

 

 

적합하지 않은 경우

  • 프로토콜 버퍼가 직렬화가 되면, 동일한 데이터여도 다양한 이진 직렬화를 가질 수 있습니다. 이진데이터를 비교해야 할 경우 다른 솔루션을 고려해야 합니다.
  • 메시지는 압축되지 않습니다. gzip으로는 압축할 수 있지만, 특수 목적 압축 알고리즘에는 적합하지 않습니다.
  • 비 객체지향 언어에서 잘 지원되지 않습니다. (언어 호환 확인 필요)
  • 공식적인 표준이 아닙니다. 표준을 따라야 하는 프로젝트에서는 부적합합니다.

 

 

참조

https://developers.google.com/protocol-buffers/docs/overview

 

 

 

 

 

 

END


 

 

 

 

728x90