Rwt seoul 2 fb

Realm 모바일 데이터베이스와 Realm 모바일 플랫폼을 소개합니다.

이번 Realm World Tour 2017 행사는 여러 도시에서 열리는 Realm 소개 행사로써, 한국에서는 서울과 부산에서 진행됐습니다. Realm 모바일 데이터베이스와 Realm 모바일 플랫폼의 장단점과 간단한 API에 대한 소개입니다.


Realm 모바일 데이터베이스

Realm 모바일 데이터베이스는 SQLite와 CoreData를 대체할 수 있는 크로스 플랫폼 모바일 데이터베이스로 무료 오픈소스로 제공됩니다.

rwt-seoul-core

Realm 모바일 데이터베이스는 최신 모바일 애플리케이션을 업그레이드하기 위해 처음부터 새롭게 고유 C++ 코어를 만들어서 구축됐으므로 성능이 좋고 빠르며, iOS 뿐만 아니라 안드로이드, React Native, Xamarin 등 여러 플랫폼에서 사용할 수 있습니다. Realm 모바일 데이터베이스를 사용하면 데이터 모델을 따로 만들고 않고도 리액티브 데이터 레이어를 쉽게 구현할 수 있으며 성능이 최적화된 앱 개발에 도움이 됩니다.

Realm 모바일 데이터베이스의 핵심은 라이브 오브젝트입니다. 항상 최신 상태를 유지하기 때문에 새로고침을 할 필요가 없으며 리액티브 데이터 모델을 구축해서 쉽고 빠르게 반응형 앱을 만들 수 있습니다.

Realm 모바일 데이터베이스 기본 API

rwt-seoul-rmd-api

Realm 모바일 데이터베이스는 모든 앱을 위해 견고한 기반을 만들어 줍니다. 기반이 되는 API를 몇 가지 살펴볼까요?

객체 (Object)

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

Realm을 사용하면 객체를 작업하게 됩니다. 데이터베이스 모델을 사용하기 위해 다른 형식으로 변환할 필요가 전혀 없고, Realm 기본 클래스를 확장해서 그대로 디스크에 저장할 수 있습니다. 클래스에서는 데이터 속성, 메서드 등등 필요한 것을 일반 클래스 객체처럼 사용하면 됩니다.

class Dog: Object {
  dynamic var age: Int = 0
  dynamic var owner: Person?
}
public class Dog extends RealmObject {
  private int age;
  private Person owner;
}

Swift와 Java로 각각 int인 나이와, Person 타입인 주인을 갖는 개 모델을 생성했습니다. 개 주인을 속성으로 설정해서 개와 주인의 일 대 일 혹은 다 대 일 관계를 쉽게 만들 수 있습니다.

쿼리 (Query)

다음으로는 객체로 구성된 동적 쿼리를 정의할 수 있습니다. Realm은 결과 데이터를 메모리에 복사하지 않고 단순히 디스크의 저장소에 동적 뷰를 작성하므로 항상 최신으로 유지됩니다.

let puppies = realm
  .objects(Dog.self)
  .filter("age < 2")
RealmResults<Dog> puppies = realm
  .where(Dog.class)
  .lessThan("age", 2)
  .findAll();

나이가 2살보다 어린 개의 데이터를 모두 찾는 쿼리입니다. filter 혹은 lessThan을 사용하지 않으면 전체 개의 데이터를 모두 쿼리하게 됩니다. 쿼리 문법이 매우 명료하고 가독성이 높으며, 앞서 말한 대로 puppies에 쿼리를 하는 시점에 데이터가 들어가는 것이 아니라, 실제로 puppies를 순회하면서 데이터에 접근하는 시점에 디스크의 데이터를 읽어오므로 쿼리의 결과는 항상 최신 상태를 유지합니다.

알림 (Notification)

이렇게 쿼리로 결과나 목록을 구성하는 객체가 생성됐습니다. 하지만 항상 최신 상태이므로 UI를 갱신하려면 이 객체가 업데이트될 때 알림을 받아서 이런 변경 사항에 대응하는 것이 좋겠죠? Realm은 알림 역시 매우 간편하게 제공합니다.

let token = puppies.addNotificationBlock { changes in
  self.updateUI(with: changes)
}
puppies.addChangeListener(new
RealmChangeListener<RealmResults<Dog>>() {
  @Override
  public void onChange(RealmResults<Dog> puppies) {
    updateUI(puppies);
  }
});

변화를 구독하는 것은 아주 쉽습니다. 또한 최신 버전에서는 객체의 속성 단위 변경에 대한 정밀한 알림을 제공하므로 UI를 가장 효율적으로 업데이트할 수 있습니다.

트랜잭션 (Transactions)

UI를 최신으로 바꾸면 다시 사용자의 상호작용이 일어나서 새 데이터가 발생하겠죠? 네트워크에서 새 데이터가 보내졌을 수도 있고요. 이럴 때는 쓰기 트랜잭션을 통해 사용자가 만든 업데이트를 반영하거나 새 정보를 저장할 수 있습니다. 주목할 점은 읽기에서는 트랜잭션이 필요 없으므로 어느 스레드에서나 락 없이 최신 데이터를 간편하게 읽을 수 있고, 쓰기만 트랜잭션 단위가 적용된다는 점입니다.

