SlideShare a Scribd company logo
1 of 40
구글’sProtocol Buffer Knight76 at gmail.com 김용환
개념 RPC와 쉽게 연동, Not RPC 하나의 개념으로 다양한 언어에서 쓸 수 있게구글에서 다양한 언어별로 개발 하다 보니. 통신을 위한 단일 표준이 필요 Proto 파일 (structed data) Proto Compiler C++ Java python
References Protocol Buffers: A new open source release http://www.youtube.com/watch?v=K-e8DDRwVUg Home Page http://code.google.com/p/protobuf/
Protocol Buffer 이야기 Not socket 구글 에서 2008년 7월 발표 이슈 제시 XML 문제 Parsing, serialization  (debugging) Portable : IDL처럼사용 Heavy Optimization Language 지원 짧은 데이터의 송수신 용도/긴 데이터 송수신이 목표가 아님 http://google-opensource.blogspot.com/2008/07/protocol-buffers-googles-data.html
XML보다 좋은 장점 Simple 3~10배 작음 20~100배 속도 빠름 모호하지 않음 바로 프로그램에 사용하기 쉬움 http://code.google.com/intl/ko-KR/apis/protocolbuffers/docs/overview.html
어디서 쓰고 있나? 구글 원래 index server request/response protocol로 사용했었음 48,162 different message types 12,183 .proto files 다양한 회사 국내/외 게임회사의 통신
장점 쓰기 편함 Stub 코드 자동 생성 통신에서 가져야 할 보편적 특성을 다 추가 Serializing, Parsing 지원 코드 일치 클라이언트/서버 코드 동일 IDL 형태로 정의가 단순 Portable 클래스 또는 struct디자인 언어 지원 java, c++, python 3rd party lib (많은 언어 지원. http://code.google.com/p/protobuf/wiki/ThirdPartyAddOns#RPC_Implementations) 배우기 쉬움 이클립스플러그인 존재 Lite 버전 개발 가능 Good Document BSD license 언어마다 특화되고 쓰기 편한 특징을 제공
단점? Output이 binary만 존재 PB의 Reflection을 이용해서 json으로 전달 가능 Map, set 지원 없음
개발자 가이드 http://code.google.com/intl/ko-KR/apis/protocolbuffers/docs/overview.html
개발환경 구성 Download proto compiler in google code (Option) eclipse plugin
설치 Proto compiler 설치 http://code.google.com/p/protobuf/downloads/list
이클립스 환경 셋팅
Eclipse 플러그인 사용 #1 Protoclips업데이트 주소 http://protoclipse.googlecode.com/svn/trunk/site/ Windows-Preference-ProtoBuf Plugin Perferences화면에서 protoc.exe compiler가 설치된 path를 넣는다.
Eclipse 플러그인 사용 #2 PB 컴파일 환경 구축 Project 오른쪽 버튼 -> Add Google ProtoBuf Compiler Nature 선택
Eclipse 플러그인 사용 #3 src/test.proto파일 생성  test/Test.java 파일이 자동으로 생성 But, PB의 lib가 있어야 컴파일이 될 것임 직접 다운받거나 maven 이용! http://repo2.maven.org/maven2/com/google/protobuf/protobuf-java/
Eclipse 플러그인 사용 #4 Pom.xml <dependencies> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>2.4.1</version> </dependency> </dependencies>
Eclipse 플러그인 사용 #4 컴파일 완료된 것 확인
실습
PB Format->소스 전환  // text.txt package test; message Request {   required string command = 1;   optional string param = 2; } /cygdrive/c/protocolbuffer $ ./protoc.exe test.txt --java_out=. Test폴더 생기고TestTxt.java 생성됨 (17KB, Protocol buffer 내부 클래스 사용) naming // c++ out test.txt.pb.cc (12K) test.txt.pb.h (8K) // python out test/txt_pb2.py (2K)
생성된 자바코드
생성된 자바코드 Descriptor 지원 internal_static_test_Request_descriptor Reflection 지원 Message / Message.Builder interfaces. Json처럼 프로토콜로 변경 가능 (ajax가능) 메시지 수정시 하위 호환 보장, 새로운 메시지로 변경되면 기존 코드에 대한 필드만 처리 파일이름을 디폴트로 해서 소스를 생성하지만, 내가 원하는 클래지 이름과 클래스 이름의 개별 지정이 가능 option java_package = "com.example.foo.bar"; option java_outer_classname = “ProtocolData"; PB의 Enum은 java의 enum으로 변경
크기 제한 디폴트로 크기 제한  64 MB 속도를 최적화 또는악의를 가진 사용자로부터 보호하기 위해서 크기를 제한할 수 있음 CodedInputStream/CodedOutputStream(ZeroCopyInputStream/ZeroCopyOutputStream )	 SetTotalBytesLimit메소드
유의할 점 package 선언 클래스 파일 이름 운영을 위한 파일명 .proto message 등록 Protocol buffer language guide Protoc.exe(컴파일러)에 의해 만들어진 java, python, c++코드는 고치지 말아야 한다.(immutable) protoc에서 컴파일 되면, 자동으로 accessor가 붙는다. get/set/has…
message package Type Bool, int32, uint32, float, double, string, bytes,  …. Enum Nested type Default value importing Modifier required : 반드시 사용해야 할 필드. 미초기화된 상태미초기화된 메시지를 빌드하면RuntimeException, 초기화되지 않은 메시지를 파싱하면서에러나면IOException발생 optional : option의 개념 hasXXX() 로확인 Repeated : 0을 포함하는 개수를 계속 넣을 수 있음 List객체로 구현됨
message 번호를 반드시 주는 이유  번호를 주지 않으면 protoc에러발생 Write/Read 할 때, serialization 순서를 주기 위함 필드 정보가 set되었는지 쉽게 알기 위함(내부적으로 bit 연산함)
Versioning 정보가 없는 이유 새로운 필드를 언제든지 추가 될 수 있음 모든 정보를 볼 필요 없이 필요한 정보만 파싱할 수 있도록 함 But, java는 기본으로 존재하지 않지만, c++은 존재한다. 링킹 이슈.(GOOGLE_PROTOBUF_VERIFY_VERSION 매크로) Incompatible한 버전 때문에 문제가 없도록 해야 함
데모
DEMO #1 - 0 PB 코드 // text.txt package test; message Request {   required string command = 1;   optional string param = 2; }
DEMO #1 -1 package com.example.test; import java.io.FileOutputStream; import test.Test.Request; public class Writer {     public static void main(String[] args) throws Exception {         Request request = Request.newBuilder()                                        .setCommand("commit")                                        .setParam("every files")                                        .build(); FileOutputStreamoutput = new FileOutputStream("r.os"); request.writeTo(output); output.close();     } }
DEMO #1 -2 package com.example.test; import java.io.FileInputStream; import test.Test.Request; public class Reader {     public static void main(String[] args) throws Exception {         Request request = Request.parseFrom(new FileInputStream("r.os")); System.out.println("command : " + request.getCommand());         if (request.hasParam()) { System.out.println("params : " + request.getParam());         }      } }
DEMO #1 -3 command : commit params : every files
package tutorial; option java_package = "com.example.tutorial"; option java_outer_classname = "AddressBookProtos"; message Person {   required string name = 1;   required int32 id = 2;   optional string email = 3; enumPhoneType {     MOBILE = 0;     HOME = 1;     WORK = 2; }   message PhoneNumber {     required string number = 1;     optional PhoneType type = 2 [default = HOME]; }   repeated PhoneNumber phone = 4; } message AddressBook {   repeated Person person = 1; } DEMO #2
DEMO #3 – 1생성된 c++코드를 이용해서 코딩 #include <iostream> #include <fstream> #include <string> #include "test.pb.h" using namespace std;  int main(intargc, char* argv[]) {  	Request request; request.set_command("init"); request.set_param("0"); fstream out("streams", ios::out | ios::binary | ios::trunc);  request.SerializeToOstream(&out);  out.close(); 	return 1; }
DEMO #3 – 1생성된 c++코드를 이용해서 코딩 #include <iostream> #include <fstream> #include <string> #include "test.pb.h" using namespace std;  int main(intargc, char* argv[]) {      Request request; fstream in(“streams", ios::in | ios::binary);     if (!request.ParseFromIstream(&in)) {           cerr << "Failed to parse streams." << endl;           exit(1);     }     cout << “command: " << request.command() << endl;     if (request.has_param()) {          cout << “param: " << request.param() << endl;     } }
기타 정보
Protocol Buffer Language Guide http://code.google.com/intl/ko-KR/apis/protocolbuffers/docs/proto.html
API http://code.google.com/intl/ko-KR/apis/protocolbuffers/docs/reference/java/index.html
PB Format http://wiki.openstreetmap.org/wiki/PBF_Format
다른 솔루션과 속도 비교 https://github.com/eishay/jvm-serializers/wiki 프로토콜 버퍼의 속도는여기에 위치(일반 json/xml보다 빠름)
End of Document

More Related Content

What's hot

파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)Tae Young Lee
 
