영주의 개발노트

gRPC와 Protocol Buffers에 대해 알아보자 (2) - Protocol Buffers 본문

STUDY 📖

gRPC와 Protocol Buffers에 대해 알아보자 (2) - Protocol Buffers

0JUUU 2025. 1. 14. 23:45
 

gRPC와 Protocol Buffers에 대해 알아보자 (1)

현회사는 gRPC를 통해 내부 마이크로 서비스 간의 통신을 하고 있다. gRPC라는 것을 처음 들어본 나에게는 굉장히 생소한 개념이라 나와 같이 처음 접하는 사람들에게 도움이 되었으면 하는 바람

0juuu.tistory.com

지난번에 gRPC에 대해 알아보았다. gRPC는 원격 프로시저 호출 프레임워크로, 서로 다른 서비스들이 통신하기 편리하도록 만들어주는 도구이다. gRPC는 서비스 간 데이터를 전송할 때 Protocol Buffers(이하, ProtoBuf)라는 데이터 포맷을 사용한다. 오늘 다뤄볼 내용은 데이터 포맷인 Protol Buffers이다.

 

ProtoBuf 란 무엇인가

구글이 만든 데이터 직렬화 포맷으로, 데이터를 효율적이고 빠르게 전송할 수 있도록 설계된 바이너리 포맷이다. gRPC에서 API의 데이터 구조를 정의할 때 활용한다. 기존에는 API를 주고받을 때 JSON을 많이 사용했다. JSON과의 차이는 무엇일까?

  Protocol buffers(=ProtoBuf) JSON
데이터 크기와 처리 속도 바이너리 데이터 포맷으로 데이터를 압축적으로 표현 텍스트 기반 데이터 포맷으로 key-value 가 명시적으로 표현되기 때문에 크기가 큼
처리 속도 기계가 바이너리 데이터를 바로 읽고 쓸 수 있어 매우 빠름 데이터를 텍스트에서 파싱해야하므로 속도가 느림
가독성 바이너리 데이터로 사람이 읽을 수 없음, 데이터를 디버깅하거나 수정하려면 역직렬화가 필요 사람이 읽기 쉬운 텍스트 형태로, 데이터를 바로 보고 수정할 수 있어 디버깅에 유리
유연성과 확장성 새로운 필드를 추가하거나 변경해도 기존 시스템과 호환성 유지 가능 호환성 유지가 어렵고, 새 필드가 추가되면 클라이언트와 서버에서 명시적으로 처리해야 함
언어 지원 C++, Go, Kotlin, Python 등 다양한 언어에 대해 자동으로 코드를 생성해줌, .proto 파일에서 필요한 코드가 생성되어 개발자가 추가 구현할 필요가 없음 언어에 독립적이며 모든 프로그래밍 언어에서 쉽게 사용할 수 있음, 데이터 구조를 관리하거나 검증하는 기능은 따로 구현 필요

 

ProtoBuf와 JSON은 각각의 장단점이 뚜렷하여 상황에 맞게 선택하는 것이 중요하다. 만약 빠른 속도를 원한다면 ProtoBuf를 사용하는 방향으로 풀어내는 것이 좋을 것이다. 다만, ProtoBuf는 바이너리 데이터로 사람이 읽을 수 없다는 단점이 있다. 시스템을 개발하고 유지보수하는 주체는 사람이다. 사람이 읽을 수 없다면, 아무리 빠르다한들 개발에는 한계가 생길 수밖에 없을 것이다. ProtoBuf는 이러한 문제를 해결하기 위해 .proto 파일을 제공한다. 

 

ProtoBuf 기본 구성 요소

.proto 파일은 ProtoBuf에서 데이터를 정의하는 핵심 구성 요소이다. 우리는 지금부터 상품에 관한 데이터를 정의하고자 한다. 아래와 같은 방법으로 작성할 수 있다. 더 자세한 내용은 Protocol Buffers Documentation에서 확인할 수 있다. 

  1. 데이터 구조 정의
syntax = "proto3"

message Product {
    int32 id = 1;
    string name = 2;
    int32 price = 3;
}
  •   데이터의 필드 이름, 타입, 순서를 정의한다
    • 각 필드는 고유한 번호를 가진다 => 이 번호는 바이너리 포맷에서 필드를 구분하는 데 사용되며 프로토콜의 호환성 유지에도 중요한 역할을 한다
  • 새로운 필드를 추가해도 기존 시스템과 호환성을 유지할 수 있다

    2. 자동 코드 생성

  • .proto 파일을 바탕으로 다양한 언어의 코드가 자동으로 생성된다

 

위와 같은 이점을 가진 ProtoBuf 덕분에 gRPC는 작은 데이터 크기로 빠르게 전송하고, 다양한 언어 지원이 가능하게 되는 것이다. 지금까지 간단하게 protobuf에 대해 알아보았다. protobuf에서 지원하는 타입 등을 공부하면 더 좋을 것 같다. protobuf를 처음 접하는 사람에게 도움이 되었으면 한다.