Rwt seoul 4 cover

실시간 데이터베이스 비교: Realm 모바일 플랫폼 vs. Firebase

이번 Realm World Tour 2017 행사는 여러 도시에서 열리는 Realm 소개 행사로써, 한국에서는 서울과 부산에서 진행됐습니다. 실시간 데이터베이스인 Realm 모바일 플랫폼과, RMP와 가장 유사하다고 생각하는 Firebase에 대해 비교해가면서 알려주는 게스트 스피커, 문상준 님의 세션입니다.


리액티브?

Erik Meijer는 MS에서 LINQ, RxJava, RxSwift, Reactive Cocoa 등 Rx Extension 기반 기술을 설계하는 데 많은 영향을 주었습니다. Erik Meijer의 강의를 소개하면서 시작하겠습니다.

“When you want to stay up to date, push not pull”

실시간 데이터를 구현하려면 pull이 아니라 push를 해야 한다는 얘기입니다. 그렇다면 pull이란 무엇일까요?

Pull Driven

pull to refresh 방식을 생각하면 됩니다. 사용자가 데이터를 요청할 시점이 될 때 pull 해서 새로 고침이 되는 거죠. 이런 pull 방식의 문제점을 버스의 예로 생각해 보겠습니다. 버스 오는 시간이 5분이 남았는데 어떤 사용자가 계속 당겨서 새로 고침을 한다면 자원이 낭비되겠죠. 또 버스 막차 시간이 지났는데 계속 당겨서 새로 고침을 하는 것도 시점에 맞지 않습니다. 정확하게 정보가 오지 않으니 이 또한 자원 낭비입니다. 혹은 버스 시간이 3분이 남았다고 안심하고 다른 일을 하고 있다가 버스가 지나가 버릴 수도 있겠죠. 그 상황에서 다시 당겨서 새로 고침을 하면 다음 버스가 3분이 남았다는 안내가 뜰 수도 있습니다. 이렇게 Pull Driven 방식은 너무 빠른 자원 요청이나 시점이 맞지 않는 문제, 필요한 시점에 알림이 오지 않는다는 문제가 있습니다.

Push Driven

이런 Pull 방식을 보완하기 위해 Push 방식이 나왔습니다. Push Notification을 생각하면 이해가 쉬운데요. 어떤 상태의 변화가 서버 단에서 발생하면 클라이언트 등 관련 서비스에 알려주는 방식입니다.

이런 개발 뉴스를 더 만나보세요

이런 Push driven 방식을 이용해서 실시간 데이터 동기화를 해주는 서비스들이 등장하기 시작했습니다. 대표적으로 Realm 모바일 플랫폼(RMP)과 Google Firebase Real-time Database가 있으므로 유사점과 차이점을 살펴보겠습니다.

클라이언트 단 구현 방식 - Realm 모바일 플랫폼

Realm 인증

reactive-db-realm-auth

Credential을 만들고 함수를 만들어서 인증 서버에 인증을 요청해서 로그인하는 과정입니다.

Realm 환경 설정

reactive-db-realm-config

Configuration은 Realm 오브젝트 서버가 나오기 전에는 맨 윗줄처럼 사용했는데, SyncServer를 도입하려면 SyncConfiguration을 통해 설정합니다. 기존에 Realm을 사용한 프로젝트가 있다면 코드가 크게 바뀌는 부분이 없습니다. 로그인과 Realm Sync 서버 환경 설정만 추가하면 기존 프로젝트 코드 구조를 그대로 활용할 수 있습니다. 래퍼에 관한 자세한 내용은 Track Santa 영문 튜토리얼을 참고해 주세요.

reactive-db-realm-config-wrapper

래퍼를 구성하고 호출하는 코드입니다. realmManager라는 이름으로 인스턴스를 만들어서 로그인을 호출하고, 성공한 인증 사용자인 경우 SyncServer를 사용하도록 합니다. santaRealmURL의 URL을 바꾸면 다른 Sync 서버를 구동할 수 있겠죠.

