안녕하세요, 코린이의 코딩 학습기 채니 입니다.
개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.
gRPC란?
- google에서 개발한 어느 환경에서 실행할 수 있는 최신 오픈 소스 고성능 RPC 프레임워크
gRPC를 알기 전 RPC가 뭔지 모른다면 아래 아티클을 읽어봅시다!
https://chanychu.tistory.com/536
gRPC 특징
- HTTP/2 기반 전송
- 인증, 추적, 로드 밸런싱 및 상태 확인
- Protocal buffer 사용
Protocal buffer (proto) 란?
- 구조화된 데이터를 직렬화하는 방식
- 직렬화: 데이터를 파일로 저장하거나 네트워크 통신에 사용하기 위한 형식 (바이트 스트림 형태로 변환)
- 정의 언어(.proto 파일에서 생성), proto 컴파일러가 데이터와 인터페이스하기 위해 생성하는 코드, 언어별 런타임 라이브러리, 파일에 기록되거나 네트워크 연결을 통해 전송되는 데이터의 직렬화 형식, 직렬화된 데이터의 조합
- 다른 IDL (XML, JSON)에 비해 더 적은 용량으로 데이터 저장 가능하므로 압축률이 높고 처리 속도가 빠름
- 다만, 바이너리 데이터로 표현하기 때문에 사람이 확인하기 어려움
작동방식 - 샘플 코드 (JAVA)
1. proto 파일에서 직렬화하려는 데이터 구조 정의.proto
확장자를 가진 일반 텍스트 파일이고, 프로토콜 버퍼 데이터는 메시지로 구성된다.
여기서 각 메시지는 필드라고 하는 이름-값 쌍을 포함하는 정보의 작은 논리적 레코드이다.
message Person {
string name = 1;
int32 id = 2;
bool has_ponycopter = 3;
}
위와 같이 메시지를 정의하고 프로토콜 버퍼 컴파일러 (protoc
)를 사용하여 원하는 언어로 데이터 클래스를 생성한다.
- 각 필드에 대한 getter / setter 제공
- 원시 바이트에서 전체 구조 직렬화
- 분석하는 메서드 제공
2. protoc
컴파일러를 이용하여 코드 생성
.proto
파일을 기반으로 Java 코드를 생성한다.
이 때, 새 인스턴스를 만드는 데 사용할 수 있는 Builder 클래스가 생성된다.
3. 프로젝트 코드와 함께 PB 코드 컴파일
생성된 Java 클래스를 아래와 같이 프로젝트에서 사용한다.
Person john = Person.newBuilder()
.setId(1234)
.setName("John Doe")
.setEmail("jdoe@example.com")
.build();
output = new FileOutputStream(args[0]);
john.writeTo(output);
Protocol Buffer 정의 구문
메시지 유형을 정의하는 아래와 같은 .proto
파일이 있다고 가정해보자.
// 1)
syntax = "proto3";
// 2)
message SearchRequest {
string query = 1;
int32 page_number = 2;
int32 results_per_page = 3;
}
각 코드가 의미하는 바는 아래와 같다.
1) proto3
을 사용한다는 의미 (생략하는 경우 자동으로 proto2
사용), 반드시 첫 문단에 작성
2) SearchRequest 메시지는 총 세 개의 필드(이름/ 값)를 가지고, 각 필드는 이름과 유형을 가짐
필드 유형 지정
예제의 있는 query
, page\_number
, results\_per\_page
필드는 모두 scalar 유형이다.
각각 문자열과 정수 유형을 가지고 있다.
필드 번호 할당
필드는 각각 1, 2, 3의 필드 번호를 가지고 있는 것을 확인할 수 있다.
이를 "필드 번호" 라고 지칭하며, 각 필드에는 1~536,870,911
사이의 숫자를 지정해야한다.
가장 자주 설정되는 필드에는 1~15까지의 필드 번호를 사용해야 한다.
대체적으로 낮은 필드 번호 값은 와이어 포맷에서 공간을 덜 차지하기 때문이라고 한다.
⭐️ 필드 번호에 따른 인코딩 시 필요한 바이트에 대한 설명은 아래 문서를 참고하자
https://protobuf.dev/programming-guides/encoding/#structure
제한 사항
- 해당 메시지 내에서 고유한 번호여야 한다.
- 필드번호
19,000~19,999
는 예약된 번호이므로 사용 불가 (Protocal Buffers 구현 시 사용) - 이전에 예약된 필드 번호나 확장에 할당된 필드 번호 사용 불가 (재사용도 불가)
참고 사이트
https://grpc.io/docs/what-is-grpc/introduction/
https://jaime-note.tistory.com/82
https://velog.io/@dojun527/gRPC%EB%9E%80