Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- SWIFT
- map
- UITextView
- Clean Code
- 리팩토링
- uitableview
- HIG
- rxswift
- tableView
- combine
- collectionview
- Refactoring
- Protocol
- ios
- 클린 코드
- 애니메이션
- Xcode
- MVVM
- Observable
- clean architecture
- 리펙터링
- 리펙토링
- ribs
- swiftUI
- Human interface guide
- swift documentation
- RxCocoa
- 스위프트
- uiscrollview
- UICollectionView
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] 1. Protobuf (프로토콜 버퍼) 사용 방법 - 개념, 설치 본문
1. Protobuf (프로토콜 버퍼) 사용 방법 - 개념, 설치
2. Protobuf (프로토콜 버퍼) 사용 방법 - Xcode 자동화, Build script, Shell Script 연동
기본 지식) 직렬화 (Seirialize)
(protobuf는 직렬화 기술중에 하나이므로 직렬화에 관한 이해가 필요)
- 객체의 내용을 binary file로 만드는 것
- 객체의 내용을 byte 단위로 변환하여, 송수신이 가능하도록 하는 것을 의미
- 서버, iOS, 안드로이드 등 모두 데이터를 주고 받을 때 형식을 Int, String 등의 형태로 주고받을 수 있지만, Int만해도 메모리의 크기를 다 다르게 점유하므로 공통된 형식이 필요
- 공통된 형식인 byte단위의 데이터를 주고 받게된다면 모두 byte로 받아서 필요한 데이터로 변환하여 사용하면 편리
Protobuf 개념
- "프로토콜 버퍼" (Protocol buffer)
- 인터페이스의 의미를 가지고 있는 프로토콜에, 주고받는데 사용되므로 버퍼라는 단어가 합쳐져서 생겨난 것
- Protobuf가 생겨난 이유
- 안정성: 서버에서 어떤 api를 구현하고 클라이언트 개발자에게 형식을 알려주었을때, 클라이언트 쪽에서는 그 형식을 기억하고 손으로 코딩하다보면 오타나, 다르게 입력하는 실수가 존재하지만 Protobuf를 사용하면 코드가 자동생성되어 안전
- 스키마 기반: 별도의 .proto 스키마 파일에 데이터 구조를 정의하면 통신 규칙을 명확하게 문서화가 가능
- 관용성: Apple에서 만든 SwiftProtobuf는 Swift언어를 사용
- 직렬화, 역직렬화가 간편: 직렬화를 위한 .serializaedData() 메서드는 Data를 반환하고, 다시 역직렬화를 하고 싶은 경우에는 init(serializedData:)를 사용하여 간편하게 변환 가능
- JSON 변환이 간편: init(jsonUTF8Dat:)를 통해 쉽게 JSON 파일로 변경이 가능
Protobuf 사용 준비 (protobuf 컴파일러, generator 설치)
- 환경
- Swift 5.0이상 (Xcode 10.2 이상)
- Protobuf 컴파일러 설치
- Protobuf 릴리즈에서 protoc-xxx-osx-x86_64.zip을 다운
- 압출을 풀면 bin파일 안에 있는 protoc 파일 확인
- 로컬 바이너리 경로에 복사 붙여넣기
cp protoc /usr/local/bin
- 복사 되었는지 확인
open /usr/local/bin
위 protoc > 오른쪽 클릭 > 다음으로 열기 > "터미널(기본)" 클릭 > 개발자 허용 설정 확인
- google.proto 타입들을 import하고 사용하기위해서 include 디렉토리도 복사 (/usr/local/ 하위로 복사)
cp -R include /usr/local/
- Code auto generator 설치
git clone https://github.com/apple/swift-protobuf.git
cd swift-protobuf
- 설치할 버전 확인
git tag -l
- protoc-gen-swift 바이너리 파일 설치
- 최신 버전 1.9.0 체크아웃 후 플러그인을 빌드
git checkout tags/1.9.0
swift build -c release
- 만들어진 protoc-gen.swift파일 확인
cd .build/release
open .
- 로컬 바이너리 경로에 복사 붙여넣기하면 준비 완료
cp protoc-gen-swift /usr/local/bin
- 개발자 허용 설정
- open /usr/local/bin
- protoc-gen-swift > 오른쪽 마우스 클릭 > 열기하여 개발자 허용 설정
Protobuf 사용 방법
- Cocoapod을 사용하여 SwiftProtobuf 설치
- Cocoapod이 아닌 다른 방법은 이곳 참고
pod 'SwiftProtobuf'
- .proto 파일 생성 (디렉토리는 아무곳이나 상관 없지만, 편의를 위해 프로젝트 루트에다가 생성)
vi DataModel.proto
syntax = "proto3";
message BookInfo {
int64 id = 1;
string title = 2;
string author = 3;
}
- 위 .proto파일을 .swift파일로 변환
protoc --swift_out=. DataModel.proto
- 드래그하여 프로젝트 타겟에도 추가
- DataMode.pb.swift파일을 보면 자동으로 import SwiftProtobuf가 되어있고, 데이터 모델이 자동으로 생성된 것을 확인 가능
- 데이터 모델 직렬화, 역직렬화 사용 방법
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let bookInfo = BookInfo.with {
$0.id = 1234
$0.title = "This is title"
$0.author = "Jake"
}
do {
// 직렬화 (Data 포멧으로)
let binaryData = try bookInfo.serializedData()
// 역직렬화 (BookInfo 타입으로)
let decoededInfo = try BookInfo(serializedData: binaryData)
// 직렬화 (json 형태인 Data 포멧으로)
let jsonData = try bookInfo.jsonUTF8Data()
// 역직렬화 (BookInfo 타입으로)
let receivedFromJson = try BookInfo(jsonUTF8Data: jsonData)
} catch {
print(error)
}
}
}
cf) protobuf 타입
* 전체 코드: https://github.com/JK0369/ExProtobuf
* 참고
'iOS framework' 카테고리의 다른 글
Comments