[113]how can realm_make_efficient_mobile_database
[113]how can realm_make_efficient_mobile_database[113]how can realm_make_efficient_mobile_database
[113]how can realm_make_efficient_mobile_databaseNAVER D2
 
IT 일반기술 강의자료_ed10
IT 일반기술 강의자료_ed10IT 일반기술 강의자료_ed10
IT 일반기술 강의자료_ed10hungrok
 
Linux reversing study_basic_3
Linux reversing study_basic_3Linux reversing study_basic_3
Linux reversing study_basic_3Jinkyoung Kim
 
공성대전 C# 사용기
공성대전 C# 사용기공성대전 C# 사용기
공성대전 C# 사용기Myoung-gyu Gang
 
PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보
PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보
PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보Young Hoo Kim
 
안드로이드 DB, 서버 연동하기
안드로이드 DB, 서버 연동하기안드로이드 DB, 서버 연동하기
안드로이드 DB, 서버 연동하기은아 정
 
니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트효준 강
 
Java Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte CodeJava Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte CodeJavajigi Jaesung
 
Http 완벽 가이드(2장 url과 리소스)
Http 완벽 가이드(2장 url과 리소스)Http 완벽 가이드(2장 url과 리소스)
Http 완벽 가이드(2장 url과 리소스)Choonghyun Yang
 
