Protocol Buffers 도구
Protocol Buffers 메시지 인코딩, 디코딩 및 검증
Proto 스키마
스키마 정보
입력
스키마를 파싱하고 메시지 유형을 선택하여 폼 필드를 생성하세요
출력
Raw 필드
| 필드 번호 | 와이어 유형 | 값 |
|---|
Protocol Buffers 문서
Protocol Buffers란?
Protocol Buffers(Protobuf)는 Google에서 개발한 언어 중립적, 플랫폼 중립적인 구조화된 데이터 직렬화 메커니즘입니다. 데이터 직렬화에 있어 XML 및 JSON보다 작고, 빠르며, 간단합니다.
주요 기능
- 언어 및 플랫폼 중립적
- XML/JSON보다 작고 빠름
- 스키마 정의를 통한 강력한 타이핑
- 하위 및 상위 호환성
- 자동 코드 생성
- 효율적인 바이너리 인코딩
이 도구 사용 방법
- 스키마 에디터에 .proto 스키마 정의를 입력하세요
- 스키마 파싱을 클릭하여 스키마를 검증하고 파싱하세요
- 작업할 메시지 유형을 선택하세요
- 인코딩: JSON 데이터를 입력하고 인코딩을 클릭하세요
- 디코딩: 바이너리 데이터를 입력하고 디코딩을 클릭하세요
- Raw 디코딩을 사용하여 스키마 없이 바이너리 데이터 분석
도구 기능
인코딩
JSON 데이터를 Protocol Buffers 바이너리 형식으로 변환합니다. 유형 검증과 함께 쉬운 데이터 입력을 위한 폼 기반 입력을 지원합니다.
디코딩
Protocol Buffers 바이너리 데이터를 읽을 수 있는 JSON 형식으로 다시 변환합니다. Base64, Hex 및 C 스타일 hex 입력 형식을 지원합니다.
Raw 디코딩
스키마 없이 protobuf 바이너리 데이터를 분석합니다. 디버깅, 리버스 엔지니어링 또는 알 수 없는 메시지 분석에 유용합니다.
폼 입력
스키마를 기반으로 입력 폼을 생성하는 사용자 친화적인 폼 인터페이스입니다. 중첩 메시지, 열거형 및 repeated 필드를 지원합니다.
Proto 구문 참조
Protocol Buffers는 메시지 유형 정의를 위한 간단한 구문을 사용합니다:
syntax = "proto3";
message Person {
string name = 1;
int32 id = 2;
string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
string number = 1;
PhoneType type = 2;
}
repeated PhoneNumber phones = 4;
}
syntax: protobuf 버전 지정 (proto2 또는 proto3)message: 필드가 있는 메시지 유형 정의field: 각 필드는 유형, 이름 및 고유 번호를 가짐enum: 열거형 유형 정의repeated: 필드를 repeated로 표시 (배열/리스트)optional: 필드를 optional로 표시 (proto3)
스칼라 유형
Protocol Buffers는 다양한 스칼라 유형을 지원합니다:
| 유형 | 설명 | 기본값 |
|---|---|---|
| int32, int64 | 부호 있는 정수 (가변 길이 인코딩) | 0 |
| uint32, uint64 | 부호 없는 정수 | 0 |
| sint32, sint64 | ZigZag 인코딩을 사용하는 부호 있는 정수 (음수에 효율적) | 0 |
| fixed32, fixed64 | 고정 너비 부호 없는 정수 (4 또는 8 바이트) | 0 |
| sfixed32, sfixed64 | 고정 너비 부호 있는 정수 (4 또는 8 바이트) | 0 |
| float, double | 부동 소수점 숫자 (32 또는 64비트) | 0.0 |
| bool | 불리언 값 (true/false) | false |
| string | UTF-8 인코딩된 텍스트 문자열 | "" |
| bytes | 임의의 바이너리 데이터 | empty |
와이어 유형
Protobuf는 와이어 유형을 사용하여 바이너리 데이터에서 값을 읽는 방법을 결정합니다:
| 와이어 유형 | 의미 | 사용처 |
|---|---|---|
| 0 | Varint | int32, int64, uint32, uint64, sint32, sint64, bool, enum |
| 1 | 64-bit | fixed64, sfixed64, double |
| 2 | Length-delimited | string, bytes, embedded messages, packed repeated |
| 5 | 32-bit | fixed32, sfixed32, float |
모범 사례
- 새 프로젝트에는 proto3 구문을 사용하세요 - 더 간단하고 광범위하게 지원됩니다
- 필드 번호를 안정적으로 유지하세요 - 기존 필드의 번호를 재사용하거나 변경하지 마세요
- 데이터를 명확하게 설명하는 의미 있는 필드 이름을 사용하세요
- 자주 사용되는 필드에는 필드 번호 1-15를 사용하세요 (1바이트 사용)
- 값의 배열/리스트에는 'repeated' 키워드를 사용하세요
- 가능한 값의 고정 세트가 있는 필드에는 enum을 정의하세요
자주 묻는 질문
proto2와 proto3의 차이점은 무엇인가요?
Proto3는 required 필드를 제거하여 구문을 단순화하며, 모든 필드가 기본적으로 선택 사항입니다. 또한 기본값을 변경하고 스칼라 유형에 대한 필드 존재 감지를 제거합니다. 새 프로젝트에는 Proto3가 권장됩니다.
스키마 없이 protobuf를 디코딩할 수 있나요?
네! 'Raw 디코딩' 기능을 사용하여 스키마 없이 바이너리 데이터를 분석할 수 있습니다. 필드 이름은 숫자(field_1, field_2 등)로 표시되며 일부 유형 정보가 모호할 수 있습니다.
인코딩된 데이터가 예상과 다른 이유는 무엇인가요?
Protobuf 인코딩은 결정론적이지만, proto3에서는 공간을 절약하기 위해 기본값(0, false, 빈 문자열)이 일반적으로 인코딩되지 않습니다. 또한 JSON의 필드 순서는 바이너리 인코딩에 영향을 미치지 않습니다.
중첩 메시지는 어떻게 처리하나요?
스키마에서 중첩 메시지를 정의하고 중첩된 JSON 객체를 사용하세요. 폼 모드에서는 중첩 필드 버튼을 클릭하여 중첩 데이터 편집을 위한 대화상자를 열 수 있습니다.
일반적인 사용 사례
- 마이크로서비스의 서비스 간 통신 (gRPC)
- 데이터 저장 및 캠싱
- 구성 파일
- 네트워크 프로토콜 및 API