Protocol buffer Overview를 바탕으로 작성했다.
프로토콜 버퍼란?
- 구조화된 데이터를 직렬화하는 데이터 포맷
- 언어, 플랫폼에 대한 제약이 없으며 확장성이 높음
- JSON과 유사
- 데이터 구조화 및 직렬화를 위한 포맷이라는 점에서 유사
- JSON과 비교했을 때 더 작고 빠름
정의
- 데이터 구조를
.proto 파일로 직접 정의
.proto 파일을 컴파일해 소스 코드 생성
- 소스 코드에서 다양한 데이터 스트림을 정의 가능
- 소스 코드는 다양한 언어로 컴파일 가능
프로토콜 버퍼 구성 요소
- 데이터 구조
- proto 컴파일러가 생성하는 코드
.proto 파일을 원하는 언어로 컴파일
.proto 파일의 정의에 맞는 특정한 언어의 소스 코드가 자동으로 생성
- 언어별 런타임 라이브러리
- 각 언어에서 직렬화/역직렬화, 데이터 접근 등을 지원하는 라이브러리
- 직렬화 형식
- 직렬화된 데이터
프로토콜 버퍼의 이점
- 컴팩트한 데이터 저장
- 빠른 파싱
- 다양한 프로그래밍 언어로 사용 가능
- 자동 생성된 클래스를 통해 최적화된 기능
교차 언어 호환성
- 프로토콜 버퍼는 여러 프로그래밍 언어에서 동일한 데이터 구조를 사용할 수 있도록 지원
- 하나의 .proto 파일을 만들면, 해당 파일을 protoc 컴파일러로 다양한 언어(Java, Python 등)의 소스 코드를 생성할 수 있음
- Java, Python으로 작성된 애플리케이션이 같은
.proto 파일 공유
- Java 애플리케이션이 데이터를
.proto 정의에 따라 직렬화해서 Python 애플리케이션에 전송
- Python 애플리케이션에서 해당 직렬화된 데이터를 받아서 동일한 구조로 값을 읽고 사용 가눙
코드를 업데이트하지 않고 Proto 정의 업데이트
.proto 파일을 수정해도 기존 코드를 사용해서 문제없이 새 메시지를 읽을 수 있음
- 버전 간 호환성이 뛰어남
프로토콜 버퍼가 부적합한 경우
- 메시지 크기가 너무 큰 경우
- 프로토콜 버퍼는 전체 메시지를 한 번에 모두 메모리로 불러옴
- 데이터가 몇 메가바이트 이상으로 너무 크면 메모리 사용량이 급격히 증가
- 압축이 필요할 때
- 프로토콜 버퍼 메시지는 기본적으로 압축되지 않음
- 일반적인 압축(zip, gzip 등)은 사용 가능
- 이미지(JPEG, PNG 등)처럼 특수한 압축이 필요한 데이터에는 다른 포맷 사용 권장
- 자체적으로 데이터 구조를 설명하지 않음
- 메시지를 해석하려면 반드시 해당
.proto 파일이 필요
- 공식 표준이 아님
- 프로토콜 버퍼는 어떤 국제 표준 기구에서 정한 공식 표준이 아님
핵심 정리
- 프로토콜 버퍼는 데이터 구조화 및 직렬화를 위한 데이터 포맷
.proto 파일을 통해 자체적으로 데이터 구조 정의
.proto 파일을 여러 언어로 컴파일 가능, 컴파일을 통해 만들어진 소스 코드를 사용
- 같은
.proto 파일, 다른 언어를 사용하는 다른 애플리케이션 간 같은 메시지 구조로 통신 가능