본문 바로가기

SIA 인턴

Protocol Buffer

Protocol Buffer

프로토콜 버퍼는 구조화된 데이터를 직렬화하기 위한 Google의 언어에 종속되지 않고, 플랫폼에도 종속되지 않으며 확장 가능한 메커니즘이다. XML보다 더 작고 빠르고 간단하다. 데이터를 한 번 구성하는 방법을 정의한 다음 생성된 코드를 사용하여 구조화된 데이터를 쉽게 읽고 쓸 수 있다. 

 

- 구글에서 개발하고 오픈소스로 공개한 직렬화 데이터 구조이다. 

- 직렬화는 데이터를 바이너리 스트림 형태로 저장하는 행위를 말한다.

- 다양한 언어로 컨버팅 가능하다.(Java, Python, Objective-C, C++, JavaScript, Ruby)

 

프로토콜 버퍼란 직렬화 데이터 구조(Serialized Data Structure)이다.(XML, JSON과 유사) 직렬화 속도가 빠르고 직렬화된 파일의 크기도 작아서 Apache Avro 파일 포맷과 함께 사용된다. 

 

컴퓨터가 데이터를 저장할 때 결국은 0과 1을 나타내는 비트로 표현해야 한다는 것을 알아야한다. 데이터를 파일에 쓰든 네트워크에 쓰든 결국에는 0과 1인 비트로 표현해야 한다.

 

UTF-8 문자열 인코딩을 생각해보자. 만약 "hello"라는 문자 데이터를 다른 서버에 보낼 때 어떻게 될까? h,e,l,l,o 각각에 대한 인코딩을 통해 16진수로 표현하면 68(h) 65(e) 6C(I) 6F(o) 로 표현된다. 이것이 문자열 직렬화이다. 이것만 직렬화는 아니다. 객체 직렬화도 있다. 

 

 

직렬화란 데이터를 파일로 저장하거나 또는 네트워크로 전송하기 위해서 바이너리 스트림 형태로 저장하는 행위다. 특히 GRPC라는 네트워크 프로토콜의 경우 HTTP 2.0을 기반으로 하면서, 메시지를 이 프로토콜 버퍼를 이용하여 직렬화하기 때문에, 프로토콜 버퍼를 이해해놓으면 GRPC를 습득하는 것은 상대적으로 쉽다.

 

JSON 형태의 포맷을 보자.

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

 

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

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 만으로도 표현할 수 있게 되는 것이다.

 

프로토콜 버퍼는 하나의 파일에 최대 64MB까지 지원할 수 있으며, 재미있는 기능 중 하나는 JSON 파일을 프로토콜 버퍼 파일 포맷으로 전환이 가능하고, 반대로 프로토콜 버퍼 파일도 JSON으로 전환이 가능하다.

 

 

 

구조 및 사용 방법

프로토콜 버퍼를 사용하기 위해서는 저장하기 위한 데이터형을 proto file이라는 형태로 저장한다. 프로토콜 버퍼는 하나의 프로그래밍 언어가 아니라 여러개의 프로그래밍 언어를 지원하기 때문에, 특정 언어에 종속성이 없는 형태로 데이터 타입을 정의하게 되는데, 이 파일을 proto file이라고 한다.

 

이렇게 정의된 데이터 타입을 프로그래밍 언어에서 사용하려면, 해당 언어에 맞는 형태의 데이터 클래스로 생성을 해야하는데, protoc 컴파일러로 proto file을 컴파일하면 각 언어에 맞는 데이터 클래스 파일을 생성해준다.

 

 

생성된 데이터 파일을 프로그래밍 언어에서 불러서, 데이터 클래스를 사용하면 된다.

JSON과 같이 계층을 가지거나 배열형의 데이터 구조도 같이 정의할 수 있고, enum과 같은 타입 정의도 가능하다. 

 

Protocol Buffer 특징

- 우선 통신이 빠르다. 같은 데이터를 보내더라도 데이터의 크기가 작으니까 같은 시간에 더 많은 데이터를 보낼 수 있다.

- 직렬화, 역직렬화 속도가 빠르고 직렬화된 파일의 크기를 월등히 줄일 수 있어 대용량 데이터를 처리할 때 성능이 더 좋다.

 

클라이언트에서 서버로 HTTP / JSON 과 같은 REST API를 구현할 때, 전송 전에, JSON 프로토콜 버퍼 포맷으로 직렬화해서, 전체적인 패킷양을 줄여서 전송하고, 서버에서는 받은 후에, 다시 JSON으로 풀어서 사용하는 구조를 취할 수 있다.(GRPC)

API 게이트웨이를 백엔드 서버 전면에 배치 해놓고,  프로토콜 버퍼로 들어온 메시지 바디를 JSON으로 변환해서 API에 넘겨주는 식의 구현이 가능하다.

 

Reference

 

Protocol Buffers

Protocol Buffers are a language-neutral, platform-neutral extensible mechanism for serializing structured data.

protobuf.dev

 

Protocol Buffer 원리로 배우는 고성능 직렬화, 역직렬화 전략! Protocol Buffer 예제 테스트(구글이 쓰는

프로토콜 버퍼가 무엇인가 프로토콜 버퍼(Protocol Buffer = protobuf)란 직렬화 데이터 구조다. (XML, JSON과 유사) 직렬화 데이터 구조를 알려면 직렬화(Serialization)가 뭔지 알아야한다. 꽤 긴데 천천히 설

jeong-pro.tistory.com

 

구글 프로토콜 버퍼 (Protocol buffer)

구글 프로토콜 버퍼조대협 (http://bcho.tistory.com) 텐서 플로우로 모델을 개발하다가 학습이 끝난 모델을 저장하여, 예측하는 데 사용하려고 하니, 모델을 저장하는 부분이 꽤나 복잡하여 찾아보니,

bcho.tistory.com

 

 

프로토콜 버퍼란 무엇인가(Protocol Buffer) 서버, 클라이언트 예제와 함께 feat. express & Vue

회사에서 주로 mfc를 다루다가 최근 웹프론트엔드 파트 업무를 맡게 되면서 한꺼번에 html, css, javascript, vue를 접하게 되었다...혼돈... 틀린 부분이 있다면 알려주시면 감사하겠습니다(❁´◡\`❁)

velog.io

 

'SIA 인턴' 카테고리의 다른 글

Ovision Admin 페이지 개발 | SIA 인턴  (0) 2023.03.14
OpenLayers 개념 및 용어 정리  (2) 2023.02.22