본문 바로가기

프로그래머로 살아가기

Data Serialization / Deserialization 라이브러리 선택하기

최근에 굉장히 많은 수의 Data Serialization / Deserialization 라이브러리들이 나오고 있어서, 어떤 라이브러리를 선택해서 사용을 해야 하는지 고민하는 프로그래머들이 많으실것 같습니다. 


위키피디아를 보면 정말 수많은 라이브러리들이 존재하고 있고 여기에 올라와 있지 않은 라이브러리들도 많은 실정입니다. 


http://en.wikipedia.org/wiki/Comparison_of_data_serialization_formats


저도 상황에 따라서 그때 그때 적당한 라이브러리를 선택해서 사용하고 있는데요. 


그 기준에 대하여 이야기를 해보도록 하겠습니다.


우선 가장 먼저 고민을 해야 하는 것은 내가 사용하는 언어 지원 여부 입니다. 


 Data Serialization / Deserialization 들은 보통 다양한 언어 지원이 기본이지만 대부분 JAVA , C++ 같은 메이저한 언어들만 지원하는 경우도 있고  C#  같은 언어들은 3rd party지원등으로 하는 경우도 있어서  지원하는지 안하는 ,  공식 지원인지 아닌지 부터 확인을 해봐야 합니다. 

아무래도 공식 지원이 아닌 경우는 버그가 많거나 버전업의 경우 제대로 업데이트가 안되는 경우도 있어서 꺼려지는게 사실이죠.


다음 고민해야 할것은 스키마 지원(고정타입) 여부 인것 같습니다.


스키마가 지원 될때는 Type checking이 가능하여 좀더 단단한 코드를 작성할수 있지만 자주 스키마가 변경되는 경우 클라,서버 업데이트에 부담이 될수 있습니다. 게임의 경우는 IOS버전, AOS(안드로이드)이 심사 일정등으로 업데이트 주기가 다른경우 이런 스키마 방식은 부담스러울수 있습니다. 


스키마가 없는 Dynamic type 방식은 그 반대로 생각하시면 될것 같습니다.


스키마가 존재하는 것은 Proto buffer,  Thrift등이 있고  스키마가 없는 경우는 MessagePack Avro가 있습니다. 


그리고 스키마 방식인 경우도 어떤 타입이 지원하는지를 확인해보셔야 합니다.


- Protocol Buffers: int32, int64, uint32, uint64, sint32, sint64, fixed32, fixed64, sfixed32, sfixed64, double, float, bool, string, bytes, repeated, message

- Avro: int, long, float, double, boolean, null, float, double, bytes, fixed, string, enum, array, map, record 

- MessagePack: Integer, Float, Boolean, Nil, Raw, Array, Map (=same as JSON) 


https://news.ycombinator.com/item?id=2834010



그 다음 고민 해야 하는 부분이  Data Serialization / Deserialization속도와 데이터 사이즈 인것 같은데요.


이 부분은 각종 벤치마크 자료를 비교해보시거나 직접 사용해보실 데이터로 테스트 코드로 벤치 마크를 해보셔야 합니다.


제 경우에는 Dynamic Type이 필요해서 Bson을 테스트 해보았으나 성능상이나 데이터 사이즈상으로 매우 실망스러운 결과를 얻었습니다.