Room은 SQLite에 대한 추상 레이어를 제공하고 데이터베이스 엑세스를 지원하는 동시에 SQLite를 완벽히 활용한다. 쉽게 얘기해, SQLite에 있는 모든 기능을 쉽고 편리하게 쓸 수 있는 라이브러리이다.
Android 공식 문서를 보면, SQLite API 대신 Room을 사용할 것을 적극 권장한다.
안드로이드 Room의 주요 컴포넌트는 Entity, DAO, Database이다.
각 컴포넌트를 요약하면
Entity는 Database에서 테이블의 역할을 맡고있다.
다음과 같은 테이블이 있다고 가정하자.
MEMO
Field | Type | Null | Key |
---|---|---|---|
memo_id | INTEGER | NO | PK |
title | TEXT | NO | |
content | TEXT | NO |
이 테이블은 다음과 같은 Kotlin 클래스로 나타낼 수 있다.
@Entity(tableName = "memo")
data class Memo(
@PrimaryKey()
@ColumnInfo(name = "memo_id")
val memo_id: Int,
val title: String,
val content: String
)
PrimaryKey Annotation에 autoGenerate를 true로 만들면 id에 값을 대입하지 않아도 자동으로 값이 들어간다.
DAO는 Data Access Object의 약자로 데이터베이스에 접근할 수 있는 객체이다.
DAO에는 DB에 접근할 수 있는 메서드를 정의한 인터페이스 또는 클래스로 다음과 같이 정의할 수 있다.
@Dao
interface MemoDao {
@Insert
suspend fun insertMemo(memo: Memo)
@Delete
suspend fun deleteMemo(memo: Memo)
@Update
suspend fun updateMemo(memo: Memo)
@Query("SELECT * FROM memo WHERE memo_id == :id")
suspend fun selectMemo(id: Int): List<Memo>
@Query("DELETE FROM memo WHERE memo_id == :id")
suspend fun deleteMemoById(id: Int)
@Query("SELECT * FROM memo")
suspend fun getAllMemo(): List<Memo>
}
내부 저장소에 접근한 결과를 비동기적으로 처리해야 하기 때문에, 각 함수 앞에 suspend를 붙여 비동기 함수로 만들어 준다.
이제 DAO를 사용할 수 있는 객체를 만들 시간이다.
데이터베이스 객체는 RoomDatabase를 상속받는 가상 클래스이다.
@Database(entities = Memo::class, version = 1)
abstract class MemoDatabase : RoomDatabase() {
abstract fun memoDao(): MemoDao
companion object {
private var instance: MemoDatabase? = null
fun getInstance(context: Context): MemoDatabase? {
if (instance == null) {
synchronized(MemoDatabase::class) {
instance = Room.databaseBuilder(
context.applicationContext,
MemoDatabase::class.java, "memo.db"
).build()
}
}
return instance
}
}
}
모든 준비 과정이 끝났으므로 이제 사용할 수 있다.
현재 작성한 메모의 개수를 textView를 통해 작성해주자.
CoroutineScope(Dispatchers.Main).launch {
val memoList = MemoDatabase.getInstance(this@MainActivity)?.memoDao()?.getAllMemo()
val size = memoList?.size ?: 0
findViewById<TextView>(R.id.text_view).text = size.toString()
}
안드로이드 개발을 하다보면 서버 통신과 마찬가지로 내부 데이터베이스에 접근해야 할 일들이 매우 많을 것이다. Room Library를 활용하면 쉽고 편리하게 내부 DB에 접근하여 처리할 수 있다.
참고
https://developer.android.com/training/data-storage/room?hl=ko