본문 바로가기

테크 노트/소소한 개발 팁

android, realm 초간단 정리

1. 시작하며

대체 저의 커리어가 어떻게 돼가는것인지 잘 모르겠습니다만..
최근에 안드로이드 공부를 시작했습니다.
안드로이드 앱을 만들때면 거의 필수적으로 앱 내장 DB를 사용해야 합니다.
이때 sqlite 같은 기본 솔루션을 쓸 수도 있겠지만 좀 더 쉬운 툴이 있으면 그것을 써야겠죠.

쉽게 설명하자면 안드로이드 내장DB에서 사용되는 ORM 이라고 보시면 됩니다.
java, spring 을 잘 아시는 서버개발자 분들께서는 JPA가 생각나실겁니다.

공식 홈페이지(https://realm.io/kr/)의 설명에 따르면..
Realm DB로 모바일앱 데이터 저장을 뚝딱뚝딱 만들수 있고,
자바, 스위프트, 오브젝티브C, 자바스크립트 등등에서 쓸 수 있대네요

Realm 공식 사이트의 설명

 

2. 사용법

거두절미하고 어떻게 사용하는지 아주 간략히 정리하겠습니다.

 dependencies {
    classpath 'com.android.tools.build:gradle:3.3.2'
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    ...
    ...
        
    classpath "io.realm:realm-gradle-plugin:5.2.0"
 }

프로젝트 레벨의 build.gradle 파일에 realm 관련 플러그인을 넣어 봅시다.

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

...

apply plugin: 'realm-android'

다음은 app 레벨의 build.gradle 인데요. 위와같이 realm-android를 추가해줍시다.

그 후 android studio 메뉴 중  [File] - [Re-Import Gradle Project]를 눌러줍시다.

저는 어떤 비디오를 "좋아요" 하는 객체를 저장한다는 가정을 세웠습니다.
따라서 Like 클래스를 아래와 같이 만들었습니다. (kotlin 이에요)

import io.realm.RealmObject
import io.realm.annotations.PrimaryKey
import java.util.Date

open class Like(
    @PrimaryKey var id: Long = 0,
    var videoId: String? = null,
    var date: Date? = null
) : RealmObject()

필요한 필드들을 constructor 에 선언해 주었습니다.
특별한것은 PK로 사용할 필드를 @PrimaryKey 어노테이션으로 마킹한 것과
RealmObject 클래스를 상속받았다는 점 입니다.

class MainActivity : AppCompatActivity() {
	...
    var realm: Realm
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Realm.init(this)
        
        realm = Realm.getDefaultInstance()
    	...
    
    }
    ...
    
    override fun onDestroy() {
        super.onDestroy()
        realm.close()
    }
}

그리고 Realm.init을 해줘야하는데요 전 그냥 메인이되는 액티비티에다가 넣어줬습니다.
onDestroy 안에다가 close 하는것도 넣어줍시다.

addButton.setOnClickListener {
    realm.beginTransaction()
    val currentId = realm.where<Like>(Like::class.java).max("id")
    val nextId = if (currentId == null) 1 else currentId.toInt() + 1

    val newObject = realm.createObject<Like>(nextId)
    newObject.videoId = "video-$nextId"
    newObject.date = Date()

    realm.commitTransaction()
    Toast.makeText(context, "인서트 했어요", Toast.LENGTH_SHORT).show()
}

액티비티나 프래그먼트에서 getDefaultInstance를 통해 수행 객체를 들고옵니다.
그 후 위처럼 트랜잭션을 열고, 데이터를 설정하고, 트랜잭션을 커밋하면 끝입니다.

정말 안타까운 점은 PK에 Auto-Increment 속성을 걸 수 없는것 이었습니다.
따라서 위처럼 마지막 id를 가져와서 +1을 해주는 작업을 해줘야 합니다.
(진짜 없는것인지 아닌진 모르겠습니다. 문서를 아직 다 안읽어봤거든요)

val all = realm.where(Like::class.java).findAll()

잘 들어갔는지 확인할 때는 위처럼 findAll 메소드를 이용하면 됩니다.

3. 마치며

사실 전 서버 개발자라서 이렇게 하는게 정답인가는 잘 모르겠습니다.
좀 내용이 부실하다는 생각이 들긴 하지만 기본은 이정도 인것 같네요.
이제 realm 객체를 통해 어떤 쿼리를 날릴것인지 공식 문서나 많은 예제들을 통해 학습하면 되겠습니다.