Google Protocol buffer

JJStone·2022년 2월 16일
0

Google protocol buffer

목록 보기
2/2

Protobuf 개요

  • 프로토콜 버퍼는 구글에서 개발하고 오픈소스로 공개한 직렬화 데이터 구조. C++,C#,Go,Java,Python등 다양한 언어를 지원.

장점

  • 바이트 형식으로 저장하게 되고, 이러한 특징으로 인해 데이터의 크기가 작다.
  • 같은 데이터를 보내더라도 데이터 크기가 작아 더 빠르고, 시간당 더 많은 데이터를 보낼 수 있다.
  • 바이트가 오면 그 바이트 그대로 메모리에 써버리고 객체가 가르키면 되어 별도의 파싱이 필요없다.

단점

  • 인간이 읽기 불편하다. .proto 파일이 꼭 있어야 하며 아니면 무슨 의미인지 모른다. 그래서 내부간의 데이터 교환에 자주 쓰인다.
  • .proto 파일을 작성할 수 있도록 proto 문법을 배워야한다. 또한 이러한 .proto 파일이 작성/수정되면 해당 proto파일을 사용하는 시스템끼리는 공유 되어야하며, 사용할 수 있도록 컴파일하여야 한다.

Protocol buffer 문법

(제가 사용하는 언어가 scala라 scala로 이해해보겠습니다.)

  1. syntax : proto2, proto3를 사용할지는 .proto파일의 첫줄에 있어야한다.

  2. package : 자바(스칼라)의 package와 동일.

  3. message : 스칼라의 case class 와 동일.

  4. 필드 타입 출처(https://minusi.tistory.com)

    • double / float
    • int32 / int64 : 가변 길이 인코딩이지만, 음수 인코딩이 비효율적입니다. 음수를 사용할 것 같으면 sint계열을 사용하세요.
    • sint32 / sint64 : 가변 길이 인코딩이지만, int계열보다 효율적으로 음수를 인코딩합니다.
    • uint32 /uint64 : 가변 길이 인코딩입니다.
    • fixed32 / fixed64 : 항상 4바이트를 차지하지만, 2^28보다 큰 수에 대해 uint32에 비해 훨씬 효율적입니다.
    • sfixed32 / sfixed64 : 항상 4바이트를 차지합니다.
    • bool
    • string : 반드시 인코딩이 UTF-8이거나 7비트 아스키 코드여야 합니다.
    • bytes : 임의 길의의 바이트 시퀀스
  5. required : message는 해당 필드를 정확하게 1개만 가진다.

  6. optional : message는 해당 필드를 가지지 않을수도, 1개만 가질수도 있다.

  7. repeated : 스칼라의 List와 동일. 만약 message 2번째 필드에 list : List[Int]를 추가하고싶으면 repeated int32 list = 2

  8. map : 스칼라의 Map과 동일. 만약 message의 3번째 필드에 map : Map[Int, String]을 추가하고 싶으면 map<int32, string> map = 3로 표기

  9. 예시

syntax = "proto3";

package com.scala.test;

message TTT{
    int32 t1 = 1;
}
message Test{
	int32 x1 = 1;
    repeated int32 list = 2;
    map<int32, string> map = 3;
    TTT ttt = 4; // TTT를 타입으로 가진 필드
    repeated TTT tlist = 5; // List[TTT] 필드
}

이 코드를 scalapb gradle 플러그인으로 변환하면 다음과 같다. (일부 발췌)

final case class Test(
    x1: _root_.scala.Int = 0,
    list: _root_.scala.Seq[_root_.scala.Int] = _root_.scala.Seq.empty,
    map: _root_.scala.collection.immutable.Map[_root_.scala.Int, _root_.scala.Predef.String] = _root_.scala.collection.immutable.Map.empty,
    ttt: _root_.scala.Option[com.scala.test.test.TTT] = _root_.scala.None,
    tlist: _root_.scala.Seq[com.scala.test.test.TTT] = _root_.scala.Seq.empty,
    unknownFields: _root_.scalapb.UnknownFieldSet = _root_.scalapb.UnknownFieldSet.empty
    ) extends scalapb.GeneratedMessage with scalapb.lenses.Updatable[Test] ...

.proto -> scala로 변환 (with. scalapb)

  1. 나의 경우 github에 올라와있는 gradle 설정을 참조하여 설정하였다. (참조(scalapb gradle))
  2. 설정 후 Intellij로 실행하면 .proto 파일에서 변환된 스칼라 파일이 나온다. (build 디렉토리)
profile
java, scala 개발자 입니다.

0개의 댓글