[Android] Realm DB로 데이터 관리하기

yuuuzzzinzzzang·2021년 9월 27일
2
post-thumbnail

안드로이드 프로젝트를 진행하면서 로컬에 데이터를 저장하기 위해 어떤 DB를 사용해야 할지 고민이 많았습니다.

안드로이드에서 데이터를 저장하는 방식에는 여러가지가 있습니다.

1. SharedPreferences

  • 적은 양의 원시 데이터를 (key, value) 형태로 앱 안에 XML 파일로 저장합니다.

2. Room

  • AAC(Android Architecture Component) 중 하나입니다.
  • SQLite 위에 있는 추상화 레이어를 제공해 SQLite의 기능을 사용하면서 데이터베이스 접근을 보다 편리하게 합니다.
  • 객체의 맵핑을 통해 DB에 접근하는 ORM 방식의 라이브러리입니다.

3. Realm

  • 쿼리문을 통해 테이블내 컬럼에 데이터를 저장하는 SQLite의 방식과 달리, 데이터를 객체 형태로 저장합니다.
  • 크로스 플랫폼 데이터베이스로 Android, iOS 간 DB 공유가 가능합니다.
  • 타 데이터베이스들에 비해 데이터 처리 속도가 빠릅니다.

➡️ 이렇게 여러 방식을 찾아보고 비교해보면서, 최종적으로는 Realm을 선택하게 되었습니다.

Why Realm ❓

우선, SharedPreference는 자동 로그인 여부와 같은 간단한 값을 저장할 때엔 적합하지만, 저장할 데이터의 양이 많고 간단하지 않은 경우에는 적합하지 않다는 생각이 들었습니다.

Room과 Realm 사이에서 고민이 많았지만, iOS 개발자 분과 모델 객체를 같이 짜고 구성할 수 있어 협업에 좀 더 편리할 것 같아 Realm을 선택하게 되었습니다.

데이터 컨테이너 모델을 사용해 직접 객체를 데이터베이스에 저장하는 방식이기 때문에 저장, 불러오기와 같은 동작들도 좀 더 빠르게 처리할 수 있습니다.

Realm 사용하기

① 초기 설정

  • app 레벨의 build.gradle에 플러그인 추가
plugins {
    id "realm-android" // 가장 하단에 위치시키기
}
  • project 레벨의 build.gradle에 의존성 추가
dependencies {
        classpath 'io.realm:realm-gradle-plugin:10.8.0'
        // 최신 버전은 realm 릴리즈 노트 확인
    }

② Realm 초기화하기

realm 초기화는 앱을 실행하는 동안 한 번만 하면 되므로 Application class에서 해주는 것이 좋습니다.

class OffoffApplication : MultiDexApplication() {

    override fun onCreate() {
        super.onCreate()

        // Realm 초기화
        Realm.init(this)
        val config : RealmConfiguration = RealmConfiguration.Builder()
            .allowWritesOnUiThread(true)
            .name("user.realm") // 생성할 realm db 이름
            .deleteRealmIfMigrationNeeded()
            .build()

        Realm.setDefaultConfiguration(config)
    }
}

③ 객체 클래스 모델 만들기

open class User  (
    @PrimaryKey
    var id: Int? = 0,
    var name: String? = null,
    var age: Int? = 0,
) : RealmObject()
  • 클래스는 open 키워드를 붙여주고 RealmObject를 상속받아야 합니다.
  • PK로 사용할 필드는 @PrimaryKey 어노테이션을 붙여줍니다.

④ Realm 인스턴스 얻기

realm을 사용할 곳에서 realm 인스턴스를 가져와 사용할 수 있습니다.

val realm = Realm.getDefaultInstance()

⑤ 데이터 다루기 (CRUD)

Create, Update - 데이터 저장 또는 갱신하기

// 사용자 저장 또는 갱신하기
fun insert(user: User) {
     realm.executeTransactionAsync {
          it.insertOrUpdate(user)
     }
}

Read - 데이터 읽기

// 모든 사용자 읽어오기
fun getAllUser(): RealmResults<User> {
     return realm.where<User>()
         .findAll()
         .sort("id", Sort.ASCENDING)
}
        
// 특정 사용자 읽어오기
fun getUser(id: Int): User? = realm.where<User>()
    .equalTo("id", id)
    .findFirst()

Delete - 데이터 삭제하기

// 모든 사용자 삭제
fun deleteAllUser() {
    realm.executeTransaction {
        it.where<User>().findAll().deleteAllFromRealm()
    }
}

// 특정 사용자 삭제
fun deleteUser(id: Int) {
    realm.executeTransaction {
        it.where<User>().equalTo("id", id).findAll().deleteAllFromRealm()
    }
}

마치며...

간단하게 안드로이드에서의 Realm 사용 방법을 알아보았습니다. 처음 접해보는 것이다 보니 초반에 Realm과 정을 붙이는 데 조금 힘들었지만 지금은 훨씬 익숙해진 것 같아 뿌듯합니다 :)

참고:
https://developer.android.com/training/data-storage/room
https://docs.mongodb.com/realm-legacy/docs/kotlin/latest/index.html
https://github.com/realm/realm-kotlin

profile
yuuuzzzin의 개발 블로그

10개의 댓글

comment-user-thumbnail
2021년 9월 28일

이 포스트를 보고 저도 모르는 사이에 Realm을 마스터하게 되었어요..!!!!

1개의 답글
comment-user-thumbnail
2022년 10월 18일

I really like posts like this dynamons world Brings me a lot of interesting things.

답글 달기
comment-user-thumbnail
2023년 1월 9일

I like using Realm Database because it is a reactive, object-oriented, cross-platform, mobile database. capybara clicker

답글 달기
comment-user-thumbnail
2023년 1월 12일

Great blog, thank you for sharing such new contexto game and useful information. fall guys

답글 달기
comment-user-thumbnail
2023년 1월 16일

This complicates your problem, especially ETECHUPS

when you are running out of letters to try from Some words may be repeated.

답글 달기
comment-user-thumbnail
2023년 3월 7일

You re in point of fact a just right webmaster. The website loading speed is amazing. It kind of feels that you're doing any distinctive trick. Moreover, The contents are masterpiece. you have done a fantastic activity on this subject cookie clicker

답글 달기
comment-user-thumbnail
2023년 4월 4일

good

답글 달기
comment-user-thumbnail
2023년 7월 10일

당신은 여기까지 왔고 훌륭하다고 생각합니다. 계속해서 꿈을 쫓으면 언젠가는 정상에 도달할 것이고 그러면 당신이 얼마나 훌륭해졌는지 알게 될 것입니다. pge outage map

답글 달기
comment-user-thumbnail
2023년 7월 27일

Storing a small amount of raw data as an XML file inside a geometry dash bloodbath application is what I usually use

답글 달기