Backend

ProtoBuf (Protocol Buffers) 란? (Javascript 예제)

판교너굴맨 2021. 6. 30. 10:49
회사 프로젝트 중 각각 다른 언어로 만들어진 두 개의 서버에서 데이터 통신을 효과적으로 하기 위해 메세지 큐와 Proto buf를 학습 하게 되었다. 오늘은 Proto buf 에 대해 정리해보려고 한다.

개요

1. ProtoBuf (Protocol Buffer) 란?

ProtoBuf 공식 문서에서는 다음과 같이 설명하고 있습니다.

Protocol buffers are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data.
(프로토콜 버퍼는 구조화된 데이터직렬화 하기 위한 Google의 언어 중립, 플렛폼 중립, 확장 가능한 메커니즘입니다.)

직렬화 : 객체의 내용을 바이트 단위로 뱐환하여 파일 또는 네트워크를 통해서 스트림(송수신)이 가능하도록 하는 것을 의미한다.

작동 순서

1. .proto 파일에서 message 형식을 작성한다. (스키마 작성)

2. protoc 컴파일러를 통해 원하는 언어로 컴파일 한다. (각 언어마다 빌드 명령어 확인.)

3. 다른 곳에서 구문 분석을 할 수 있도록 인코딩 해 직렬화 한다. (request)

4. 직렬화 된 데이터를 사용하기 위해 디코딩 한다. (response)

적용

1. 언어 선택

해당 문서는 javascript 기준으로 작성되어 있다.

2. .proto 파일 작성 

아주 간단한 .proto 파일을 만들어 보겠다.

파일 이름은 간단하게 history.proto 라고 하겠다.

syntax = "proto3";

package hisoryServer;

message TestMessage {
  string testId = 1;
  string content = 2;
  string name = 3;
}

syntax : protobuf의 버전을 작성한다. proto3를 가장 많이 사용하는 추세이다.

package : 데이터 구조의 충돌 방지를 위해서 작성한다.

message : 해당 이름의 데이터 구조를 나타낸다 (ex. java의 domain class)

데이터 뒤의 number는 컬럼의 순서가 된다.

oneof : oneof 안에 있는 데이터는 안에 있는 데이터 중 하나만 request 보내주면 된다.

 

더 많은 옵션은 공식 문서를 참고하자.

3. protoc (컴파일러) 설치

protocolbuffers 깃허브에에서 해당하는 운영체제에 맞는 컴파일러 파일을 받아 압축을 풀어준다.

https://github.com/protocolbuffers/protobuf/releases

본인은 protoc-3.8.0-win64 를 받았다.

압축을 풀고 나면 아래와 같이 폴더와 readme 파일이 있다.

readme 파일을 확인하면 아래와 같은 글을 볼 수 있다.

To install, simply place this binary somewhere in your PATH.
(설치하려면 이 바이너리를 PATH 어딘가에 배치하기만 하면 됩니다.)

아래 사진처럼 환경 변수 path에 bin을 추가해주면 protoc가 설치 된다.

아래의 사진처럼 cmd에서 설치된 protoc의 version을 확인할 수 있다.

4. 빌드하기

protoc 컴파일러로 proto file을 컴파일하면, 각 언어에 맞는 형태의 데이타 클래스 파일을 생성해준다.

나는 import_style을 commonjs 방식으로 설정했다. (require / exports)

다른 방식은 공식문서에서 확인할 수 있다.

protoc --js_out=import_style=commonjs,binary:. (protoFileName.proto)

위와 같은 명령어를 실행하면 protoFileName_pb.js 파일이 생성된다.

protoFileName_pb.js 파일을 사용할 서버에 넣어준다.

 

위 내용의 history.proto 파일을 컴파일 하면 아래와 같은 history_pb.js 파일을 생성해준다.

 

5. google-protobuf 설치

yarn add google-protobuf

위의 history_pb.js 파일을 사용하기 위해선 파일을 사용할 서버에서 google-protobuf 라이브러리를 설치해야 한다.

6. 컴파일 된 js 파일 사용하기

사용할 파일에서 아래와 같은 코드를 작성한다.

const protobuf = require("./history_pb");

const name = ["test1", "test2", "test3"];
const testid = ["1", "2", "3"];
const content = ["안녕", "하세요", "개발자입니다."];

const pb = new protobuf.TestMessage();
pb.setName(name);
pb.setTestid(testid);
pb.setContent(content);
console.log(pb);

코드를 실행하면 이미지와 같은 코드가 출력 된다.

.proto 파일에서 message에 데이터 순서를 정해준 대로 출력된다.

message TestMessage {
  string testId = 1;
  string content = 2;
  string name = 3;
}

 

추가) protoc로 컴파일 하지 않고 proto 파일 사용하는 방법

protobufjs 라이브러리를 사용하면 .proto 파일을 컴파일 하지 않고, .proto 파일 그대로 사용할 수 있다.

yarn add protobufjs

개인적으로는 문서화도 잘 되어 있고 사용하기 편리한 것 같다.

ES Module 방식으로도 작성할 수 있다. (import / export)

import protobuf from 'protobufjs';

예제 코드는 npm 사이트Examples을 확인하면 충분히 이해할 수 있다고 생각한다.