Google Protocol Buffer는 Google에서 개발한 오픈소스 직렬화 데이터 구조다. 다양한 곳에서 데이터 직렬화를 위해 쓰이고 있다. 간단히 ProtoBuf라고도 부르는 모양이다.
쉽게 설명하자면 .proto라는 파일로(XML 혹은 JSON 같은) 데이터 구조를 짜면, 원하는 프로그래밍 언어로 해당 데이터 구조를 다루는 코드를 자동 생성해주는 프로그램이다. 예를 들면 C++의 struct를 자동으로 선언해주고, 그 struct의 임시 객체를 생성하고, 직/역직렬화 하는 등 여러 편리한 기능을 구현한 코드들이다.
설치 따라하기
Google ProtoBuf를 사용하는 과정은 처음 해보면 굉장히 복잡하게 느껴질 수 있다. 그러나 알고나면 그냥 porotobuf을 한 번 돌리고 생성된 헤더, 소스 파일을 프로그램에 적용시키는 것이 끝이다. 그러나 나중에 까먹을 것을 대비해, 그 과정을 아주 자세히 따라가보자.
- '프로토 컴파일러' 다운받기
- protobuf를 사용하기 위해서는 우선 프로토 컴파일러 라는게 필요하다. 프로토 컴파일러는 '프로토 파일'을 읽어서 우리가 사용할 코드를 생성해주는 실행파일(protoc.exe)이다.
- https://github.com/protocolbuffers/protobuf/releases 이 링크로 가면 C++ 버전의 프로토 컴파일러를 받을 수 있다.
- '프로토 파일' 작성하기
- 프로토 파일이란 .proto 확장자를 가진 파일을 말한다. XML, JSON 과 같이 데이터 구조를 짤 수 있는 포맷이다.
- https://developers.google.com/protocol-buffers/docs/proto3#scalar 이 링크로 가면 어떤 문법을 가지고 있는지 대강 알려준다. 문법은 직관적이고 알기 쉽다.
- 프로토 컴파일러 를 실행하는 배치파일 (.bat) 만들기
- 프로토 컴파일러를 실행하려면 위에서 만든 프로토 파일의 경로, 출력 언어, 출력 위치 를 입력해줘야 한다. 이러한 역할을 해주는 배치파일이 필요하다.
- https://developers.google.com/protocol-buffers/docs/proto3#scalar 이 링크의 끝자락 쯤 가면 배치파일을 어떻게 작성해야 하는지 나와있다.
- e.g) protoc.exe -I=./ --cpp_out=./ ./Protocol.proto
IF ERRORLEVEL 1 PAUSE
- 배치파일 실행하기
- 위에서 작성한 배치파일을 실행하면 자동으로 .pb.cc, .pb.h 형식의 파일(이하 코드파일)이 생성된다.
- 코드파일을 사용할 프로젝트에 넣는다.
- 코드파일을 넣는다고 바로 사용할 수 있는 상태가 아니다. 사용하려면 코드파일에서 필요한 라이브러리들이 있어야 한다.
- 코드파일에서 사용하는 라이브러리를 다운받는다.
- 구글에 google protobuf c++ library 를 검색해 제일 처음 나온 깃허브 링크에서 다운받을 수 있다. (https://github.com/protocolbuffers/protobuf/branches)
- 1. 에서 다운받은 프로토 컴파일러와 버전이 일치하는 것으로 받는 것이 좋다. 그렇지 않으면 컴파일 에러가 날 수 있다.
- 다운받은 라이브러리를 직접 빌드해준다.
- 다운받은 라이브러리는 아직 빌드되지 않은 상태이기 때문에 우리가 직접 빌드해주어야 한다.
- CMake 라는 외부 프로그램을 사용해 라이브러리를 빌드할 수 있는 비쥬얼 스튜디오 솔루션을 만들어준다.
- CMake 프로그램은 https://cmake.org/download/ 에서 받을 수 있다.
- CMake 사용 방법
- CMake 사용 시 소스코드는 다운받은 라이브러리 폴더 안에 cmake 라는 폴더로 설정한다.
- CMake 사용 시 출력위치는 마음대로 설정해도 된다.
- CMake 사용 시 모든 체크박스는 해제 해준다.
- Generate 버튼을 눌러준다.
- 2.에서 설정한 출력 위치에 솔루션 파일이 생성된다.
- CMake로 생성한 솔루션 파일을 비주얼 스튜디오로 열고 직접 빌드해준다. 디버그, 릴리즈 버전 모두 해주면 좋을지도?
- 7.의 빌드 결과로 생성된 라이브러리 파일들을 사용할 프로그램의 라이브러리 경로에 넣어준다.
- 디버그 버전 빌드 시 libprotobufd.lib, libprotobufd.pdb 파일들
- 릴리즈 버전 빌드 시 libprotobuf.lib 파일들
- lib 파일은 사용할 프로그램의 라이브러리 경로에 넣는다.
- pdb파일은 디버그시 선택사항. 라이브러리 경로에 넣어준다.
- 사용할 프로그램에 라이브러리 포함파일(헤더)을 넣어준다.
- 6.에서 다운받았던 라이브러리 폴더 안에 src 폴더 안의 google 폴더를 통으로 복사한다.
- 복사한 google 폴더를 사용할 프로그램의 포함경로에 넣어준다.
- 사용할 프로그램의 코드 내에서 라이브러리 사용을 명시해준다.
- e.g) #pragma comment(lib,"Protobuf\\Debug\\libprotobufd.lib")
- 이제 사용할 프로그램에서 정상적으로 .pb.cc / .pb.h 파일을 사용할 수 있다.
사용 코드
Protocol.proto
.proto 파일에 짠 데이터 구조. package 명이나 BuffData, buffId 같은 이름들은 이후 Protocol.ph.cc /Protocol.pb.h 파일에서 그대로 사용된다. 따라서 아래처럼 사용할 프로그램에서도 그대로 변수명, 클래스명, 패키지명 처럼 사용하게된다.
C++ 코드
여기서 Protoco, S_TEST, BuffData 등은 Protocol.ph.cc /Protocol.pb.h 파일에 선언/ 정의된 것들이다.
add_buffs(), set_buffid() 등 각종 함수들도 마찬가지.
그 외에도 ParseFromArray(), SerializeToArray() 등 직렬화/역직렬화 함수도 있고 다양한 기능들이 구현되어있다.
이 글은 Rookies 님의 인프런 강의를 매우 참고했읍니다.
https://www.inflearn.com/course/%EC%96%B8%EB%A6%AC%EC%96%BC-3d-mmorpg-4/dashboard
'네트워크, 서버' 카테고리의 다른 글
JobTimer (0) | 2022.07.19 |
---|---|
JobQueue (0) | 2022.07.16 |
Completion Port 모델 (0) | 2022.04.30 |
Overlapped 모델(콜백함수) (0) | 2022.04.30 |
WSAEventSelect model (0) | 2022.04.29 |