예시)
syntax = "proto3";
message SearchRequest {
string query = 1;
sint32 page_number = 2;
repeated int32 result_per_page = 3;
A a = 4;
InnerMessage innerMessage = 11;
map<string, sint32> mapData = 12;
reserved 5,6,7~10,13;
message InnerMessage {
String s1 = 1;
}
}
enum A {
option allow_alias = true;
v1 = 0;
v2 = 1;
}
Message OutterMessage {
SearchRequest.InnerMessage = 1;
}
service SearchService {
rpc Search(SearchRequest) returns (A);
}
1. syntax = "proto3"
- proto3을 사용한다고 명시, default = proto2
2. message
- deserialize하면 builder class로 생성됨 (java 기준)
3. 자료형
- int32, string 등등 스칼라 타입 (https://developers.google.com/protocol-buffers/docs/proto3#scalar)
- int32는 음수에 비효율적, 음수도 사용하려면 sint32가 더 효율적
- enum
- 다른 메세지
4. Field Number
- string query = 1 에서 1부분을 Field Number라 부름
- 각 필드를 구분짓는 unique 값
- 1부터 시작
5. 그 외 필드 옵션들
- repeated, singular
- singular가 default이고 배열을 사용할때 repeated사용
- reserved
- 필드를 삭제한 후 그 필드의 Field Number를 재사용할 경우 update가 늦은 client에서 장애가 발생할 수 있음
- 이를 방지하기 위해 reserved로 해당 FiledNumber (또는 변수명)을 보호할 수 있음
- ex. reserved 1,2,3~5,6
reserved "foo", "bar"
6. enum
- default는 무조건 0번
- 따라서 0번인 값은 필수
- option allow_alias = true; 을 추가하면 같은 value를 지정해 alias를 만들 수 있음
- ex.
enum A {
option allow_alias = true;
v1 = 0;
v2 = 1;
v3 = 1;
}
7. Nested type
- message 안에 message 선언 가능
- 외부에서 사용할 때는 부모.자식 형태로 사용
- OutterMessage 의 SearchRequest.InnerMessage
8. map
- map<key,value> 형태
- key에는 interger, string 형만 올 수 있음
- repeated 안됨
- value는 값이 없으면 default 값이 들어감 (java 기준)
9. package
package com.my;
message myMessage{..}
message Test {
com.my.myMessage a = 1;
}
10. service
- 통신을 나타내는 service의 interface를 proto 파일에 명시 가능
- ex.
service SearchService {
rpc Search(SearchRequest) returns (A);
}
- SearchRequest 를 받아 A 를 반환
11. options
- option java_package = "com.example.foo";
- 자바의 패키지를 지명하는 옵션
- option java_outer_classname = "Ponycopter";
- 자바 클래스 명 지명하는 옵션
- default는 proto파일 명 : abc_def.proto -> AbcDef.class
- option java_multiple_files = true;
- 여러개의 message들을 한 클래스에서 만들건지 (default = false)
- fasle : 1곳에 중첩해서 만듬, true : 1 message당 1class로 생성
- deprecatd
- ex. int32 old_field = 6 [deprecated = true];
참조.
developers.google.com/protocol-buffers/docs/proto3
'네트워크 통신 > grpc' 카테고리의 다른 글
4. grpc의 여러가지 통신 기법 (0) | 2021.04.25 |
---|---|
3. spring boot에서 grpc 사용하기 (379) | 2021.04.20 |
1. grpc 란 (364) | 2021.04.04 |