본문 바로가기

네트워크 통신/grpc

2. proto3 언어

예시)

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

 

Language Guide (proto3)  |  Protocol Buffers  |  Google Developers

This guide describes how to use the protocol buffer language to structure your protocol buffer data, including .proto file syntax and how to generate data access classes from your .proto files. It covers the proto3 version of the protocol buffers language:

developers.google.com

 

'네트워크 통신 > grpc' 카테고리의 다른 글

4. grpc의 여러가지 통신 기법  (0) 2021.04.25
3. spring boot에서 grpc 사용하기  (379) 2021.04.20
1. grpc 란  (364) 2021.04.04