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 암호화를 지원하는 등 여러 장점이 있기에 자주 사용할 것 같다.
참고
'Android' 카테고리의 다른 글
[Android] RecyclerView를 사용해야 하는 이유 (feat. ListView) (0) | 2022.02.20 |
---|---|
[Android] 웹뷰 스크롤 하단에 native 버튼 위치시키는 방법 (0) | 2021.09.20 |
[Android] Custom Dialog 사용하여 ID, PW 받아오기 (0) | 2021.09.02 |
[Android] 유용한 Plugin 소개 (JsonToKotlinClass) (0) | 2021.08.29 |
[Android] Retrofit2 사용하여 API 통신하기 (0) | 2021.08.03 |