Protocol Buffers란?

2024. 10. 25. 21:33[Node.js_6기 본캠프 TIL]

npm install protobufjs

 

Node.js(java script) 환경에서 유니티(c#)에 연결하려면 데이터 구조가 다르기 때문에, 데이터 직렬화 작업은 필수라고 할 수 있다. 이 작업을 위해 사용하는 것이 바로 Protocol Buffers(프로토콜 버퍼), protobufjs 라이브러리이다.

 

*데이터 직렬화: 메모리를 디스크에 저장하거나 네트워크 통신에 사용하기 위한 형식으로 변환하는 것을 말한다. 

 

 

1. Protocol Buffers 란?

프로토콜 버퍼는 언어와 플랫폼에 구애받지 않고, 통신 프로토콜, 데이터 저장 등에서 구조화된 데이터를 이진수로 직렬화하는 확장 가능한 방식이다. Google에서 설계되었으며, '.proto' 파일과 함께 사용할 수 있다. (직렬화 데이터 구조의 예: xml, json)

 

 

2. 활용 방법

  • proto 문법에 맞게 .proto 파일 작성
  • protoc 를 통해 proto 파일을 컴파일
  • 컴파일의 결과로 프로그래밍 언어에서 활용할 수 있는 코드가 생성됨
  • 생성된 코드에는 Protocol Buffers 형식으로 직렬화, 역직렬화할 수 있는 함수가 있음

 

[ proto 파일 작성 예시 ]

syntax = "proto3";  // 파일의 첫 번째 줄은 `proto3` 구문을 사용하도록 지정

// 메시지에 포함할 각 데이터에 하나씩, 필드 (이름/값 쌍)을 지정
message Product { 
	int32 id = 1;
	string name = 2;
}

 

 

* 자료형 타입

 

 

⭐ proto 파일 작성해보기

 

1. 클라이언트에서 요청할 데이터의 형태를 미리 정의하여, `payload`에 각 핸들러에 맞는 데이터가 들어가도록 한다.

필드명 타입 설명
handlerId uint32 핸들러 ID (4바이트)
userId string 유저 ID (UUID)
clientVersion string 클라이언트 버전 (문자열)
sequence uint32 유저의 호출 수 (42억)
payload bytes 실제 데이터

 

2. syntax = "proto3"; 를 기본값으로 세팅해준 뒤, package 명과 패킷 구조를 정의해준다.

syntax = "proto3";

package common;

// 공통 패킷 구조
message Packet {
  uint32 handlerId = 1;      // 핸들러 ID (4바이트)
  string userId = 2;         // 유저 ID (UUID)
  string clientVersion = 3;  // 클라이언트 버전 (문자열)
  uint32 sequence = 4;       // 유저의 호출 수 (42억)
  bytes payload = 5;         // 실제 데이터
}

 

 

 

참고자료:

https://velog.io/@w00j00ng351/protobuf

https://protobufjs.github.io/protobuf.js/index.html