Realm 데이터 동기화

Swift의 경우, 데이터 동기화는 기존에 사용했던 KVO뿐만 아니라 Realm, Collection, Object 등의 알림을 이용해서 구성하면 됩니다.

reactive-db-realm-sync

간단하게 Object 알림을 이용한 코드입니다. stepCounter라는 Realm 모델에 addNotificationBlock으로 변화를 감지하도록 합니다. 클로저에 전달된 change는 enumeration 타입이기 때문에 change에 해당되는 케이스에서 동기화를 처리하였습니다.

클라이언트 단 구현 방식 - Firebase

다음으로 Firebase를 살펴보겠습니다. 전체적인 로직과 절차는 RMP와 비슷하고 약간의 코드만 달라집니다.

Firebase 환경 설정

reactive-db-fb-config

application delegate에서 configure만 호출하면 GoogleService-Info.plist로부터 기본 설정값을 참조하여 동기화에 필요한 환경을 설정해줍니다. 인증된 사용자만 사용하도록 규칙을 적용할 수도 있습니다. 만약 authtrue로 설정하면 아무나 사용할 수 있게 됩니다.

Firebase 인증

reactive-db-fb-auth

Google SignIn 라이브러리로 인증하는 코드입니다. RMP와 유사한 로직입니다.

Firebase 데이터 동기화

reactive-db-fb-sync

Firebase는 JSON을 기반으로 합니다. 데이터 동기화 부분은 처음에 데이터베이스 레퍼런스를 얻은 다음에 Condition이라는 노드를 감시하고 있다가 값이 변경되면 아래 구문을 실행합니다. deinit에서는 removeObserver를 호출하여 메모리 유출을 방지했습니다.

Realm 모바일 데이터베이스와 Firebase 차이점

먼저 데이터 구조를 살펴보면 Realm은 Realm Model을 기반으로 합니다. Firebase는 JSON을 기반으로 하며 클라우드에서 구성해줘야 합니다. RMP 유료 버전은 이벤트 핸들링이 지원되지만 Firebase는 지원되지 않는다는 차이가 있습니다. 하지만 Firebase는 콘솔 창에서 초기화하는 기능을 지원하고 있습니다.

두 모델 모두 오프라인 우선 기능을 지원하므로 인터넷 연결이 끊겼다가 네트워크가 활성화되면 동기화가 유지되는 구조로 되어 있습니다.

결론

앞으로 서버 단은 Push Driven으로 이동할 것으로 보입니다. 클라이언트 단에서는 인증과 설정, 데이터 동기화를 이용해서 이런 동기화가 가능합니다. 이렇게 만드는 이유는 앱을 좀 더 편하게 개발하도록 하기 위해서입니다. 앞서 봤듯 데이터 동기화를 할 때 네트워크 요청이 따로 없이 Observer나 Notification 등을 통해 데이터가 변경되는지만 감시하고 있다가 변경이 되면 이를 반영하면 됩니다. 리액티브 데이터베이스와 함께 더욱 편리하게 앱을 만들어 보세요.


모바일 개발자가 더 나은 앱을 더 빠르게 만들도록 돕는 Realm 모바일 데이터베이스와 Realm 모바일 플랫폼을 통해 핵심 로직에 집중하고 개발 효율을 높여 보세요! 공식 문서에서 단 몇 분 만에 시작할 수 있습니다. 또한 Realm 홈페이지에서는 모바일 개발자를 위한 다양한 최신 기술 뉴스와 튜토리얼을 제공하고 있으니 즐겨찾기하고 자주 들러 주세요!

다음: Realm Mobile Platform으로 실시간 협업 기능과 확장이 가능한 리액티브 앱을 만들어 보세요.

General link arrow white

컨텐츠에 대하여

이 컨텐츠는 저자의 허가 하에 이곳에서 공유합니다.

4 design patterns for a RESTless mobile integration »

close