프로토콜 버퍼 v3

이번 장에서는 API 디자인에 프로토콜 버퍼를 사용하는 방법에 대해서 설명합니다. 개발자 환경을 간소화하여 런타임 효율을 높이려면 gRPC API가 API를 정의하는 데 프로토콜 버퍼 버전 3(proto3)을 사용해야 합니다.

프로토콜 버퍼는 데이터 구조 스키마와 프로그래밍 인터페이스를 정의할 수 있는 인터페이스 정의 언어(IDL)로서 언어 중립적일 뿐만 아니라 플랫폼 중립적이기도 합니다. 이 IDL은 바이너리 통신 형식과 텍스트 통신 형식을 모두 지원할 뿐만 아니라 플랫폼에 따라 여러 가지 다른 통신 프로토콜과 호환됩니다.

Proto3은 최신 버전의 프로토콜 버퍼이며, proto2에서 바뀐 내용은 다음과 같습니다.

  • 기본 필드에서는 hasField라고도 알려진 필드 상태 기능이 기본적으로 삭제됩니다. 설정되지 않은 기본 필드에는 언어를 정의하는 기본 값이 있습니다.
    • 메시지 필드에서는 상태 기능이 여전히 제공되어 컴파일러에서 생성된 hasField 메서드를 사용하여 null 값을 비교하거나 또는 구현체에서 정의하는 센티널 값을 사용하여 테스트될 수 있습니다.
    • protobuf v3.14부터 기본 필드가 기본값을 구별하고 optional 키워드를 사용하여 값 설정을 해제할 수 있지만 일반적으로는 권장되지 않습니다.
  • 사용자 정의 기본 값은 더 이상 필드에 제공되지 않습니다.
  • 열거형 정의는 열거형 값 0부터 시작되어야 합니다.
  • 필수 필드는 더 이상 제공되지 않습니다.
  • 확장자는 더 이상 제공되지 않습니다. 대신 google.protobuf.Any를 사용하세요.
    • 하위 호환성과 런타임 호환성을 이유로 google/protobuf/descriptor.proto에게는 특별히 예외가 허용됩니다.
  • 그룹 구문이 제거됩니다.

위와 같은 기능이 제거된 이유는 API 디자인의 간편성과 안정성, 그리고 성능을 더욱 높이기 위해서입니다. 예를 들어 일부 필드는 민감한 정보를 삭제하는 등 메시지 로깅 이전에 필터링이 필요한 경우가 많습니다. 필수 필드라면 이러한 필터링이 필요하지 않을 것입니다.

자세한 내용은 프로토콜 버퍼를 참조하세요.