[카테고리:] 미분류

  • Protocol Buffers (Protobuf)

    Protobuf란 무엇인가?

    Protocol Buffers(이하 Protobuf)는 Google에서 개발한 언어 중립적이고 플랫폼 독립적인 구조화된 데이터 직렬화 메커니즘입니다[1][2]. XML과 유사하지만 더 작고, 빠르며, 단순한 특징을 가지고 있어 “XML보다 작고 빠른” 데이터 포맷으로 불립니다[1]. Protobuf는 줄여서 “protobuf” 또는 더 간단히 “pb”라고도 부릅니다[3].

    주요 특징과 장점

    효율성과 성능

    Protobuf는 데이터를 바이너리 형태로 직렬화하여 XML이나 JSON 같은 텍스트 기반 형식보다 훨씬 더 작고 빠릅니다[2]. 동일한 데이터를 JSON으로 표현했을 때 82바이트가 필요한 반면, Protobuf로는 33바이트로 표현이 가능합니다[3]. 이는 압축률이 좋고 처리 속도가 빠른 이유입니다[3].

    언어 및 플랫폼 독립성

    Protobuf는 C++, C#, Dart, Go, Java, Kotlin, Objective-C, Python, Ruby 등 다양한 프로그래밍 언어를 지원합니다[1]. Proto3 버전에서는 PHP도 추가로 지원됩니다[1]. 이러한 다중 언어 지원으로 인해 서로 다른 언어로 개발된 시스템 간의 데이터 교환이 용이합니다[2].

    강력한 타입 체크와 데이터 무결성

    Protobuf는 데이터 구조를 엄격하게 정의하고, 타입 체크를 통해 데이터의 무결성을 보장합니다[2]. 이는 런타임 오류를 줄이고 안정적인 데이터 통신을 가능하게 합니다[2].

    확장 가능성

    기존에 정의된 데이터 구조에 필드를 추가하더라도 구 버전과의 호환성을 유지할 수 있습니다[2]. 이는 시스템을 점진적으로 업그레이드할 때 매우 유용한 특성입니다[4].

    동작 원리

    Protobuf의 핵심 동작 원리는 필드명을 숫자 태그로 대체하는 것입니다[3]. 예를 들어, userName 같은 속성명을 field tag로 대체하여 데이터 크기를 줄입니다[3]. 속성값과 TYPE을 조합하여 1바이트 메타정보로 표현할 수 있어 효율적인 데이터 저장이 가능합니다[3].

    Proto2 vs Proto3

    주요 차이점

    Proto2와 Proto3는 문법에서 중요한 차이점이 있습니다[5]. Proto3에서는 requiredoptional 필드 규칙이 사라지고, repeated만 사용됩니다[5]. Proto3이 더 많은 언어를 지원하고 새로운 기능을 제공하므로 현재는 Proto3 사용이 권장됩니다[5].

    지원 언어

    • Proto2: C++, Java, Python, Go[5]
    • Proto3: C++, Java, Python, Go, Ruby, Objective-C, C#, JavaScript, PHP, Dart[5]

    메시지 정의와 문법

    기본 구조

    syntax = "proto3";
    
    message Person {
        string name = 1;
        int32 id = 2;
        string email = 3;
    }

    데이터 타입

    Protobuf는 다양한 기본 데이터 타입을 지원합니다[6][7]:

    • 정수형: int32, int64, uint32, uint64, sint32, sint64
    • 부동소수점: float, double
    • 불린형: bool
    • 문자열: string (UTF-8 또는 7bit ASCII)
    • 바이트 배열: bytes
    • 고정길이: fixed32, fixed64, sfixed32, sfixed64

    필드 규칙

    Proto3에서는 다음과 같은 필드 규칙을 사용합니다[8]:

    • 기본 필드: 기본적으로 선택적(optional) 성격
    • repeated: 배열 형태의 필드로 0개 이상의 값을 가질 수 있음

    태그 번호

    각 필드는 고유한 태그 번호를 가져야 합니다[8]. 태그 번호는 1부터 536,870,911까지 사용 가능하며, 19,000~19,999는 Protocol Buffer 구현을 위해 예약되어 있습니다[9]. 1~15번 태그는 1바이트로 인코딩되어 효율적이므로 자주 사용되는 필드에 할당하는 것이 좋습니다[8].

    사용 방법

    1. Proto 파일 작성

    먼저 .proto 파일에 메시지 형식을 정의합니다[3]:

    syntax = "proto3";
    package example;
    
    message Person {
        string name = 1;
        int32 id = 2;
        string email = 3;
    }

    2. 컴파일러 설치

    Protocol Buffer 컴파일러(protoc)를 설치해야 합니다[10]. 공식 GitHub 릴리스 페이지에서 운영체제에 맞는 컴파일러를 다운로드할 수 있습니다[11].

    3. 코드 생성

    protoc 컴파일러를 사용하여 원하는 언어로 컴파일합니다[3]:

    protoc --python_out=. person.proto

    4. 직렬화와 역직렬화

    생성된 코드를 사용하여 데이터를 직렬화(마샬링)하고 역직렬화(언마샬링)합니다[3][12]:

    # 메시지 생성 및 직렬화
    person = Person(name="John Doe", id=1234, email="jdoe@example.com")
    serialized_data = person.SerializeToString()
    
    # 역직렬화
    new_person = Person()
    new_person.ParseFromString(serialized_data)

    gRPC와의 관계

    Protobuf는 gRPC의 기본 데이터 직렬화 형식으로 사용됩니다[13]. gRPC는 HTTP/2 기반의 원격 프로시저 호출(RPC) 프레임워크이며, Protobuf를 사용하여 구조화된 데이터를 효율적으로 전송하고 파싱합니다[13]. gRPC를 활용하려면 Proto3 문법을 사용해야 합니다[8].

    주요 사용 사례

    분산 시스템 간 통신

    마이크로서비스 아키텍처에서 서비스 간 효율적인 데이터 교환을 위해 사용됩니다[2]. 특히 서로 다른 언어로 구현된 서비스들 간의 통신에서 그 효과를 발휘합니다[2].

    데이터 저장

    설정 파일, 옵션 등의 구조화된 데이터를 파일이나 데이터베이스에 저장할 때 사용됩니다[2]. 바이너리 형식으로 저장되어 공간 효율성이 뛰어납니다[2].

    모바일 및 웹 클라이언트

    서버와 클라이언트 간 통신에서 데이터 전송량을 최소화하기 위해 사용됩니다[2]. 특히 네트워크 대역폭이 제한적인 모바일 환경에서 유용합니다[2].

    고급 기능

    Any 타입

    Any 타입을 사용하면 메시지를 정의 없이 포함된 형식으로 사용할 수 있습니다[14]. 이는 동적 메시지 처리가 필요한 경우에 유용합니다[14].

    예약 필드

    향후 호환성을 위해 특정 필드 번호나 이름을 예약할 수 있습니다[8]:

    message Foo {
        reserved 3, 9, 5 to 7;
        reserved "leo", "dabin";
    }

    Reflection 활용

    Protobuf는 Reflection 기능을 지원하여 정의된 필드와 값에 동적으로 접근할 수 있습니다[15]. 이를 통해 소스 코드 수정 없이 다양한 기능을 추가할 수 있습니다[15].

    한계점과 고려사항

    가독성 문제

    바이너리 데이터로 표현되기 때문에 사람이 직접 확인하기 어렵다는 단점이 있습니다[3]. 디버깅 시에는 별도의 도구가 필요할 수 있습니다[6].

    상속과 추상화 미지원

    Protobuf는 객체지향 프로그래밍의 상속과 추상화를 지원하지 않습니다[4]. 이는 복잡한 데이터 구조 설계 시 제약사항이 될 수 있습니다[4].

    하위 호환성 관리

    기존 데이터 구조를 변경할 때는 신중해야 합니다[4]. 필드를 삭제하거나 변경하는 대신 새로운 필드를 추가하는 방식으로 호환성을 유지해야 합니다[4].

    성능 최적화 팁

    필드 순서 최적화

    자주 사용되는 필드에는 1~15번의 낮은 태그 번호를 할당하여 인코딩 효율성을 높일 수 있습니다[8]. 사용되지 않는 필드는 전송되지 않아 성능상 이점이 있습니다[10].

    데이터 타입 선택

    적절한 데이터 타입을 선택하는 것이 중요합니다[6]. 예를 들어, 음수 연산이 많은 경우 sint32, sint64를 사용하는 것이 효율적입니다[7].

    Protobuf는 현대 분산 시스템에서 효율적이고 안정적인 데이터 통신을 위한 핵심 기술로 자리잡았습니다[2]. 특히 성능이 중요한 환경에서 JSON이나 XML 대비 뛰어난 효율성을 제공하며, 다양한 언어와 플랫폼 간의 원활한 데이터 교환을 가능하게 합니다[1][2].

    출처
    [1] Protocol Buffers Documentation https://protobuf.dev
    [2] Protobuf: 구글이 개발한 직렬화 데이터 구조 https://wikidocs.net/235940
    [3] Protocol Buffer 란? – yoongrammer – 티스토리 https://yoongrammer.tistory.com/14
    [4] Google Protobuf 사용 시 알아두어야 할 몇가지 Tip 들 정리 https://jins-dev.tistory.com/entry/Google-Protobuf-%EC%82%AC%EC%9A%A9-%EC%8B%9C-%EC%95%8C%EC%95%84%EB%91%90%EC%96%B4%EC%95%BC-%ED%95%A0-%EB%AA%87%EA%B0%80%EC%A7%80-Tip-%EB%93%A4-%EC%A0%95%EB%A6%AC
    [5] ProtoBuf (Protocol Buffer, 프로토콜 버퍼) – 코딩관계론 – 티스토리 https://bjwan-career.tistory.com/112
    [6] Protobuf 프로토콜버퍼란? – woodadada 개발 블로그 – 티스토리 https://woodadada16.tistory.com/79
    [7] Protocol Buffers – velog https://velog.io/@w00j00ng351/protobuf
    [8] Protobuf 문법 – leo_history – 티스토리 https://leo-history.tistory.com/36
    [9] 번역)proto3 가이드 – velog https://velog.io/@wy9295/%EB%B2%88%EC%97%ADproto3-%EA%B0%80%EC%9D%B4%EB%93%9C
    [10] Google Protobuf 정리 내용 및 사용방법 https://jins-dev.tistory.com/entry/Google-Protobuf-%EC%A0%95%EB%A6%AC-%EB%82%B4%EC%9A%A9-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B0%A9%EB%B2%95
    [11] ProtoBuf (Protocol Buffers) 란? (Javascript 예제) https://myung-ho.tistory.com/57
    [12] gRPC 개념 – 코딩관계론 – 티스토리 https://bjwan-career.tistory.com/110
    [13] C++에서 gRPC와 Protobuf를 이용한 마이크로서비스 구현 – IT trip https://ko.ittrip.xyz/c-plus-plus/cpp-grpc-protobuf-microservices
    [14] .NET 앱에 대한 Protobuf 메시지 만들기 https://learn.microsoft.com/ko-kr/aspnet/core/grpc/protobuf?view=aspnetcore-7.0
    [15] Google Protocol Buffer – 네이버블로그 https://blog.naver.com/skywood1/100148735846
    [16] Protocol Buffers – Google’s data interchange format – GitHub https://github.com/protocolbuffers/protobuf
    [17] What is JSON vs XML vs Protobuf? – Design Gurus https://www.designgurus.io/answers/detail/what-is-json-vs-xml-vs-protobuf
    [18] 프로토콜 버퍼 v3 | Cloud API Design Guide https://cloud.google.com/apis/design/proto3
    [19] ProtoBuf에 대한 정리 와 예제를 통한 사용 방법 확인 – Dev 메모장 https://aq3aq4.github.io/back-end/protobuf/grpc/protobuf1/
    [20] protobuf 사용하기 https://dulidungsil.tistory.com/entry/protobuf
    [21] [ProtoBuf] Google Protocol Buffer 사용법 – Trillion – 티스토리 https://tribal1012.tistory.com/274
    [22] 구글 프로토콜 버퍼 (Protocol buffer) – 조대협의 블로그 https://bcho.tistory.com/1182
    [23] Protocol Buffers – Wikipedia https://en.wikipedia.org/wiki/Protocol_Buffers
    [24] What Is Protobuf? | Postman Blog https://blog.postman.com/what-is-protobuf/
    [25] Google Protocol Buffers 소개 https://mansoo-sw.blogspot.com/2016/10/protocol-buffers.html
    [26] gRPC의 내부 구조 파헤치기: HTTP/2, Protobuf 그리고 스트리밍 https://tech.ktcloud.com/254
    [27] protocol buffers(protobuf) 톺아보자. (는 훼이크, 간단히 알아보자) https://seungdols.tistory.com/990
    [28] 말로만 듣던 Protobuf, 드디어 써봤습니다. – velog https://velog.io/@s2moon98/%EB%A7%90%EB%A1%9C%EB%A7%8C-%EB%93%A3%EB%8D%98-Protobuf-%EB%93%9C%EB%94%94%EC%96%B4-%EC%8D%A8%EB%B4%A4%EC%8A%B5%EB%8B%88%EB%8B%A4
    [29] [C#서버] Protobuf사용 방법 및 빌드 이벤트와 .bat – 발자취 – 티스토리 https://usingsystem.tistory.com/152