목차

  1. 사용법
  2. 마치며

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

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

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

Realm 공식 사이트의 설명

사용법

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

1
2
3
4
5
6
7
8
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 관련 플러그인을 넣어 봅시다.

1
2
3
4
5
6
7
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 이에요)

1
2
3
4
5
6
7
8
9
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 클래스를 상속받았다는 점 입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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 하는것도 넣어줍시다.

1
2
3
4
5
6
7
8
9
10
11
12
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을 해주는 작업을 해줘야 합니다.
(진짜 없는것인지 아닌진 모르겠습니다. 문서를 아직 다 안읽어봤거든요)

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

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

마치며

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