본문 바로가기

Android

[Android] Realm 데이터베이스 사용하기

Realm?

Realm이란 모바일 데이터베이스로 SQLite를 대체할 수 있다.

SQLite와 달리 데이터를 객체 형태로 구성하기에 데이터 쿼리 시 SQL문법을 몰라도 사용할 수 있다.
다른 모바일 데이터베이스보다 성능이 좋고, 커뮤니티가 활발하다.

사용하기

1. 프로젝트의 build.gradle 파일에 realm 종속성을 추가한다.

buildscript {
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:7.0.2"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.30"
        classpath "io.realm:realm-gradle-plugin:10.8.0"
    }
}

2. 앱 모듈의 build.gradle 파일에 realm 플러그인을 적용한다.

Kotlin 사용 시 'kotlin-kapt' 플러그인도 추가해줘야 한다.

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-kapt'
    id 'realm-android'
}

3. 데이터 모델을 정의한다.

Realm의 데이터 모델로 사용하기 위해서 RealmObject()를 상속받아야 한다.

open class Person(
    @PrimaryKey
    var id: Int = 0,
    var name: String = "",
    var age: Int = 0
) : RealmObject()

4. Realm 초기화

Realm 초기화는 앱 실행 시 한 번만 하면 되기에 Application 클래스에서 하는 게 적절하다.

Realm Instance 사용 시 주의사항으로는 인스턴스를 생성한 스레드와 반드시 같은 스레드에서 사용해야 한다.

Realm.init(this)

val configuration = RealmConfiguration.Builder()
    .name("User")
    .build()
val realmInstance = Realm.getInstance(configuration)

5. 데이터 저장하기

Realm은 데이터 저장(뿐만 아니라 Update, Delete) 시 transaction을 통해 실행해야 한다.

  • executeTransaction{ .. }은 기본적으로 UI 스레드에서 실행할 수 없기 때문에 다른 스레드로 변경 후 transaction을 실행해야 한다. (하지만 realm configuration 설정 시 allowWritesOnUiThread(true) 통해서 UI 스레드에서 작업이 가능하기도 하다.)
  • executeTransactionAsync{ .. }는 realm에서 자체적으로 Worker 스레드에서 비동기적으로 작업을 실행한다.
val personId: Int = 0

realmInstance.executeTransactionAsync { realm ->
    val person = Person(
        id = personId,
        name = "Harry",
        age = 29
    )
    realm.insertOrUpdate(person)
}

6. 데이터 불러오기

val personFromRealm = realmInstance.where<Person>()
    .equalTo("id", personId)
    .findFirst()
    
Log.d("RealmTest", personFromRealm.toString())

 

D/RealmTest: Person = proxy[{id:0},{name:Harry},{age:29}]

7. 데이터 삭제하기

realmInstance.executeTransactionAsync { realm ->
    realm.where<Person>()
        .equalTo("id", personId)
        .findFirst()
        ?.deleteFromRealm()
}

결론

안드로이드 프로젝트에서 Realm 설정하는 방법과 간단한 CRUD를 살펴보았다.

객체 형태의 데이터 모델로 간편하게 데이터베이스를 구성하여 사용할 수 있는 장점이 있는 반면 스레드 관리에 신경을 써야 한다.

하지만 데이터 조회 시 Flow를 지원하고, AES-256 암호화를 지원하는 등 여러 장점이 있기에 자주 사용할 것 같다.

 

참고

https://docs.mongodb.com/realm/sdk/android/