안드로이드

[안드로이드] 내장 DB로 Realm 사용하기

싀온 2020. 6. 1. 19:23

슥삭을 개발하면서 내장 DB를 써야 할 일이 생겼다. 아니 사실은 그 전부터 쓸 일은 많았는데, 미루고 미루다가 드디어 적용했다!

안드로이드에서 사용할 수 있는 내장 DB의 종류는 꽤 많은데, 내가 Realm을 선택한 이유는 정말 간단하다.

 

✨Realm을 선택한 이유 ✨

  1. 데이터를 객체 형태로 저장한다. (쿼리문 싫어,,,)
  2. 커뮤니티가 활발하다. (구글링 열심히 하자!)

자 이제 realm을 사용해보자.

 

 

0. 설치하기

아래 코드를 프로젝트 수준 build.gradle에 추가한다.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath "io.realm:realm-gradle-plugin:3.5.0"
    }
}

다음 코드를 애플리케이션 수준 build.gradle에 추가한다.

apply plugin: 'realm-android'

anroid {
    realm {
        syncEnabled = true
    }
}

 

이렇게 두개만 추가하면 realm 설치 끝 ❗️

 

 

 

1. Realm 초기화하기

Realm.init()으로 Realm을 초기화할 수 있다.

초기화는 realm을 사용하고자 하는 Activity에서 해도 되지만, 한번만 초기화하면 되므로 Application 클래스에서 초기화를 해주었다.

class SsgSagApplication : Application(){

    override fun onCreate(){
        super.onCreate()
        
        Realm.init(this)
        val config : RealmConfiguration = RealmConfiguration.Builder()
            .name("appdb.realm") // 생성할 realm 파일 이름 지정
            .deleteRealmIfMigrationNeeded()
            .build()

        Realm.setDefaultConfiguration(config)
        
}

🚫 해당 Application class는 manifests에 꼭 등록해주어야한다 ! 🚫

 

 

 

 

2. Model 만들기

데이터를 저장하는 Realm 모델 클래스는 RealmObject 를 상속받아서 생성해야한다.

 

앱을 깔고 로그인한 뒤 한번 저장된 후 바뀔일이 크게 없는 device 정보를 내장 DB에 저장해놓으려 한다.

이를 위해 아래와 같은 class를 만들었다.

open class DeviceInfo : RealmObject(){
    var id : Int = 0
    var token =""
    var loginType: Int = 0
    var uuid =""
}

 

👉Realm의 모델에 관한 다양한 정보를 더 얻고 싶다면 아래의 링크에 들어가보자.

https://realm.io/kr/docs/java/latest/#models

 

 

 

3. Realm 가져오기

이제 Realm을 사용하고 싶은 곳에서 Realm을 가져와서 사용할 수 있다.

lateinit var realm : Realm

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        realm = Realm.getDefaultInstance()
        
}

 

원하는 값은 메소드를 이용해서 가져올 수 있다.

val realmDeviceInfo = realm.where(DeviceInfo::class.java).equalTo("id", 1 as Int).findFirst()

👉 DeviceInfo 클래스에서 id가 1인 첫번째 데이터를 가져와서 realmDeviceInfo에 저장한다.

 

 

 

4. Realm에 데이터 저장하기

데이터 저장은 꼭! 트랜잭션 안에서 이루어져야 한다.

fun setDeviceInfoUuid(uuid : String){
        // 트랜잭션 시작
        realm.beginTransaction()
        
        // id가 1인 DeviceInfo를 가져온다.
        val realmDeviceInfo = realm.where(DeviceInfo::class.java).equalTo("id", 1 as Int).findFirst()
        // id가 1인 DeviceInfo 객체가 이미 존재한다면
        if(realmDeviceInfo != null){
            // 그 객체의 uuid값 초기화
            realmDeviceInfo.uuid = uuid
        }else{ // id가 1인 DeviceInfo 객체가 존재하지 않는다면
     		// 객체를 새로 생성
            val realmObject = realm.createObject(DeviceInfo::class.java)
            realmObject.apply{
                this.id = 1
                this.uuid = uuid
            }
        }
        // 트랜잭션 종료
        realm.commitTransaction()
    }

위 코드에서 이미 존재하는 객체의 값을 수정하는 것과 객체를 새로 만드는 경우를 모두 볼 수 있다.

 

 

 

 

 

 

간단하게 Realm 사용법을 알아보았다!

'내장 DB'를 딱 들으면 왠지 어려울 것 같아서 미루다가 꼭 필요해져서 사용해보았는데, 생각한 것 보다 쉽게 사용할 수 있는 것 같다.

물론 위에서 본 것 처럼 트랜잭션 때문에 멀티스레딩을 하기 까다롭다는 단점이 있긴하지만, 간단하게 사용하려면 쉽게 접근할 수 있고 한국어로 사용법이 친절하게 나와있다는 장점 때문에 사용해볼만 한 것 같다!

 

곧 다른 프로젝트를 사용해보려고 하는데, 거기서는 다른 걸 써보고 한번 비교해봐야지 😊