boraBong

[iOS] gRPC(1) - gRPC 개념 본문

iOS/Feat

[iOS] gRPC(1) - gRPC 개념

보라봉_ 2023. 3. 14. 00:16
728x90

💡 gRPC란?

  • 네트워크 상태나 콜 방식을 신경쓰지 않고 프로그래머가 원격의 함수를 실행하는 것
  • gRPC는 고성능 오픈소스 RPC(Remote Procedure Call) 프레임워크로서 HTTP/2 기반의 프로토콜 버퍼(Protobuf)를 이용해 다양한 언어와 플랫폼 간 통신을 지원합니다.
  • gRPC는 protobuf를 이용해 메시지를 직렬화하고, 이를 전송하고 수신 측에서는 다시 역직렬화하여 사용합니다. 이를 통해, 데이터 전송량과 네트워크 대역폭을 최소화하고, 성능을 최적화할 수 있습니다.
  • gRPC는 다수의 동시 요청과 응답 처리, 양방향 스트리밍 및 효율적인 데이터 압축 등의 기능을 제공합니다. 또한, 다양한 인증 및 보안 기능을 제공하여 안전한 통신을 보장합니다.
  • gRPC에서는 protobuf를 이용하여 IDL(Interface Definition Language)을 정의합니다. 이를 통해 서버와 클라이언트 간의 통신 프로토콜을 쉽게 정의할 수 있습니다. gRPC는 다양한 언어의 라이브러리와 툴킷을 제공하여 간편하게 사용할 수 있습니다.

🤖 gRPC를 사용하는 이유

gRPC는 HTTP/2 레이어 위에서 Protocol Buffers(이하 protobuf)를 사용해 직렬화된 바이트 스트림으로 통신하므로 JSON 기반의 통신보다 더 가볍고 그만큼 통신 속도가 빠릅니다. 때문에 internal 통신이 빈번한 마이크로 서비스 구조에서 gRPC를 적용했을 때 latency 감소 및 더 많은 트래픽을 처리하는 성능의 이점을 기대해 gRPC를 도입해볼 수 있습니다.

 

또한 protobuf와 gRPC는 각 서비스의 API를 정의하는 source of truth가 될 수 있어 기존 API 문서의 업데이트 문제를 해결할 수 있다는 장점이 있습니다 !

  1. 클라이언트와 서버 간에 전송되는 데이터 모델이 단일 소스에서 유지됨.
    • 데이터 모델의 변경이 있을 때, 클라이언트와 서버 모두에서 적용됨.
    • 이는 불일치 및 호환성 문제를 방지하며, 개발자가 유지 보수하는 데이터 모델의 수를 줄일 수 있다는 장점을 가짐
  2. 코드 생성을 통해 클라이언트와 서버 사이의 통신 프로토콜이 자동으로 생성
  3. protobuf 파일을 통해 문서화 및 통신 규약에 대한 단일 출처가 제공

🤖 gRPC vs HTTP RESTful API

gRPC와 HTTP RESTful API는 모두 서버-클라이언트 간 통신을 위한 프로토콜이지만 크게 4가지의 차이점을 갖고 있습니다.

  1. 전송 방식:
    • gRPC는 기본적으로 프로토콜 버퍼를 사용하여 바이너리 데이터를 직렬화 및 전송
    • HTTP RESTful API는 텍스트 데이터를 JSON 또는 XML 형식으로 직렬화하여 전송
  2. 속도 및 성능
    • gRPC는 바이너리 데이터 전송과 HTTP/2 프로토콜을 사용하여 높은 속도와 효율성을 제공
    • HTTP RESTful API는 데이터 전송과정에서 JSON 또는 XML 데이터의 변환과 디코딩 등의 작업이 필요하므로 gRPC보다 상대적으로 느릴 수 있음.
  3. 지원되는 언어
    • gRPC는 C++, Java, Python, Go, Ruby, C#, Node.js, Android 및 iOS를 포함한 다양한 언어를 지원
    • HTTP RESTful API는 대부분의 웹 프로그래밍 언어에서 지원
  4. 양방향 스트리밍
    • gRPC는 양방향 스트리밍을 지원 → 즉, 클라이언트와 서버 모두에서 여러 메시지를 동시에 보내고 받을 수 있음! 이러한 방식으로, 실시간으로 데이터를 전송할 수 있게 됨.
    • HTTP RESTful API는 단방향 스트리밍만 지원

따라서, gRPC는 대규모 데이터를 처리하고 실시간 통신을 요구하는 분산 시스템에 적합하고, HTTP RESTful API는 주로 작은 규모의 요청과 응답을 처리하는 경우에 적합하다고 볼 수 있습니다!


그렇다면, gRPC 통신의 핵심이라고 할 수 있는 protobuf 데이터 형식에 대해서도 짚어봅시다.

🤖 Protobuf란?

protobuf(Protocol Buffer = 프로토콜 버퍼)란 직렬화 데이터 구조이다. (XML, JSON과 유사함)

 

직렬화 데이터 구조란?

  • 직렬화(Serialization) 데이터 구조란 객체나 데이터 구조를 바이트 스트림(byte stream) 형태로 변환하는 것을 의미
    • 이때 직렬화된 데이터는 네트워크 상에서 전송하거나 파일로 저장하는 등의 다양한 용도로 사용됨

 

jSON으로 표현

{
	"userName":"Martin",
	"favouriteNumber":1337,
	"interests":["daydreaming","hacking"]
}
  • 공백을 빼고도 82byte 사용

 

protobuf로 표현

syntax = "proto3";

message Person {
  string userName = 1;
  int32 favouriteNumber = 2;
  repeated string interests = 3;
}

  • protobuf를 사용했을 때 → 33byte 사용

 

🤖 protobuf와 jSON, xml이 속도 차이가 나는 이유

Protobuf와 JSON은 둘 다 데이터를 직렬화하고 역직렬화하는 방식으로 데이터를 처리합니다. 그러나 Protobuf는 JSON보다 더 빠른 속도로 데이터를 처리할 수 있다고 합니다.

  1. 직렬화된 데이터 크기(Serialized Data Size):
    • Protobuf는 바이너리 형태로 직렬화됩니다. 이러한 형태는 JSON 형식보다 더 적은 데이터 용량이 필요합니다. 적은 데이터 크기는 데이터 전송 속도를 높이고 처리 시간을 단축시키는 데에 도움을 줍니다.
  2. 파싱 속도(Parsing Speed):
    • Protobuf는 직렬화된 데이터를 파싱할 때, 필요한 데이터만 읽어오기 때문에 JSON에 비해 더 빠른 처리 속도를 가집니다.
  3. 스키마 지원(Schema Support):
    • Protobuf는 데이터 스키마를 사용하여 데이터 유효성 검사를 수행할 수 있습니다. 이러한 검사는 JSON에서 수행하는 추가적인 검증 절차를 줄여 속도를 높일 수 있습니다.
  4. 코드 생성(Code Generation):
    • Protobuf는 컴파일 타임에 자동으로 코드를 생성할 수 있습니다. 이는 런타임에서 JSON을 파싱하는 것보다 더 빠른 속도를 제공합니다.

이처럼 Protobuf는 데이터 크기가 작고 빠른 처리 속도가 필요한 상황에서 JSON보다 성능이 뛰어나다는 것을 알 수 있습니다.

 

 

다음 포스트에서는 iOS에서 gRPC 서버 통신을 하는 예제를 올려보겠습니다😊

 

<참고>

https://blog.banksalad.com/tech/production-ready-grpc-in-golang/

https://jeong-pro.tistory.com/190

반응형
Comments