본문 바로가기

AI 개발

Protobuf란 무엇인가? – 사용 사례와 실무 사용법

반응형

✨ Protobuf란?

Protocol Buffers(약칭: Protobuf)는 Google이 개발한 데이터 직렬화(serialization) 포맷입니다.
간단히 말하면, 데이터를 작고 빠르고 확장 가능하게 표현하고 전송하기 위한 바이너리 기반 데이터 교환 포맷입니다.

JSON보다 작고, XML보다 빠르며, 다양한 언어에서 사용할 수 있는 "데이터의 공통 언어"입니다.


🚀 어디에 사용될까? – 사용 사례

1. 마이크로서비스 간 통신

  • 다양한 언어로 작성된 마이크로서비스 간의 효율적인 데이터 교환.
  • 예: Python으로 작성된 서버가 Go 기반 서비스에 요청을 보낼 때.

2. gRPC 기반 API

3. IoT 및 엣지 디바이스

  • 네트워크 대역폭이 제한적인 환경에서 압축률이 뛰어난 Protobuf가 효과적.
  • 센서 데이터, 로그 스트리밍 등에 활용.

4. 모바일 앱과 서버 간 통신

  • REST + JSON 구조보다 더 빠르고 데이터 크기가 작아지므로, 모바일 앱의 반응속도 향상.

5. 데이터 저장 포맷

  • NoSQL/DB 또는 로그 시스템에 바이너리 형태로 데이터를 저장할 때도 사용 가능.


🔧 어떻게 사용하는가? – 실전 사용법 (Python 기준)

1. .proto 파일로 데이터 구조 정의

// file: task.proto
syntax = "proto3";

message TaskRequest {
  string type = 1;
  string agent = 2;
  Payload payload = 3;
}

message Payload {
  string text = 1;
  string lang = 2;
}
  • message는 객체 개념
  • 각 필드는 타입 이름 = 고유 번호 형태로 정의
  • 번호는 필드 순서가 아니라, 데이터 포맷의 식별자 역할

2. Python 코드 자동 생성

# protoc 컴파일러 설치 필요
protoc --python_out=. task.proto
  • 실행 결과: task_pb2.py 자동 생성
  • 이 파일에는 TaskRequest, Payload 클래스가 정의됨

3. Python에서 사용하기

▶ 객체 생성 및 값 할당

import task_pb2

req = task_pb2.TaskRequest()
req.type = "task_request"
req.agent = "translator"
req.payload.text = "hello"
req.payload.lang = "ko"

▶ 직렬화 (전송용 바이너리 변환)

data = req.SerializeToString()

▶ 역직렬화 (받은 바이너리 → 객체로 복원)

req2 = task_pb2.TaskRequest()
req2.ParseFromString(data)
print(req2.payload.text)  # 출력: hello

📌 Protobuf vs JSON 간단 비교

항목 Protobuf JSON
포맷 바이너리 텍스트
크기 작음
속도 빠름 느림
타입 안전성 높음 (스키마 기반) 낮음
인간 가독성 없음 있음
버전 관리 용이 수동 처리 필요

gRPC, 마이크로서비스, IoT, 모바일 통신 등 현대적인 분산 시스템에서 점점 더 많이 활용되고 있습니다.

초기에 설정이 조금 복잡하더라도, 한 번 익혀두면 JSON보다 훨씬 강력한 도구가 되어줍니다.


반응형