[gRPC]gRPC-1.개념

gRPC란

gRPC는 구글이 최초로 개발한 오픈 소스 원격 프로시저 호출(RPC) 시스템 입니다. 전송을 위해 HTTP/2를 사용하며 인터페이스 정의 언어로 프로토콜 버퍼를 사용하며 인증, 양방향 스트리밍 및 흐름 제어, 차단 및 비차단 바인딩, 취소 및 타임아웃 등의 기능을 제공 합니다.

프로토콜 버파란

프로토콜 버퍼(protocol Buffer)란 직렬화 데이터 구조입니다. (XML,JSON 와 비슷한)

프로토콜 버퍼는 같은 데이터를 보내더라도 크기가 작기 떄문에 동일 시간에 더 많은 데이터를 보낼 수 있으며 별도의 파싱이 필요 없게 됩니다.
하지만 JSON 구조는 사람이 읽기 편한 반면에 프로토콜 버퍼는 사람이 읽기 어려우며 proto 문법을 배워야 하는 단점도 존재 합니다.

protocol buffer 문법

protocol buffer 형태

1
2
3
4
5
6
7
8
9
10
11
12
13
14
yntax = "proto3";
package PB.Simple;
option java_package = "com.model.protobuf";

message SimpleProtoBufMessage {
int32 id = 1;
string message = 2;
enum MessageType {
PING = 0;
REQUEST = 1;
RESPONSE = 2;
}
MessageType messageType = 3;
}

syntax 는 컴파일할 대상 protobuf 버전을 지칭하며 java_package 와 같은 것들은 option 으로 지정되어 자바로 컴파일 시에만 적용됩니다.
위의 message 는 클래스로 매핑이 되며 그 안의 멤버변수들은 1, 2, 3 과 같은 연속된 숫자가 값으로 할당되는데 이는 직렬화 순서를 의미합니다.

기본 자료형

  • double(double)
  • float(float)
  • int32(int)
  • int64(long)
  • uint32(int)
  • uint64(long)
  • sint32(int)
  • sint64(long)
  • fixed32(int)
  • fixed64(long)
  • sfixed32(int)
  • sfixed64(long)
  • bool(bool)
  • string(String)
  • byte(ByteString)

default 값

  • string -> “”
  • bytes -> “”
  • bool -> false
  • numeric -> 0
  • enums -> 첫번 째 enum 값

enums type

option allow_alias = true;를 설정하면 서로 다른 필드에 대해서 같은 태그 번호(1)를 줄 수 있다.

설정하지 않으면 서로 다른 필드에 같은 태그 번호를 붙일 수 없다.

enum 값은 32비트 정수 범위여야만 한다. (varint encoding을 사용해서 비효율적이란다.)

message type안에 enum을 정의해도 된다. 정의한 enum은 .proto파일의 모든 message type에서 접근 가능하다.

필드 번호 지정 룰

필드 번호를 지정할 때는 1번에서 15번까지는 1바이트를 사용하고 16번부터 2047번 까지는 2바이트를 사용한다. 따라서 자주 발생하는 메세지의 필드 번호는 1~15를 매기는 것이 성능, 데이터 크기에 유리하다)
필드 번호 최소 - 1, 최대 2^29-1(536,870,911)
단, 19000~19999번은 예약된 번호라 사용하면 안된다.
singular필드는 0~1, repeated필드는 0~N개가 있다.

수식어

required, optional, repeated는 modifier(수식어)라고 하는데, 해당 필드가 반드시 필요한지와 선택인지 또는 반복되는지를 나타내기 위해 사용합니다.

required 는 proto3에서 없어졌고, optional 은 proto3에서 기본형이라 역시 사라졌습니다.