관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 1. Protobuf (프로토콜 버퍼) 사용 방법 - 개념, 설치 본문

iOS framework

[iOS - swift] 1. Protobuf (프로토콜 버퍼) 사용 방법 - 개념, 설치

jake-kim 2022. 8. 7. 23:43

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 컴파일러 설치

  • 압출을 풀면 bin파일 안에 있는 protoc 파일 확인

  • 로컬 바이너리 경로에 복사 붙여넣기
cp protoc /usr/local/bin
  • 복사 되었는지 확인
open /usr/local/bin

위 protoc > 오른쪽 클릭 > 다음으로 열기 > "터미널(기본)" 클릭 > 개발자 허용 설정 확인

  • google.proto 타입들을 import하고 사용하기위해서 include 디렉토리도 복사 (/usr/local/ 하위로 복사)

 cp -R include /usr/local/

include 폴더도 복사 완료

  • 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

만들어진 DataModel.pb.swift 파일

  • 드래그하여 프로젝트 타겟에도 추가

  • 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://android.googlesource.com/platform/external/protobuf-javalite/+/da247c697d4164fd5ec84f56050890e6469d6edb/docs/swift/DesignDoc.md

* 전체 코드: https://github.com/JK0369/ExProtobuf

 

* 참고

https://github.com/apple/swift-protobuf

Comments