[GPB] google protoBuf

may_yun·2023년 8월 17일
0

[WORK] 학습내용

목록 보기
17/25
post-custom-banner

구글 프로토콜버퍼

직렬화 데이터 구조

  • 직렬화 속도가 빠르고 직렬화된 파일의 크기가 작아서 APACHE AVRO 파일 포맷과 함께 많이 사용
  • 하나의 파일에 최대 64M까지 지원할 수 있다.
  • JSON 파일을 프로토콜 버퍼 파일 포맷으로 전환이 가능하고 반대로 전환도 가능하다

장점

  • 다른 IDL (XML, JSON)에 비해 적은 용량으로 데이터를 저장할 수 있기 때문에 압축률이 좋고 처리속도가 빠르다.

단점

  • 바이너리 데이터로 표현되기 때문에 확인이 어렵다

사용 방법

  • *.PROTO 파일에 메시지 형식 작성
  • protoc 컴파일러를 통해 원하는 언어로 컴파일
  • 프로토콜 버퍼를 사용하는 전체 목적은 데이터를 다른 곳에서 구분 분석할 수 있도록 직렬화, 인코딩
  • 직렬화된 데이터를 사용하기 위해 디코딩

protoc 컴파일러 설치

구조

syntax = "proto2";

package hiware.auth;

option java_package = "com.netand.hiware.auth.protocol";
//데이터 타입들의 최상위 클래스로 message 단위는 클래스의 하위 클래스로 들어갈 것이다. 
option java_outer_classname = "HWAP";

message Message {
	//필요로 되는 필드(없으면 Exception을 일으키는)를 정의하고 싶을 때, 꼭 required 키워드를 사용
	required MessageType type = 1;
	required bytes body = 2;
	required string version = 3;

}
  • message 단위로 데이터 타입을 생성할 수 있다.
  • optional: 꼭 필요하로 되지 않는 것
  • required : 필수
  • 모든 필드는 인덱싱 처리가 되는데, 1로 표기된 필드는 바이너리 파일의 첫번째 필드로서 저장된다. 2로 표기된 필드는 다음 필드가 된다. 숫자를 표기하는 것은 우리 필드가 메모리에 어떻게 저장될지에 대해 제어할 수 있게 해준다.
  • 바이너리 메시지 포맷의 숫자는 필드를 구별하는데 사용되기 때문에 unique 해야합니다.
    필드 삭제 시, 필드 숫자가 실수로 재사용되지 않도록 reserve 해둬야한다.

📌클래스 생성 후
메세지 타입에 있는 HWAP.Message message = HWAP.Message.newBuilder().set.....
모든 required 필드를 작성한 이후에 build() 메소드를 호출하면 Message 클래스를 만들 수 있다

proto2 : message 안에 enum 열거

: proto2 문법에서는 message 내부에 enum을 정의하여 열거형 값을 지정할 수 있다.

syntax = "proto2";

message MyMessage {
  enum Color {
    RED = 0;
    GREEN = 1;
    BLUE = 2;
  }

  required Color color = 1;
}

MyMessage 라는 메시지 내부에 Color라는 열거형을 정의
각 열거형 값을 RED, GREEN, BLUE로 정의되어 있고 각각 0,1,2의 숫자로 매핑되어있다.
이후 color 필드가 MyMessage에 추가되었는데 이 필드는 Color 열거형의 값 중 하나를 가질 수 있다.


GeneratedMessageV3

  • .parseFrom()
    : 직렬화된 이진 데이터를 역직렬화하여 프로토콜 버퍼 메시지 객체로 변환하는데 사용. 이 메서드는 GeneratedMessageV3 클래스를 상속받은 프로토콜 버퍼 메시지 클래스에서 호출할 수 있다.
    ex)
    바이트 배열로 직렬화된 데이터 byte[] -> 객체로 변경 MyProto.Person

이진 데이터가 올바른 프로토콜 버퍼 형식인지 확인하고 역직렬화하는 데 사용됩니다. 데이터가 유효한 경우 역직렬화가 수행되며, 그렇지 않은 경우 InvalidProtocolBufferException 예외가 발생

import com.google.protobuf.InvalidProtocolBufferException;
import com.example.proto.MyProto;

public class ProtoExample {
    public static void main(String[] args) {
        // 예제 데이터를 바이트 배열로 가정
        byte[] serializedData = ...; // 직렬화된 데이터

        try {
            MyProto.Person person = MyProto.Person.parseFrom(serializedData);
            System.out.println("Name: " + person.getName());
            System.out.println("Age: " + person.getAge());
        } catch (InvalidProtocolBufferException e) {
            e.printStackTrace();
        }
    }
}

참고

profile
개발 일지
post-custom-banner

0개의 댓글