일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- CloudFunction
- heap
- 네트워크와 분산 시스템
- 요리책
- PubSub
- 연습문제
- github access token
- github personal access token
- JSON encoding
- GCP PubSub
- 브라우저 JSON 인코딩
- Python
- 알고리즘
- 가상 메모리 기초
- 문제 풀이
- 코딩테스트
- Java
- 요리책 운영체제
- Algorithm
- 물리 메모리 관리
- github 403
- 운영체제
- CPU 스케줄링
- github push 403
- 스프링 APPLICATION_JSON_UTF8
- chapter8
- JSON UTF-8
- codingtest
- chapter7
- 브라우저 JSON encoding
- Today
- Total
이도(李裪)
Protocol Buffers(protobuf) in Java 본문
공부하면서 연습한 코드는 깃허브에 올려두었습니다
프로토콜 버퍼 (Protocol Buffers, Protobuf)는 구글이 개발한 구조화된 데이터를 직렬화하는 방식입니다.
프로토콜 버퍼를 사용하는 이유
데이터를 직렬화(serialize)하고 구조화된 데이터를 주고 받을 때 다음과 같은 방법을 생각해볼 수 있습니다.
1. Java Serialization
- 다른 언어와 데이터를 주고 받을 때 잘 동작하지 않습니다
2. ad-hoc way (특별한 목적을 위해서 정의하고 사용하는 방식)
- 데이터를 특정한 문제를 풀기 위해 (예를들어 encoding 4 ints로 만드는 경우 ex. 12:3:-23:67)
- 내부에서 사용하려는 목적으로 간단하게 ad-hoc 방식은 간단한 메시지의 경우에는 빠르고 좋은 결과를 낼 수 있지만
- 복잡한 메시지의 경우에는 메시지를 만들어 내기가 어렵다
- 범용성도 떨어진다
3. XML, JSON 형식
- 사람이 읽기 좋다
- 언어별로 라이브러리가 잘 되어있다
- verbose해서 메모리 공간을 많이 잡아먹고 encoding/decoding 할 때 퍼포먼스 측면에서 자원을 많이 쓴다
프로토버퍼는 .proto 파일을 작성하고 compiler를 실행하면 해당 언어로 encoding, parsing을 해주는 클래스 파일을 생성해줍니다. 유명한 언어 대부분을 지원하고 있습니다 (C++, C#, GO, Java, Kotlin, Python, Dart,,)
Protobuf2 문법
syntax = "proto2";
message Person {
optional string name = 1;
optional int32 id = 2;
optional string email = 3;
}
message AddressBook {
repeated Person people = 1;
}
Person, AddressBook은 메시지 클래스입니다
"=1", "=2"는 binary encoding에 사용되는 태그입니다
- optional: 선택적 필드입니다.
- repeated: 반복해서 등장하는 필드입니다 (0번 이상 반복). 순서가 보장됩니다.
- required: 필수 필드입니다
required 필드는 한번 사용되면 나중에 칼럼을 제거하거나 변경하기가 어렵기 때문에 매우 신중하게 사용해야합니다. 그래서 구글 사내에서는 required 선호도가 매우 떨어집니다. protobuf3 문법에서는 required가 없습니다.
(개인적인 생각: 일리가 있는 생각입니다만 모든 칼럼을 optional로 사용하면 해당 필드가 필수인지 선택인지 알 수 있는 방법이 없다고 생각합니다. 칼럼이 수정/삭제가 있으면 전파되는 것은 다른 방법으로 처리하면 좋을 거 같습니다. 즉, 두개는 다른 문제로 접근했으면 더 좋겠다고 생각합니다)
Compiling Protocol Buffers
1. protoc 설치
(1) Mac
- brew install protobuf
(2) windows
- https://github.com/protocolbuffers/protobuf/releases 에서 윈도우 실행파일을 다운로드 받습니다
(protoc-3.xx.x-win64.zip)
- 환경변수에 등록합니다
2. protoc를 실행합니다
# protoc --java_out={자바 클래스를 만들 경로} {.proto 파일 경로}
protoc --java_outsrc/main/java ./src/main/java/com/example/tutorial/schema/addressbook.proto
실행결과
option java\_package = "com.example.tutorial.addressbook.domain";
으로 생성될 패키지를 설정했습니다
protoc --java\_out=src/main/java ./src/main/java/com/example/tutorial/schema/addressbook.proto
커맨드로 .protobuf를 컴파일 하면 다음과 같은 파일이 생성되고 다음과 같은 구조가 됩니다
refer
'개발' 카테고리의 다른 글
요리책 운영체제. Chapter 1 운영체제와 컴퓨터 연습문제 풀이 (0) | 2021.09.21 |
---|---|
GCP Pub/Sub with Spring Boot (0) | 2021.09.08 |
GitHub 403 Error. Access Token 설정 방법 (0) | 2021.08.14 |
브라우저별 JSON default encoding (0) | 2021.08.14 |
자바 문자열 해시코드 - Java String hash code (0) | 2021.08.01 |