본문 바로가기
GRPC

ProtoBuf 란 ?

by Box 2022. 5. 5.
728x90

ProtoBuf

grpc에서 idl로 사용한다.

구글에서 개발한 오픈소스로 공개한, 직렬화 데이터 구조이다.
Protocolbuf는 서버와 클라이언트에서 매우 빠르게 직렬화 한다.


바이너리로 직렬화된 메시지를 교환하므로 텍스트 기반의 Json이나 Xml에 비해 크기가 작다.


또한 현재 사용하는 대부분의 언어를 지원하고 있다.
C++, JS, Go, Java, Python 등을 지원하고 있다.

 

이러한 데이터 주고받을 명세를 정하기 위해 .proto라는 파일을 작성한다.

직렬화: 데이터를 네트워크로 전송하기 위해 바이너리 스트림 형태로 저장하는 행위이다.

 

기본구조 

syntax : proto 버전, default proto2 
package : 여기에 정의된 패키지로 stub 이 생성된다. 
service : 실제 서비스를 정의하고 인터페이스를 이안에서 정의.
rpc : 메소드 인터페이스, request, response, stream 등 키워드로 정의
message : rpc 통신을 할 때 주고받을 모델 정의

 


프로토콜 버퍼의 원리.

프로토콜 버퍼가 포맷이라고 했는데 어떤 형식인지 알아본다. (그전에 JSON부터 알아보자)

우선 Person클래스를 만들고 그 객체를 JSON포맷으로 만든다고 쳐보자 그러면 아래와 같을 것이다.

{
	"userName":"Martin",
	"favouriteNumber":1337,
	"interests":["daydreaming","hacking"]
}

데이터 크기를 보면 공백을 빼도 총 82byte를 사용했다.

그러면 프로토콜 버퍼를 사용했을 때는 어떨까? (그림에서 볼 수 있듯 33byte를 썼다.)

 

message Person {
    required string user_name        = 1;
    optional int64  favourite_number = 2;
    repeated string interests        = 3;
}

 

위의 그림은 프로토콜 버퍼가 어떻게 직렬 화하는지 원리에 대한 설명이다.

위의 코드는. proto파일로 그림에 사용된 객체 설명이라고 보면 된다.

그림의 설명처럼 핵심은 userName 같은 불필요한 속성 값을 숫자(1,2,3,...)로 대체해버린 것이다.

데이터의 최초 1바이트를 5bit , 3bit로 나눠서 앞에 5bit는 proto파일에 달아놓은 태그(번호)를 나타내는 것으로 비트로 "00001" 이렇게 하면 1번으로 지정한 속성이라는 것이고, 뒤에 3bit로는 타입을 표현해서 비트로 "010"이 String임을 알려준다. 그래서 처음 1바이트에는 메타 정보가 들어가는 것이고, 그다음인 두 번째 바이트는 뒤로 이어질 데이터의 길이를 알려준다.

이런 원리로 데이터를 표현하게 되면 같은 데이터여도 33byte만으로도 표현할 수 있게 되는 것이다.

 


protocol buffer 사용 흐름

 

 

1. *. proto 파일에서 메시지 형식 작성

2. protoc 컴파일러를 통해 원하는 언어로 컴파일

3. 프로토콜 버퍼를 사용하는 전체 목적은 데이터를 다른 곳에서 구문 분석할 수 있도록 직렬화, 인코딩  ( 마샬링 ) 

4. 직렬화된 데이터를 사용하기 위해 디코딩 ( 언마샬링 ) 

 

. PROTO 파일 작성 방법

GPRC를 쓰기 위해서는. proto 파일 작성 할 때 문법에 대해서 알아야 된다.

해당 사이트를 들어가서 보면 type으로 어떤 유형을 쓸 수 있는지 그리고 실 사용에 유용한 방법들이 나와있다.

 

https://coding-start.tistory.com/353

 

gRPC - Protobuf란? 구글 프로토콜 버퍼(protocol buffers)

이전 포스팅에서는 grpc를 이용하여 간단하게 client-server 애플리케이션을 작성하였다. 간단하게 감을 익혀봤으니, 세세한 부분을 스터디 해본다. 오늘은 Protobuf(proto3)에 대해 다루어본다. 메시지

coding-start.tistory.com

 

 추후에. proto 파일 문법에 대해서 블로깅 시간을 가질 예정이다.

'GRPC' 카테고리의 다른 글

GRPC 란?  (0) 2022.05.21
HTTP2 란 ?  (0) 2022.05.03
RPC 란?  (0) 2022.05.01