본문 바로가기

Miscellaneous

[Protocol Buffer를 파헤쳐보자] Google의 Protocol Buffer 2부

[본 글은 http://blog.skcc.com/1011 에서 Storyteller 님께서 쓰신 글을 옴겨왔습니다]

데이터 통신을 위한 데이터 레벨의 분류

이제 1부에 이어 Google의 Protocol Buffer에 대해 좀더 구체적으로 알아보겠습니다. 1부에서 언급한 각종 환경적인 복잡성을 줄이기 위한 노력들이 있었는데 그 중 대표적인 방법이 XML 포맷을 이용한 텍스트 형태의 전달 방식과 ASN.1 혹은 Protocol Buffer와 같은 Binary 데이터 방식입니다.

XML을 이용한 방식

XML 방식은 데이터의 내용을 XML Tag를 이용하여 텍스트 형태로 생성하고 해석하므로 데이터를 직접 이해하기도 쉽고 보편화가 되어 있어서 각 플랫폼에서 제공하는 XML 파서를 이용하면 데이터를 핸들링 하기에도 편리합니다. 하지만 데이터 사이즈가 커지고 데이커가 큰 경우 파서의 성능이 저하되는 단점이 있습니다. 또한 데이터 보안에도 취약하여 별도 보안책을 마련해야 합니다.

Binary 데이터를 이용한 방식

Binary 데이터 방식은 데이터 사이즈가 작고 송수신 처리시 성능을 보장해 줍니다. 또한 Binary 데이터 이므로 데이터만 봐서는 무슨 의미인지 알 수가 없어 보안의 걱정도 덜 수 있습니다.
그러나 XML에 비해 보편화 되어 있지 않아 모든 플랫폼에서 사용할 수는 없고 Serialize/Deserialize 모듈 제공자에 큰 의존성을 갖습니다. ANS.1의 경우 데이터를 어떻게 기술할지에 대한 인터넷 표준 규약을 정의하며 이 표준을 준수하여 데이터를 생성/해석 할 수 있는 모듈은 무료 및 유료를 포함하여 여러 가지가 있습니다. 이중 무료 제품들은 기능 및 성능의 제한이 있으며 각 모듈마다 같은 내용에 대하여 서로 다른 결과물을 만들어 냅니다. (표준을 해석하는 방식에 따라 구성한 데이터 형식이 달라지게 됩니다). 그에 반해 Google의 Protocol Buffer는 Google이 Open source 형태로 제작하여 소스를 포함하여 배포하고 있기 때문에 안정적이며 출처가 한곳입니다. 원하는 사람은 소스를 받아 원하는 방식으로 수정할 할 수도 있습니다.

Protocol Buffer란? 

Google의 Blog에서 Protocol Buffer에 대해 아래와 가타이 정의하고 있습니다.

"Protocol Buffers are a flexible, efficient, automated mechanism for serialize structured data" 중략

"Protocol Buffers allow you to define simple data structures in a special definition language, then compile them to produce classes to represent those structures in the language of your choice"

위에서 언급한 바와 같이 Protocol Buffer는 간단한 구조와 데이터를 원하는 개발 언어에 맞게 효과적으로 직렬화 하는 것을 목적으로 하고 있습니다. 다시 말해 구조화된 간단한 데이터를 빈번히 주고받기 위한 성능 위주로 쉽게 구현된 구현체라는 말입니다.

Protocol Buffer의 수행 단계

Protocol Buffer는 아래와 같이 단계를 거쳐 사용할 수 있습니다.

Step 1. Proto 파일 작성

Step 2. Proto Compiler를 통해 각 언어에 맞는 Data Handler Class 생성

Step 3. 생성된 class의 set 함수를 통해 데이터 설정

Step 4. writeTo() 함수를 통해 Binary Data로 Serialize

Step 5. serial data 전송

...

Step 6. serial data 수신

Step 7. parseForm( ) 함수를 통해 Binary Data를 parsing

Step 8. get 함수를 통해 원하는 데이터 값 조회

Protocol Buffer의 장/단점

장점

- 사용이 간단하다

- 20~100배 빠르다

- 모호하지 않다

- 프로그램에서 사용 가능한 클래스를 생성해 준다.(C++ / Java/ Python 공식 지원)

- 최대 64MB 크기의 message까지 지원한다. (성능 보장을 위한 제약)

- JSON 포맷 전환을 지원한다

- BSD License 정책으로 100% 무료이다

단점

- repeat 사용시 serialize/parse 시 성능이 저하될 수 있다

- 데이터를 눈으로 확인할 수 없다 (Binary Data VS. Text Data)

- 표준 프로토콜이 아니다

- 단말기/세톱박스 등 RTOS에서의 지원이 어렵다

- 공식 지원 언어는 C++/ Java/ Python 이다 (이외 언어는 3rd Party에서 지원)

- Map/Set을 지원하지 않는다

--------------------------------------------------------------------------------------

Proto 파일의 작성

Proto 파일은 구조체와 같이 해당되는 데이터 변수 및 타입을 명시합니다. 각 변수는 아래와 같은 한정자 조건을 갖습니다.

- required : 1개만 존재 가능

- optional : 0개 혹은 1개 존재 가능

- repeated : 여러 개 존재 가능 (0개 포함)

데이터 타입 선언은 아래와 같습니다.

반응형

'Miscellaneous' 카테고리의 다른 글

HTML 과 XML의 차이?  (0) 2014.03.24
UPNP Stack 및 정리  (0) 2014.03.24
[Protocol Buffer를 파헤쳐보자] Google의 Protocol Buffer 1부  (2) 2013.05.13
봉주르 vs UPNP  (0) 2013.04.24
What is UPnP ???  (0) 2013.04.24