첫번째 코틀린 모임이 강남소재의 교육 스타트업인 Riiid 사무실에서 있었습니다. Riiid 는 데이터 기술을 통해 교육기회의 평준화를 목표로 하는 스타트업입니다. 이 모임 발표중 김용욱 님이 발표하신 Realm 과 Kotlin 사용에 대한 세션 영상을 정리하여 공개합니다
이 모임은 교육 스타트업인 Riiid(뤼이드)에서 안드로이드 개발자로 근무하고 계신 허재위 님 사회로 진행되었습니다. 아래 개요를 정리하였지만 동영상에서 데모와 함께 매우 쉽게 설명되어있으니 동영상을 보시는 것을 추천드립니다.
클래스가 없는 함수와 익스텐션
코틀린은 클래스가 없는 함수와 기존의 객체의 행동을 수정하는 익스텐션이 있습니다. 어떻게 이런게 가능할까요? 코틀린은 파일명이 a.kt인 경우에 AKt라는 클래스를 만들고 그 속에 스태틱 메서드를 생성합니다. 익스텐션도 비슷한 과정을 거칩니다. javap로 어떤 객체에 어떠 스태틱 메서드들이 있는지 확인할 수 있습니다.
Realm에서 코틀린 언어의 프로그래밍 언어의 기초적인 내용과 스태틱 메서드가 어덯게 구현이 되는지는 아래를 참고하세요.
Realm Java
Realm은 빠르고, 견고하고, 사용하기 편한 모바일 데이터 베이스입니다. 모바일 데이터베이스는 기존에 SQLite가 점유하고 있었는데 10년이 넘은 데이터베이스이기 때문에 느린 편입니다. 왜 빠른지는 국내와 해외에 발표한 Realm 발표를 들어보세요. MVCC의 장점 때문에 읽기에는 별도의 트랜잭션없이 쓰기 트랜잭션만 가지고 사용할 수 있습니다. 사용법은 아주 간단합니다. 자세한 내용은 공식 문서를 참고하세요.
Realm Kotlin
기본적으로는 자바를 위해 Realm을 쓸 때와 코틀린에서 쓸 때는 큰 차이는 없습니다. 자바 코드는 손 쉽게 메뉴에서 코틀린으로 바꿀 수 있으니 변환부터 시작합시다.
build.gradle 설정
buildscript
의 repositories
항목에서 mavenCentral()
대신에 jcenter()
로 바꾸어야 합니다. jcenter는 maven central의 상위집합이기 때문에 maven central의 모든 라이브러리를 가지며 동시에 jcenter만의 라이브러리를 가집니다. 코틀린 관련 라이브러리가 jcenter에 있기 때문에 jcenter로 바꿉니다. 이외에도 jcenter는 캐슁이나 다운로드 정책에서 maven central보다 낫기 때문에 안드로이드의 공식 리포지토리는 jcenter입니다.
그 외에 추가적으로 buildscript
의 dependencies
에 classpath "io.realm:realm-gradle-plugin:<realm-version>"
을 입력해야 합니다. 현재 최신 버전은 0.88.2 버전이고 이를 위해서는 classpath "io.realm:realm-gradle-plugin:0.88.2"
라고 명기합니다.
마지막으로 아래에 apply plugin: 'realm-android'
를 통해 realm-android
플러그인을 활성화합니다. 0.87 버전까지는 코틀린을 위한 kapt
를 추가했어야 했는데 0.88 버전 부터는 이것으로 충분합니다.
모델 만들기
기본적인 모델의 모양은 다음과 같습니다.
public open class Cat : RealmObject() {
public open var name: String? = null
}
final
키워드를 추가하는 자바와는 반대로 코틀린은 기본이 final
이고 open
키워드로 개방해야 합니다. 우리는 name
프로퍼티가 String
타입이며 부가적인 것이라 null
이 될 수 있다고 ?
를 추가하였습니다. 코틀린의 프로퍼티를 사용할 때는 게터와 세터를 새롭게 만들 필요는 없습니다.
모델 사용하기
사용하는 것도 어렵지 않습니다. 아래의 코드를 참고하세요.
private var realm: Realm by Delegates.notNull()
private var realmConfig: realmConfiguration by Delegates.notNull()
...
realmConfig = RealmConfiguration.Builder(this).build()
Realm.deleteRealm(realmConfig)
realm = Realm.getInstance(realmConfig)
realm.beginTransaction()
var cat = realm.createObject(Cat::class.java)
cat.name = "뽀삐"
realm.commitTransaction()
Delegates.notNull
로 지정된 것은 나중에 초기화될 것이니 null
을 사용하는 것을 허락하지 말라는 의미입니다.
Cat::class.java
는 자바 클래스를 가져오기 위한 부분이다. 자바에서 쓸 때와 가장 큰 차이 점 중의 하나입니다. 게터와 세터를 쓰지 않고 직접 접근하는 것에도 주목하세요.
Gradle 플러그인
의존성이 복잡할 때는 플러그인을 만드는 것이 좋습니다. Realm의 플러그인의 코드를 중심으로 살펴봅시다. resources/META-INF/gradle-plugins
에 realm-android.properties
파일이 있는 것을 살필 수 있습니다. 이 파일이 realm-android
플러그인에 대해 기술하는 부분입니다. 내용은 단순합니다. implementation-class=<plugin-class>
으로 플러그인을 담당할 클래스를 지정합니다. 해당 플러그인 클래스는 대부분 그루비(Groovy)언어로 작성합니다. Plugin<Plugin>
을 구현(implements)하고 apply
메서드를 구현하면 됩니다.
컨텐츠에 대하여
이 컨텐츠는 저자의 허가 하에 이곳에서 공유합니다.