FlatBuffers, Flatbuffers 듀토리얼? 플랫버퍼? 플랫버퍼 사용법 - 1

728x90
반응형

오늘의 포스팅은 FlatBuffers!

소프트웨어 엔지니어들은 잘 아는 내용 일수도 있지만, 하드웨어와 소프트웨어 그 어딘가에 위치한 나에게는 다소 생소하다. 모르면 공부해야지 뭐.............ㅎㅎ

 

FlatBuffers, 플랫버퍼 란?

"Google에서 개발된 크로스 플랫폼 직렬화(Serialization) 라이브러리"라고 소개하고 있다. 라이브러리에서 지원하는 언어는 C++, C#, C, Go, Java, JavaScript, PHP, Python 등 다양하다. 플랫버퍼는 게임 개발이나 성능이 중요한 응용프로그램을 위해 만들었다고 하는데.. 성능이 중요하지 않은 응용프로그램이 어디 있지? 뭐 아무튼 그렇단다.

 

FlatBuffers 특징 

  • 데이터를 송수신할 때 parsing/unpacking 없이 직접 액세스 할 수 있다.
  • 직렬화된 데이터에 액세스 할 때 메모리에 별도로 복사하지 않는 역직렬화를 지원하기 때문에 메모리 효율이 좋다.
  • 데이터 구조를 유연하게 변경할 수 있다.
  • 종속성 없이 사용 가능, 크로스 플랫폼
  • 사용하기 편리하다.(직접 사용해보니 그런 것 같다.)

 

FlatBuffers 사용법

사용법은 FlatBuffers 공식 홈페이지(?)의 가이드에서 제공하는 코드를 가져와서 진행해보도록 하겠다.

https://google.github.io/flatbuffers/

 

FlatBuffers: FlatBuffers

Overview FlatBuffers is an efficient cross platform serialization library for C++, C#, C, Go, Java, Kotlin, JavaScript, Lobster, Lua, TypeScript, PHP, Python, Rust and Swift. It was originally created at Google for game development and other performance-cr

google.github.io

 

 

홈페이지에서 Tutorial에 들어가면 언어를 선택할 수 있다. 본인이 원하는 언어를 선택하면 아래 코드 내용이 바뀌는 걸 볼 수 있다.

 

Schema 파일 작성

플랫버퍼를 사용하기 위해서는 직렬화 하려는 각 데이터 구조의 형식을 정의하는 스키마 파일이 있어야 한다. 아래 코드는 스키마 파일의 예제다. 플랫버퍼가 게임 개발을 목적으로 개발된 라이브러리기 때문에 아래 예제로 제공하는 스키마도 주제가 몬스터다. 아래 코드 내용은 우선 개발환경을 구축하고 컴파일까지 완료해서 실행해본 다음 알아보도록 하자.

// Example IDL file for our monster's schema.
 
namespace MyGame.Sample;
 
enum Color:byte { Red = 0, Green, Blue = 2 }
 
union Equipment { Weapon } // Optionally add more tables.
 
struct Vec3 {
  x:float;
  y:float;
  z:float;
}
 
table Monster {
  pos:Vec3; // Struct.
  mana:short = 150;
  hp:short = 100;
  name:string;
  friendly:bool = false (deprecated);
  inventory:[ubyte];  // Vector of scalars.
  color:Color = Blue; // Enum.
  weapons:[Weapon];   // Vector of tables.
  equipped:Equipment; // Union.
  path:[Vec3];        // Vector of structs.
}
 
table Weapon {
  name:string;
  damage:short;
}
 
root_type Monster;

 

메모장을 열어 위 코드를 그대로 복사한 다음 확장자를. fbs 파일로 저장한다. 저장할 때 파일 형식을 "모든 파일"로 저장해야 한다. 텍스트 문서 형식으로 저장하면 txt 파일이 된다. 주의!!!

 

그럼 이제 플랫버퍼 소스코드와 스키마 파일을 컴파일해줄 컴파일러를 다운로드하여보자.

 

컴파일러 및 FlatBuffers 다운로드 

https://github.com/google/flatbuffers/releases

 

Releases · google/flatbuffers

FlatBuffers: Memory Efficient Serialization Library - google/flatbuffers

github.com

 

위 링크에서 Windows.flatc.binary.zip(컴파일러) 파일과 Source code(zip)(소스코드) 파일을 다운로드한다. 각자의 환경에 맞는 파일을 다운로드하면 된다.

 

여기까지 총 3개의 파일을 한 폴더에 모아준다!

 

Windows.flatc.bynary.zip 파일과 flatbuffers-2.0.0.zip 파일의 압축을 풀어준다. 이때 반드시 관리자 권한으로 압축을 풀어야 한다. 

 

 

미리 만들어둔 monster.fbs 파일을 컴파일러 폴더(Windows.flatc.binary)로 이동시켜준다.

 

그럼 이제 컴파일을 해보자.

 

Schema 컴파일

cmd 창을 열어서 flatc.exe 파일이 있는 Windows.flatc.binary 폴더로 이동한다. 

 

미리 작성된 Schema(.fbs)파일을 원하는 언어로 컴파일하려면 아래 내용을 참고하 명령을 입력하면 된다. 

flatc [ GENERATOR OPTIONS ] [ -o PATH ] [ -I PATH ] FILES...
      [ -- FILES...]

 

[GENERATOR OPTION] 여기에 Schema 파일을 컴파일할 언어를 선택한다. 각 언어별 명령어는 아래 참조.

 

  • --cpp, -c : Generate a C++ header for all definitions in this file (as filename_generated.h).
  • --java, -j : Generate Java code.
  • --kotlin, -k : Generate Kotlin code.
  • --csharp, -n : Generate C# code.
  • --go, -g : Generate Go code.
  • --python, -p: Generate Python code.
  • --js, -s: Generate JavaScript code.
  • --ts: Generate TypeScript code.
  • --php: Generate PHP code.
  • --grpc: Generate RPC stub code for GRPC.
  • --dart: Generate Dart code.
  • --lua: Generate Lua code.
  • --lobster: Generate Lobster code.
  • --rust, -r : Generate Rust code.
  • --swift: Generate Swift code.

 

[-o PATH]  컴파일된 파일이 저장될 위치 

[- I PATH]  Schema(.fbs)파일이 있는 위치

 

.fbs 파일과 컴파일러의 경로가 동일하기 때문에 경로는 따로 지정하지 않았다. 

각 옵션에 경로를 입력하려면 ./________ 슬래시가 끝나는 뒷부분에 입력하면 된다. -o와./ 사이에 스페이스 공백은 반드시 있어야 한다. 이렇게 컴파일하면 파일이 생성된 걸 확인할 수 있다. 

 

컴파일까지 완료했으니 이제 사용해보자! 플랫버퍼를~~~~~

 

FlatBuffers 사용하기

우선 Visual Studio를 열어서 콘솔 앱으로 프로젝트를 하나 만들어보자

 

경로는 계속 작업하던 폴더로 지정

 

 

소스코드 작성은 다음 포스팅에서!

 

- 끝 -

 

728x90
반응형