Windows reversing study_basic_1
Windows reversing study_basic_1Windows reversing study_basic_1
Windows reversing study_basic_1Jinkyoung Kim
 
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012Esun Kim
 
Assembly 스터디 1
Assembly 스터디 1Assembly 스터디 1
Assembly 스터디 1Jinkyoung Kim
 
Windows reversing study_basic_9
Windows reversing study_basic_9Windows reversing study_basic_9
Windows reversing study_basic_9Jinkyoung Kim
 
[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성NAVER D2
 

What's hot (20)

파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
파이썬 데이터과학 1일차 - 초보자를 위한 데이터분석, 데이터시각화 (이태영)
 
NLog 소개
NLog 소개NLog 소개
NLog 소개
 
[113]how can realm_make_efficient_mobile_database
[113]how can realm_make_efficient_mobile_database[113]how can realm_make_efficient_mobile_database
[113]how can realm_make_efficient_mobile_database
 
IT 일반기술 강의자료_ed10
IT 일반기술 강의자료_ed10IT 일반기술 강의자료_ed10
IT 일반기술 강의자료_ed10
 
Linux reversing study_basic_3
Linux reversing study_basic_3Linux reversing study_basic_3
Linux reversing study_basic_3
 
Introduce php7
Introduce php7Introduce php7
Introduce php7
 
System+os study 4
System+os study 4System+os study 4
System+os study 4
 
공성대전 C# 사용기
공성대전 C# 사용기공성대전 C# 사용기
공성대전 C# 사용기
 
PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보
PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보
PyCon 12월 세미나 - 실전 파이썬 프로그래밍 책 홍보
 
안드로이드 DB, 서버 연동하기
안드로이드 DB, 서버 연동하기안드로이드 DB, 서버 연동하기
안드로이드 DB, 서버 연동하기
 
니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트니름: 쉬운 SOA 단위 테스트
니름: 쉬운 SOA 단위 테스트
 
Java Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte CodeJava Virtual Machine, Call stack, Java Byte Code
Java Virtual Machine, Call stack, Java Byte Code
 
Http 완벽 가이드(2장 url과 리소스)
Http 완벽 가이드(2장 url과 리소스)Http 완벽 가이드(2장 url과 리소스)
Http 완벽 가이드(2장 url과 리소스)
 
Windows reversing study_basic_1
Windows reversing study_basic_1Windows reversing study_basic_1
Windows reversing study_basic_1
 
Java 기초
Java 기초Java 기초
Java 기초
 
파이선 실전공략-1
파이선 실전공략-1파이선 실전공략-1
파이선 실전공략-1
 
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
 
Assembly 스터디 1
Assembly 스터디 1Assembly 스터디 1
Assembly 스터디 1
 
Windows reversing study_basic_9
Windows reversing study_basic_9Windows reversing study_basic_9
Windows reversing study_basic_9
 
[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성
 

Viewers also liked

LevelDB 간단한 소개
LevelDB 간단한 소개LevelDB 간단한 소개
LevelDB 간단한 소개종빈 오
 
SnappyDB - NoSQL database for Android
SnappyDB - NoSQL database for AndroidSnappyDB - NoSQL database for Android
SnappyDB - NoSQL database for Androidnhachicha
 
Distributed System
Distributed SystemDistributed System
Distributed SystemIqra khalil
 
xUnitTestPattern/chapter7
xUnitTestPattern/chapter7xUnitTestPattern/chapter7
xUnitTestPattern/chapter7종빈 오
 
Restful web service
Restful web serviceRestful web service
Restful web servicesunguen lee
 
C++ Unit Test with Google Testing Framework
C++ Unit Test with Google Testing FrameworkC++ Unit Test with Google Testing Framework
C++ Unit Test with Google Testing FrameworkHumberto Marchezi
 
Rpc (Distributed computing)
Rpc (Distributed computing)Rpc (Distributed computing)
Rpc (Distributed computing)Sri Prasanna
 
Distributed Systems Done Right: Why Java Enterprises Are Embracing The Actor ...
Distributed Systems Done Right: Why Java Enterprises Are Embracing The Actor ...Distributed Systems Done Right: Why Java Enterprises Are Embracing The Actor ...
Distributed Systems Done Right: Why Java Enterprises Are Embracing The Actor ...Lightbend
 
Introduction to Remote Procedure Call
Introduction to Remote Procedure CallIntroduction to Remote Procedure Call
Introduction to Remote Procedure CallAbdelrahman Al-Ogail
 
RPC에서 REST까지 간단한 개념소개
RPC에서 REST까지 간단한 개념소개RPC에서 REST까지 간단한 개념소개
RPC에서 REST까지 간단한 개념소개Wonchang Song
 
KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기Ryan Park
 
협업도구 및 주요 Agile practices 적용사례 v1.0
협업도구 및 주요 Agile practices 적용사례 v1.0협업도구 및 주요 Agile practices 적용사례 v1.0
협업도구 및 주요 Agile practices 적용사례 v1.0Sangcheol Hwang
 
Open vSwitch 패킷 처리 구조
Open vSwitch 패킷 처리 구조Open vSwitch 패킷 처리 구조
Open vSwitch 패킷 처리 구조Seung-Hoon Baek
 
Open vSwitch와 Mininet을 이용한 가상 네트워크 생성과 OpenDaylight를 사용한 네트워크 제어실험
Open vSwitch와 Mininet을 이용한 가상 네트워크 생성과 OpenDaylight를 사용한 네트워크 제어실험Open vSwitch와 Mininet을 이용한 가상 네트워크 생성과 OpenDaylight를 사용한 네트워크 제어실험
Open vSwitch와 Mininet을 이용한 가상 네트워크 생성과 OpenDaylight를 사용한 네트워크 제어실험Seung-Hoon Baek
 

Viewers also liked (16)

LevelDB 간단한 소개
LevelDB 간단한 소개LevelDB 간단한 소개
LevelDB 간단한 소개
 
SnappyDB - NoSQL database for Android
SnappyDB - NoSQL database for AndroidSnappyDB - NoSQL database for Android
SnappyDB - NoSQL database for Android
 
Grpc present
Grpc presentGrpc present
Grpc present
 
Distributed System
Distributed SystemDistributed System
Distributed System
 
Test and ci
Test and ciTest and ci
Test and ci
 
xUnitTestPattern/chapter7
xUnitTestPattern/chapter7xUnitTestPattern/chapter7
xUnitTestPattern/chapter7
 
Restful web service
Restful web serviceRestful web service
Restful web service
 
C++ Unit Test with Google Testing Framework
C++ Unit Test with Google Testing FrameworkC++ Unit Test with Google Testing Framework
C++ Unit Test with Google Testing Framework
 
Rpc (Distributed computing)
Rpc (Distributed computing)Rpc (Distributed computing)
Rpc (Distributed computing)
 
Distributed Systems Done Right: Why Java Enterprises Are Embracing The Actor ...
Distributed Systems Done Right: Why Java Enterprises Are Embracing The Actor ...Distributed Systems Done Right: Why Java Enterprises Are Embracing The Actor ...
Distributed Systems Done Right: Why Java Enterprises Are Embracing The Actor ...
 
Introduction to Remote Procedure Call
Introduction to Remote Procedure CallIntroduction to Remote Procedure Call
Introduction to Remote Procedure Call
 
RPC에서 REST까지 간단한 개념소개
RPC에서 REST까지 간단한 개념소개RPC에서 REST까지 간단한 개념소개
RPC에서 REST까지 간단한 개념소개
 
KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기
 
협업도구 및 주요 Agile practices 적용사례 v1.0
협업도구 및 주요 Agile practices 적용사례 v1.0협업도구 및 주요 Agile practices 적용사례 v1.0
협업도구 및 주요 Agile practices 적용사례 v1.0
 
Open vSwitch 패킷 처리 구조
Open vSwitch 패킷 처리 구조Open vSwitch 패킷 처리 구조
Open vSwitch 패킷 처리 구조
 
Open vSwitch와 Mininet을 이용한 가상 네트워크 생성과 OpenDaylight를 사용한 네트워크 제어실험
Open vSwitch와 Mininet을 이용한 가상 네트워크 생성과 OpenDaylight를 사용한 네트워크 제어실험Open vSwitch와 Mininet을 이용한 가상 네트워크 생성과 OpenDaylight를 사용한 네트워크 제어실험
Open vSwitch와 Mininet을 이용한 가상 네트워크 생성과 OpenDaylight를 사용한 네트워크 제어실험
 

Similar to Google Protocol buffer

C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발흥배 최
 
코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011Esun Kim
 
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계Sungkyun Kim
 
20201121 코드 삼분지계
20201121 코드 삼분지계20201121 코드 삼분지계
20201121 코드 삼분지계Chiwon Song
 
리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초Yu Yongwoo
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 명신 김
 
어플리케이션 성능 최적화 기법
어플리케이션 성능 최적화 기법어플리케이션 성능 최적화 기법
어플리케이션 성능 최적화 기법Daniel Kim
 
테스트가 뭐예요?
테스트가 뭐예요?테스트가 뭐예요?
테스트가 뭐예요?Kyoung Up Jung
 
Python study 1강 (오픈소스컨설팅 내부 강의)
Python study 1강 (오픈소스컨설팅 내부 강의)Python study 1강 (오픈소스컨설팅 내부 강의)
Python study 1강 (오픈소스컨설팅 내부 강의)정명훈 Jerry Jeong
 
파이썬 스터디 15장
파이썬 스터디 15장파이썬 스터디 15장
파이썬 스터디 15장SeongHyun Ahn
 
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 TestOkjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 Testbeom kyun choi
 
PHP Log Tracking with ELK & Filebeat part#2
PHP Log Tracking with ELK & Filebeat part#2PHP Log Tracking with ELK & Filebeat part#2
PHP Log Tracking with ELK & Filebeat part#2Juwon Kim
 
About Visual C++ 10
About  Visual C++ 10About  Visual C++ 10
About Visual C++ 10흥배 최
 
The Future of .NET and C#
The Future of .NET and C#The Future of .NET and C#
The Future of .NET and C#명신 김
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSCirculus
 
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택JinTaek Seo
 
파이썬+네트워크 20160210
파이썬+네트워크 20160210파이썬+네트워크 20160210
파이썬+네트워크 20160210Yong Joon Moon
 

Similar to Google Protocol buffer (20)

C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발C#을 사용한 빠른 툴 개발
C#을 사용한 빠른 툴 개발
 
코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011코드 생성을 사용해 개발 속도 높이기 NDC2011
코드 생성을 사용해 개발 속도 높이기 NDC2011
 
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
 
20201121 코드 삼분지계
20201121 코드 삼분지계20201121 코드 삼분지계
20201121 코드 삼분지계
 
리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14
 
어플리케이션 성능 최적화 기법
어플리케이션 성능 최적화 기법어플리케이션 성능 최적화 기법
어플리케이션 성능 최적화 기법
 
Jdk 7 3-nio2
Jdk 7 3-nio2Jdk 7 3-nio2
Jdk 7 3-nio2
 
테스트가 뭐예요?
테스트가 뭐예요?테스트가 뭐예요?
테스트가 뭐예요?
 
Python study 1강 (오픈소스컨설팅 내부 강의)
Python study 1강 (오픈소스컨설팅 내부 강의)Python study 1강 (오픈소스컨설팅 내부 강의)
Python study 1강 (오픈소스컨설팅 내부 강의)
 
파이썬 스터디 15장
파이썬 스터디 15장파이썬 스터디 15장
파이썬 스터디 15장
 
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 TestOkjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
 
PHP Log Tracking with ELK & Filebeat part#2
PHP Log Tracking with ELK & Filebeat part#2PHP Log Tracking with ELK & Filebeat part#2
PHP Log Tracking with ELK & Filebeat part#2
 
04 프로세스
04 프로세스04 프로세스
04 프로세스
 
About Visual C++ 10
About  Visual C++ 10About  Visual C++ 10
About Visual C++ 10
 
The Future of .NET and C#
The Future of .NET and C#The Future of .NET and C#
The Future of .NET and C#
 
Electron forge
Electron forgeElectron forge
Electron forge
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JS
 
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택
 
파이썬+네트워크 20160210
파이썬+네트워크 20160210파이썬+네트워크 20160210
파이썬+네트워크 20160210
 

More from knight1128

Hancom MDS Conference - KAKAO DEVOPS Practice (카카오 스토리의 Devops 사례)
Hancom MDS Conference - KAKAO DEVOPS Practice (카카오 스토리의 Devops 사례)Hancom MDS Conference - KAKAO DEVOPS Practice (카카오 스토리의 Devops 사례)
Hancom MDS Conference - KAKAO DEVOPS Practice (카카오 스토리의 Devops 사례)knight1128
 
Spring MVC 3 Restful
Spring MVC 3 RestfulSpring MVC 3 Restful
Spring MVC 3 Restfulknight1128
 
Jersey framework
Jersey frameworkJersey framework
Jersey frameworkknight1128
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicknight1128
 
Jdk(java) 7 - 6 기타기능
Jdk(java) 7 - 6 기타기능Jdk(java) 7 - 6 기타기능
Jdk(java) 7 - 6 기타기능knight1128
 
Jdk 7 4-forkjoin
Jdk 7 4-forkjoinJdk 7 4-forkjoin
Jdk 7 4-forkjoinknight1128
 
공유 Jdk 7-2-project coin
공유 Jdk 7-2-project coin공유 Jdk 7-2-project coin
공유 Jdk 7-2-project coinknight1128
 
공유 Jdk 7-1-short introduction
공유 Jdk 7-1-short introduction공유 Jdk 7-1-short introduction
공유 Jdk 7-1-short introductionknight1128
 
아마존 Aws 서비스_연구
아마존 Aws 서비스_연구아마존 Aws 서비스_연구
아마존 Aws 서비스_연구knight1128
 
구글크롬Os
구글크롬Os구글크롬Os
구글크롬Osknight1128
 
하이브리드앱
하이브리드앱하이브리드앱
하이브리드앱knight1128
 
오픈소스를 활용한 Batch_처리_플랫폼_공유
오픈소스를 활용한 Batch_처리_플랫폼_공유오픈소스를 활용한 Batch_처리_플랫폼_공유
오픈소스를 활용한 Batch_처리_플랫폼_공유knight1128
 
Ssl 하드웨어 가속기를 이용한 성능 향상
Ssl 하드웨어 가속기를 이용한 성능 향상Ssl 하드웨어 가속기를 이용한 성능 향상
Ssl 하드웨어 가속기를 이용한 성능 향상knight1128
 

More from knight1128 (17)

Hancom MDS Conference - KAKAO DEVOPS Practice (카카오 스토리의 Devops 사례)
Hancom MDS Conference - KAKAO DEVOPS Practice (카카오 스토리의 Devops 사례)Hancom MDS Conference - KAKAO DEVOPS Practice (카카오 스토리의 Devops 사례)
Hancom MDS Conference - KAKAO DEVOPS Practice (카카오 스토리의 Devops 사례)
 
Comet
CometComet
Comet
 
Apache Thrift
Apache ThriftApache Thrift
Apache Thrift
 
Redis
RedisRedis
Redis
 
Spring MVC 3 Restful
Spring MVC 3 RestfulSpring MVC 3 Restful
Spring MVC 3 Restful
 
Jersey framework
Jersey frameworkJersey framework
Jersey framework
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamic
 
Jdk(java) 7 - 6 기타기능
Jdk(java) 7 - 6 기타기능Jdk(java) 7 - 6 기타기능
Jdk(java) 7 - 6 기타기능
 
Jdk 7 4-forkjoin
Jdk 7 4-forkjoinJdk 7 4-forkjoin
Jdk 7 4-forkjoin
 
공유 Jdk 7-2-project coin
공유 Jdk 7-2-project coin공유 Jdk 7-2-project coin
공유 Jdk 7-2-project coin
 
공유 Jdk 7-1-short introduction
공유 Jdk 7-1-short introduction공유 Jdk 7-1-short introduction
공유 Jdk 7-1-short introduction
 
아마존 Aws 서비스_연구
아마존 Aws 서비스_연구아마존 Aws 서비스_연구
아마존 Aws 서비스_연구
 
속도체크
속도체크속도체크
속도체크
 
구글크롬Os
구글크롬Os구글크롬Os
구글크롬Os
 
하이브리드앱
하이브리드앱하이브리드앱
하이브리드앱
 
오픈소스를 활용한 Batch_처리_플랫폼_공유
오픈소스를 활용한 Batch_처리_플랫폼_공유오픈소스를 활용한 Batch_처리_플랫폼_공유
오픈소스를 활용한 Batch_처리_플랫폼_공유
 
Ssl 하드웨어 가속기를 이용한 성능 향상
Ssl 하드웨어 가속기를 이용한 성능 향상Ssl 하드웨어 가속기를 이용한 성능 향상
Ssl 하드웨어 가속기를 이용한 성능 향상
 

Google Protocol buffer

  • 1. 구글’sProtocol Buffer Knight76 at gmail.com 김용환
  • 2. 개념 RPC와 쉽게 연동, Not RPC 하나의 개념으로 다양한 언어에서 쓸 수 있게구글에서 다양한 언어별로 개발 하다 보니. 통신을 위한 단일 표준이 필요 Proto 파일 (structed data) Proto Compiler C++ Java python
  • 3. References Protocol Buffers: A new open source release http://www.youtube.com/watch?v=K-e8DDRwVUg Home Page http://code.google.com/p/protobuf/
  • 4. Protocol Buffer 이야기 Not socket 구글 에서 2008년 7월 발표 이슈 제시 XML 문제 Parsing, serialization (debugging) Portable : IDL처럼사용 Heavy Optimization Language 지원 짧은 데이터의 송수신 용도/긴 데이터 송수신이 목표가 아님 http://google-opensource.blogspot.com/2008/07/protocol-buffers-googles-data.html
  • 5. XML보다 좋은 장점 Simple 3~10배 작음 20~100배 속도 빠름 모호하지 않음 바로 프로그램에 사용하기 쉬움 http://code.google.com/intl/ko-KR/apis/protocolbuffers/docs/overview.html
  • 6. 어디서 쓰고 있나? 구글 원래 index server request/response protocol로 사용했었음 48,162 different message types 12,183 .proto files 다양한 회사 국내/외 게임회사의 통신
  • 7. 장점 쓰기 편함 Stub 코드 자동 생성 통신에서 가져야 할 보편적 특성을 다 추가 Serializing, Parsing 지원 코드 일치 클라이언트/서버 코드 동일 IDL 형태로 정의가 단순 Portable 클래스 또는 struct디자인 언어 지원 java, c++, python 3rd party lib (많은 언어 지원. http://code.google.com/p/protobuf/wiki/ThirdPartyAddOns#RPC_Implementations) 배우기 쉬움 이클립스플러그인 존재 Lite 버전 개발 가능 Good Document BSD license 언어마다 특화되고 쓰기 편한 특징을 제공
  • 8. 단점? Output이 binary만 존재 PB의 Reflection을 이용해서 json으로 전달 가능 Map, set 지원 없음
  • 10. 개발환경 구성 Download proto compiler in google code (Option) eclipse plugin
  • 11. 설치 Proto compiler 설치 http://code.google.com/p/protobuf/downloads/list
  • 13. Eclipse 플러그인 사용 #1 Protoclips업데이트 주소 http://protoclipse.googlecode.com/svn/trunk/site/ Windows-Preference-ProtoBuf Plugin Perferences화면에서 protoc.exe compiler가 설치된 path를 넣는다.
  • 14. Eclipse 플러그인 사용 #2 PB 컴파일 환경 구축 Project 오른쪽 버튼 -> Add Google ProtoBuf Compiler Nature 선택
  • 15. Eclipse 플러그인 사용 #3 src/test.proto파일 생성 test/Test.java 파일이 자동으로 생성 But, PB의 lib가 있어야 컴파일이 될 것임 직접 다운받거나 maven 이용! http://repo2.maven.org/maven2/com/google/protobuf/protobuf-java/
  • 16. Eclipse 플러그인 사용 #4 Pom.xml <dependencies> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>2.4.1</version> </dependency> </dependencies>
  • 17. Eclipse 플러그인 사용 #4 컴파일 완료된 것 확인
  • 19. PB Format->소스 전환 // text.txt package test; message Request { required string command = 1; optional string param = 2; } /cygdrive/c/protocolbuffer $ ./protoc.exe test.txt --java_out=. Test폴더 생기고TestTxt.java 생성됨 (17KB, Protocol buffer 내부 클래스 사용) naming // c++ out test.txt.pb.cc (12K) test.txt.pb.h (8K) // python out test/txt_pb2.py (2K)
  • 21. 생성된 자바코드 Descriptor 지원 internal_static_test_Request_descriptor Reflection 지원 Message / Message.Builder interfaces. Json처럼 프로토콜로 변경 가능 (ajax가능) 메시지 수정시 하위 호환 보장, 새로운 메시지로 변경되면 기존 코드에 대한 필드만 처리 파일이름을 디폴트로 해서 소스를 생성하지만, 내가 원하는 클래지 이름과 클래스 이름의 개별 지정이 가능 option java_package = "com.example.foo.bar"; option java_outer_classname = “ProtocolData"; PB의 Enum은 java의 enum으로 변경
  • 22. 크기 제한 디폴트로 크기 제한 64 MB 속도를 최적화 또는악의를 가진 사용자로부터 보호하기 위해서 크기를 제한할 수 있음 CodedInputStream/CodedOutputStream(ZeroCopyInputStream/ZeroCopyOutputStream ) SetTotalBytesLimit메소드
  • 23. 유의할 점 package 선언 클래스 파일 이름 운영을 위한 파일명 .proto message 등록 Protocol buffer language guide Protoc.exe(컴파일러)에 의해 만들어진 java, python, c++코드는 고치지 말아야 한다.(immutable) protoc에서 컴파일 되면, 자동으로 accessor가 붙는다. get/set/has…
  • 24. message package Type Bool, int32, uint32, float, double, string, bytes, …. Enum Nested type Default value importing Modifier required : 반드시 사용해야 할 필드. 미초기화된 상태미초기화된 메시지를 빌드하면RuntimeException, 초기화되지 않은 메시지를 파싱하면서에러나면IOException발생 optional : option의 개념 hasXXX() 로확인 Repeated : 0을 포함하는 개수를 계속 넣을 수 있음 List객체로 구현됨
  • 25. message 번호를 반드시 주는 이유 번호를 주지 않으면 protoc에러발생 Write/Read 할 때, serialization 순서를 주기 위함 필드 정보가 set되었는지 쉽게 알기 위함(내부적으로 bit 연산함)
  • 26. Versioning 정보가 없는 이유 새로운 필드를 언제든지 추가 될 수 있음 모든 정보를 볼 필요 없이 필요한 정보만 파싱할 수 있도록 함 But, java는 기본으로 존재하지 않지만, c++은 존재한다. 링킹 이슈.(GOOGLE_PROTOBUF_VERIFY_VERSION 매크로) Incompatible한 버전 때문에 문제가 없도록 해야 함
  • 28. DEMO #1 - 0 PB 코드 // text.txt package test; message Request { required string command = 1; optional string param = 2; }
  • 29. DEMO #1 -1 package com.example.test; import java.io.FileOutputStream; import test.Test.Request; public class Writer { public static void main(String[] args) throws Exception { Request request = Request.newBuilder() .setCommand("commit") .setParam("every files") .build(); FileOutputStreamoutput = new FileOutputStream("r.os"); request.writeTo(output); output.close(); } }
  • 30. DEMO #1 -2 package com.example.test; import java.io.FileInputStream; import test.Test.Request; public class Reader { public static void main(String[] args) throws Exception { Request request = Request.parseFrom(new FileInputStream("r.os")); System.out.println("command : " + request.getCommand()); if (request.hasParam()) { System.out.println("params : " + request.getParam()); } } }
  • 31. DEMO #1 -3 command : commit params : every files
  • 32. package tutorial; option java_package = "com.example.tutorial"; option java_outer_classname = "AddressBookProtos"; message Person { required string name = 1; required int32 id = 2; optional string email = 3; enumPhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4; } message AddressBook { repeated Person person = 1; } DEMO #2
  • 33. DEMO #3 – 1생성된 c++코드를 이용해서 코딩 #include <iostream> #include <fstream> #include <string> #include "test.pb.h" using namespace std; int main(intargc, char* argv[]) { Request request; request.set_command("init"); request.set_param("0"); fstream out("streams", ios::out | ios::binary | ios::trunc); request.SerializeToOstream(&out); out.close(); return 1; }
  • 34. DEMO #3 – 1생성된 c++코드를 이용해서 코딩 #include <iostream> #include <fstream> #include <string> #include "test.pb.h" using namespace std; int main(intargc, char* argv[]) { Request request; fstream in(“streams", ios::in | ios::binary);  if (!request.ParseFromIstream(&in)) {   cerr << "Failed to parse streams." << endl;   exit(1);  }   cout << “command: " << request.command() << endl;  if (request.has_param()) {   cout << “param: " << request.param() << endl;  } }
  • 36. Protocol Buffer Language Guide http://code.google.com/intl/ko-KR/apis/protocolbuffers/docs/proto.html
  • 39. 다른 솔루션과 속도 비교 https://github.com/eishay/jvm-serializers/wiki 프로토콜 버퍼의 속도는여기에 위치(일반 json/xml보다 빠름)