Realm Kotlin SDK 특징
Realm은 모바일에서 많이 사용하는 데이터베이스로 순수 Kotlin 언어로 개발된 Realm Kotlin SDK의 4가지 특징을 정리했습니다.
목차
Frozen Architecture
Realm Kotlin SDK에는 Frozen Architecture가 적용되어 기존 SDK들과 다르게 live objects를 지원하지 않습니다. 대신 frozen objects를 통해 스레드 간 안전하게 데이터를 전달 할 수 있습니다.
생각해보면 기존에 사용했던 Realm Java SDK에서는 데이터를 조회하면 live objects를 반환하고 다른 스레드에서 해당 값에 접근하는 경우 문제가 되었습니다. 그래서 조회한 live objects를 copy해서 사용하거나, 매번 Realm 인스턴스를 생성하여 스레드 신경을 써야 했습니다.
그럼 어떻게 frozen objects를 업데이트 하거나 삭제할 수 있을까요?
바로 frozen objects를 live version으로 변환해야 하고 그 유일한 방법은 mutableRealm.findLatest()를 사용해야 합니다.
suspend fun deleteFriend(friend: FriendRealm) {
realm.write {
val friendAsLiveObject = this.findLatest(friend)
friendAsLiveObject?.let {
delete(it)
}
}
}
// mutableRealm.findLatest()을 사용하기 위해서는 write transaction block을 실행해야 합니다.
public suspend fun <R> write(block: MutableRealm.() -> R): R
물론 아래와 같이 write transaction block 안에서 mutableRealm.query()로 조회한 결과는 아직 frozen이 아닌 live한 objects입니다.
suspend fun deleteFriend(friendId: Int) {
realm.write {
val friend = this.query<FriendRealm>("id==$friendId").find().firstOrNull()
friend?.let {
delete(it)
}
}
}
또한 isFrozen() 메서드를 통해 RealmObject의 frozen 여부를 확인할 수 있습니다.
val friendAsLiveObject = this.findLatest(friend)
friendAsLiveObject?.let {
if (!friendAsLiveObject.isFrozen()){
delete(it)
}
}
// RealmObject는 내부적으로 상태를 관리하고 있다.
public fun BaseRealmObject.isFrozen(): Boolean =
(realmObjectReference ?: UnmanagedState).isFrozen()
Coroutines + Flow
순수 Kotlin 언어로 작성되어 비동기 처리 및 Reactive 하게 프로그래밍 할 수 있습니다. Flow는 Coroutines을 기반으로 비동기적으로 값을 생성하고 전달하는 데이터 스트림을 나타냅니다.
아래 예시는 Realm Database에서 Flowable 하게 친구 목록을 불러와 ViewModel에서 최신 데이터 collect 합니다.
// Dao
fun getFriends(): RealmResults<FriendRealm> = realm.query<FriendRealm>().find()
// Repository
fun getFriendsAsFlow(): Flow<ResultsChange<FriendRealm>> = friendDao.getFriends().asFlow()
// ViewModel
viewModelScope.launch {
friendRepository.getFriendsAsFlow().collectLatest { friends ->
friends.list.map {
Log.d("friend name : ", it.name)
}
}
}
Lazy Loading
Realm Kotlin SDK의 Realm 객체는 기존 SDK 들과 같이 기본적으로 지연되어 로드됩니다.
Lazy Loading은 Realm에서 데이터 조회 시 모든 결과를 메모리에 불러오는 게 아니고 실제 데이터에 접근 시 디스크에서 데이터를 읽어옵니다. 이를 통해 쿼리를 잘 활용하면 앱의 성능을 향상시키고 메모리를 효율적으로 관리할 수 있습니다.
Kotlin Multiplatform
Realm Kotlin SDK는 Android와 Kotlin Multiplatform을 지원합니다. 이를 통해 Multiplatform 환경에서 Android 및 iOS 플랫폼 간 단일 데이터베이스를 사용하고 공통 로직을 통해 코드를 공유할 수 있습니다.
참고