try realm.write {
  dog.owner = Person(name: "me")
}
realm.executeTransaction(new Realm.Transaction() {
  @Override
  public void execute(Realm r) {
    Person me = new Person("me");
    r.copyToRealm(me);
    dog.setOwner(me);
  }
})

쓰기 트랜잭션 안에서 객체의 속성을 업데이트하는 것만으로도 디스크에 저장된 데이터를 수정할 수 있습니다. ACID가 완벽히 보장되며 앱의 모든 스레드에서 안전하게 쓸 수 있습니다.

이렇게 Realm 모바일 데이터베이스의 네 가지 기초를 알아봤습니다. 빠른 속도와 쉬운 사용이라는 장점을 가지는 Realm 모바일 데이터베이스는 모든 주요 모바일 플랫폼을 다섯 가지 언어로 지원합니다.

Realm 모바일 플랫폼

Realm 모바일 데이터베이스가 확산되면서 간편하고 효율적인 리액티브 데이터베이스를 제공할 수 있게 됐습니다. 하지만 사용자들이 원하는 고급 기능을 포함하는 반응형 앱을 구현하려면 더 많은 기능이 필요합니다. 이중 모바일 개발자들이 개발하면서 어려움을 겪는 데이터 동기화와 협업 기능을 제공하려는 새 목표가 생겼고, 이제 Realm 모바일 플랫폼으로 이를 제공할 수 있게 됐습니다.

REST API vs Realm 모바일 플랫폼

기존에는 서버와의 통신으로 REST API를 주로 사용했습니다. 아시다시피 모바일 앱에서 데이터를 동기화하기는 쉽지 않습니다. 데이터를 요청하고 데이터를 받고 UI를 업데이트하는 간단한 작업을 위해 수면 아래에서는 엄청난 작업이 이뤄져야 합니다. 게다가 앱이 오프라인 되거나 서버가 멈추거나 하면 대재앙이죠. 많은 에러 핸들링과 코드를 작업해야만 합니다.

rwt-seoul-rest-vs-realm

에러 핸들링을 제외하고서도 오른쪽처럼 REST API로 데이터를 동기화할 때 필요한 작업들은 단계가 아주 복잡합니다. 하지만 Realm 모바일 플랫폼을 사용하면 왼쪽처럼 단순해집니다. Realm 모바일 데이터베이스의 데이터와 서버 단의 Realm 오브젝트 서버의 데이터가 실시간으로 양방향 동기화됩니다.

앱 내부에서는 이전처럼 Realm 모바일 데이터베이스를 쓰시면 됩니다. 다만 Realm이 백그라운드에서 실행되며 서버가 변경할 때마다 로컬 데이터베이스를 업데이트해줍니다.

서버와의 데이터 전송도 데이터 타입을 JSON으로 변환할 필요도 없고 데이터양도 실제 변화하는 것만 가져오기 때문에 아주 긴밀합니다. 예를 들어 사람이 개를 하나 더 입양하면 그만큼의 데이터만 전송됩니다. 소량의 데이터 변화를 양방향으로 전달하면서 앱 사용자가 실시간으로 협업하는 기능도 지원할 수 있습니다.

rwt-seoul-old-api

여태까지 선택할 수 있는 최고의 아키텍처는 아마 이런 모습이었을 겁니다. UI, 디스크, 네트워크와 직접 사용하는 타입이 제각각 달랐죠. 클라이언트 로직이 무겁고, 서버와 호출과 응답이 이뤄지는 네트워킹 코드가 필요했습니다.

rwt-seoul-rmp-architecture

하지만 이제 앱에서 사용하는 것과 같은 객체를 서버로 전송하고, 다른 플랫폼이나 언어의 앱으로도 보낼 수 있습니다. 서버에서도 그대로 사용할 수 있고, 기존 인프라스트럭처에 데이터를 쉽게 연결할 수 있습니다.

서버에서 Realm 모바일 플랫폼 사용하기

var Realm = require('realm');
var results = realm.objects("Dog");

realm.write(function() {
  results[0].owner = me;
});

서버에서도 Realm 코드는 모바일 앱 API처럼 간단하게 사용할 수 있습니다. 현재 Node.js로 사용할 수 있으며, 객체를 쿼리하고 ACID한 쓰기 트랜잭션에서 데이터를 수정해서 변경 내용을 모든 클라이언트에 배포할 수도 있습니다.

더 많은 서버 기능

// rwt-seoul-features

서버에는 Realm 데이터베이스 SDK뿐만 아니라 더 많은 기능이 있습니다. 인증 처리, 통신 채널 암호화, 양방향 실시간 동기화가 가능합니다. 유료 버전에서는 로드 밸런싱 및 지속적인 백업, 이벤트 핸들링 등 고급 기능이 제공됩니다.

마무리

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

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

General link arrow white

컨텐츠에 대하여

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

Eunjoo Im

Realm Asia 팀에서 일하는 임은주입니다. iOS와 안드로이드 개발자로, 현재 Realm의 기술 컨텐츠 생산 및 관리에 주력하고 있습니다.

4 design patterns for a RESTless mobile integration »

close