ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Protocol Buffer (Protobuf) 프로토버퍼?
    카테고리 없음 2023. 12. 13. 00:37

    프로토콜 버퍼? 뭐지?

    프로토콜 버퍼, 프로토 버퍼, Protobuf 라고도 합니다. 

     

    "프로토콜 버퍼는 구조화된 데이터를 직렬화하기 위한 언어 중립적, 플랫폼 중립적 확장 가능한 메커니즘입니다."

     

    프로토콜 버퍼는 구글에서 만든 언어 및 플랫폼 중립적이며 확장 가능한 매커니즘으로, 구조화된 데이터를 직렬화하는 데 사용됩니다. XML과 유사하지만 더 작고 빠르며 간단합니다. 데이터를 어떻게 구조화할지 한 번 정의한 다음 특수하게 생성된 소스 코드를 사용하여 여러 데이터 스트림 및 언어를 사용하여 구조화된 데이터를 쉽게 읽고 쓸 수 있습니다.

     

    프로토버퍼는 2001년 구글에서 처음 개발했습니다. 개발 목적은 구글의 다양한 제품과 서비스에서 사용되는 데이터 구조를 표준화하는 것이었습니다. 프로토버퍼는 빠르게 인기를 얻었고, 2008년에는 오픈소스로 공개 되었습니다. 

     

    Protobuf 가 인기 있는 이유?

    Protobuf가 공개되고 현재 많은 분야에서 사용되고 있습니다. 왜 이렇게 Protobuf가 인기를 얻게 되었을까요? 몇 가지 이유를 들자면,

     

    1. 언어중립성 : Protobuf는 다양한 프로그래밍 언어에서 사용할 수 있습니다. 이는 서로 다른 언어로 작성된 프로그램 간에 데이터를 교환해야 하는 경우에 매우 유용합니다. protobuf는 C++, C#, Dart, Go, Java, Kotlin, Objective-C, Python 및 Ruby에서 생성된 코드를 지원합니다. proto3를 사용하면 PHP로도 작업할 수 있습니다.  개발언어가 달라도 쉽게 데이터를 교환할 수 있다는 장점이 있습니다. 

     

    2. 플랫폼 독립성 : protobuf로 직렬화된 데이터는 Windows, Linux, macOS, Android 등 다양한 플랫폼에서 사용할 수 있습니다. 이는 다양한 플랫폼에서 실행되는 애플리케이션에서 데이터를 교환해야 하는 경우에 매우 유용합니다.

     

    3. 압축 : 데이터를 압축된 형식으로 저장할 수 있기 때문에 데이터 전송 및 저장에 효율적입니다. 똑같은 데이터를 보다 적은 용량으로 압축해서 전송이 가능하기 때문에 성능면에서 우수하다고 할 수 있습니다. 

     

    4. 확장성 : 새로운필드를 기존 메시지(데이터 구조)에 추가할 수 있습니다. 이는 SW의 요구사항이나 기능이 추가 되는경우에 아주 유용할 수 있습니다. 

     

    Protobuf의 단점?

    일반적으로 JSON이나 XML을 이용한 직렬화 보다 protobuf의 직렬화 데이터가 보다 적은 사이즈를 가지지만, 특정한 상황에서는 protobuf가 용량이 더커지는 경우도 있을 수 있습니다. 예로, 데이터셋이 작은 경우 실제 데이터보다 헤더로 인한 사이즈의 증가가 발생 할 수 있습니다. 아주 작은 데이터를 빈번하게 전송하는 IOT장치의 경우 오히려 성능이 저하 될 수도 있습니다. 

     

    Protobuf 간단 사용법

     

    1. 프로토 버퍼 메시지 정의하기

    프로토 버퍼를 사용하여 직렬화할 데이터 구조를 정의해야 합니다. 이를 위해 프로토 버퍼 메시지를 정의합니다. 프로토 버퍼 메시지는 다음과 같은 구조를 가지고 있습니다.

    message 메시지 이름 {
      필드 정의;
      필드 정의;
      ...
    }
    

    필드 정의는 다음과 같은 형식을 가지고 있습니다.

    필드 이름 : 필드 타입 = 필드 식별자;
    

    필드 이름은 필드의 이름을 나타냅니다. 필드 타입은 필드의 데이터 형식을 나타냅니다. 필드 식별자는 필드의 순서를 나타냅니다.

    예를 들어, 다음은 사용자 프로필 데이터를 나타내는 프로토 버퍼 메시지입니다.

     

    message User {
      string name = 1;
      int32 age = 2;
      string email = 3;
    }
    

    이 메시지에는 다음과 같은 세 개의 필드가 있습니다.

    • name 필드는 문자열 데이터 형식의 필드입니다.
    • age 필드는 정수형 데이터 형식의 필드입니다.
    • email 필드는 문자열 데이터 형식의 필드입니다.

     

    2. 프로토 버퍼 메시지 생성하기

    프로토 버퍼 메시지를 정의했으면, 해당 메시지를 생성합니다. 프로토 버퍼 메시지를 생성하려면 다음과 같은 방법을 사용할 수 있습니다.

    • 직접 생성하기: 프로토 버퍼 메시지의 필드에 직접 값을 할당하여 생성합니다.
    • 상위 클래스에서 상속받기: 상위 클래스에서 프로토 버퍼 메시지를 상속받은 다음, 상위 클래스의 필드에 값을 할당하여 생성합니다.

    예를 들어, 다음은 프로토 버퍼 메시지 User를 직접 생성하는 방법입니다.

    User user = {
      name: "John Doe",
      age: 30,
      email: "johndoe@example.com"
    };
    

     

    3. 프로토 버퍼 메시지 직렬화하기

    프로토 버퍼 메시지를 생성했으면, 해당 메시지를 직렬화합니다. 프로토 버퍼 메시지를 직렬화하려면 다음과 같은 방법을 사용할 수 있습니다.

    • 프로토 버퍼 라이브러리 사용하기: 프로토 버퍼 라이브러리를 사용하여 메시지를 직렬화합니다.
    • 직접 구현하기: 프로토 버퍼 메시지의 구조를 직접 구현하여 메시지를 직렬화합니다.

    예를 들어, 다음은 프로토 버퍼 라이브러리를 사용하여 프로토 버퍼 메시지 User를 직렬화하는 방법입니다.

     
    // 라이브러리 가져오기
    import "google/protobuf/message.proto";
    
    // 메시지 직렬화
    byte[] bytes = user.SerializeToString();
    

     

     

    4. 직렬화된 데이터 처리하기

    프로토 버퍼 메시지를 직렬화했으면, 해당 데이터를 처리합니다. 프로토 버퍼 메시지를 처리하려면 다음과 같은 방법을 사용할 수 있습니다.

    • 프로토 버퍼 라이브러리 사용하기: 프로토 버퍼 라이브러리를 사용하여 데이터를 처리합니다.
    • 직접 구현하기: 프로토 버퍼 메시지의 구조를 직접 구현하여 데이터를 처리합니다.

    예를 들어, 다음은 프로토 버퍼 라이브러리를 사용하여 직렬화된 데이터를 처리하는 방법입니다.

     
    // 라이브러리 가져오기
    import "google/protobuf/message.proto";
    
    // 메시지 역직렬화
    User user = User.ParseFromString(bytes);
    
    // 메시지 필드 출력
    System.out.println(user.name);
    System.out.println(user.age);
    System.out.println(user.email);
    

     

     

Designed by Tistory.