정지용
기술스택 목록
도구

Protocol Buffers

프로젝트 1에서 사용했습니다. 각 프로젝트에서 어떤 역할로 썼는지 아래에 정리했습니다.

이 기술은 무엇인가요?

구조화된 데이터를 언어·플랫폼 독립적으로 직렬화하는 IDL 및 직렬화 도구

Protocol Buffers(protobuf)는 구글이 개발한 데이터 직렬화 포맷으로, .proto 파일에 메시지 구조를 정의하면 여러 언어용 코드를 자동 생성해 데이터를 이진 형식으로 주고받을 수 있게 해준다. JSON이나 XML보다 크기가 작고 파싱이 빠르면서도, 스키마를 명시적으로 정의해 서비스 간 데이터 계약을 강제할 수 있다는 점에서 만들어졌다. 주로 마이크로서비스 간 통신, gRPC의 메시지 포맷, 대용량 데이터 저장·전송에 쓰인다.

이럴 때 사용합니다

  • 서비스 간 통신에서 엄격한 데이터 스키마와 타입 안정성이 필요할 때
  • 네트워크 대역폭이나 파싱 성능이 중요한 대규모 트래픽 환경일 때
  • gRPC 기반 마이크로서비스 아키텍처를 구축할 때
  • 여러 언어로 작성된 서비스 간 동일한 데이터 계약을 공유해야 할 때

핵심 개념

IDL (Interface Definition Language)
.proto 파일에 메시지 필드와 타입, 서비스 인터페이스를 언어 중립적인 문법으로 정의하는 방식이다.
Message
직렬화 대상이 되는 데이터 구조의 단위로, 필드 이름·타입·번호로 구성된다.
Field Number
각 필드에 부여되는 고유 번호로, 실제 전송 시 필드 이름 대신 사용되어 크기를 줄이고 하위 호환성을 유지한다.
Code Generation
protoc 컴파일러가 .proto 정의를 읽어 여러 언어의 클래스/구조체 코드를 자동 생성해준다.
Binary Serialization
데이터를 사람이 읽기 어려운 압축된 이진 형태로 인코딩해 전송 크기와 파싱 비용을 줄인다.
Schema Evolution
필드를 추가·삭제해도 번호 규칙을 지키면 기존 클라이언트와의 호환성이 깨지지 않도록 설계된 특성이다.

기본 .proto 메시지 정의

User 메시지와 이를 조회하는 서비스 인터페이스를 정의한 예시로, protoc으로 컴파일하면 각 언어별 코드가 생성된다.

예시
syntax = "proto3";

package user;

message User {
  int64 id = 1;
  string name = 2;
  string email = 3;
  repeated string roles = 4;
}

service UserService {
  rpc GetUser (UserRequest) returns (User);
}

message UserRequest {
  int64 id = 1;
}

처음 쓸 때 흔한 함정

  • 필드 번호를 재사용하거나 변경하면 기존 데이터와의 호환성이 깨진다
  • proto3에서는 기본값과 필드 미설정을 구분하기 어려워 로직 오류를 유발할 수 있다
  • .proto 파일 변경 후 코드 재생성을 잊으면 클라이언트와 서버 스키마가 어긋난다

위 개요는 기술 학습을 돕기 위해 자동 생성된 일반 설명입니다. 정확한 사양과 최신 정보는 공식 문서를 확인하세요.

프로젝트별 활용 방식

위 개념이 실제 프로젝트에서 어떻게 쓰였는지 보여줍니다.

함께 사용한 기술

위 프로젝트들에서 같이 쓰인 다른 기술입니다.