본문 바로가기

안드로이드/JetPack

[안드로이드] 2. Room 기본 가이드

Room

Room은 안드로이드 내부 데이터베이스 라이브러리 중 하나 SQLite를 대체할 라이브러리이다. 이번 문서에서는 코틀린을 이용하여 Room을 활용하는 간단한 예제를 살펴본다.

 

기본 구성

Room을 사용하기 위해선 몇 가지 그래들 세팅이 필요하다. 먼저, build.gradle(:app)에서 다음과 같이 설정한다.

...
apply plugin: 'kotlin-kapt'
...
dependencies {
	...
    implementation 'androidx.room:room-runtime:2.1.0'
    kapt 'androidx.room:room-compiler:2.1.0' //kapt 대신 annotationProcessor를 사용하면 안된다.
}

 

Room 아키텍쳐

위 사진은 Room 아키텍쳐 구조이다. 기본적인 앱과 Room 데이터베이스가 존재하는 상황이다. 그리고 빨간색 박스의 Entities는 데이터 객체를 표현하는 클래스, 초록색 박스는 Room의 데이터를 접근하기 위한 클래스이다.

 

Entity - Todo.kt

@Entity
data class Todo(var title: String) { 
    @PrimaryKey(autoGenerate = true) var id: Int = 0
}

위에서 data class의 선언은 코틀린 기본 문법으로 getter, setter 등의 구현이 필요 없어지고, 기본키의 autoGenerate는 ID 값을 자동으로 설정해준다. 

 

DataAccessObject - TodoDao.kt

@Dao
interface TodoDao {
    @Query("SELECT * FROM Todo")
    fun getAll(): List<Todo>

    @Insert
    fun insert(todo: Todo)

    @Update
    fun update(todo: Todo)

    @Delete
    fun delete(todo: Todo)
}

위의 정의된 함수들을 통해 손쉽게 데이터 접근이 가능하다. 필요하다면 자신이 원하는 쿼리문을 추가할 수도 있다.

 

AppDatabase - AppDatabase.kt

@Database(entities = [Todo::class], version = 1)
    abstract class AppDatabase : RoomDatabase() {
        abstract fun todoDao(): TodoDao
    }

위 AppDatabase를 통해 생성한 데이터베이스 객체를 가져올 수 있다.

 

MainActivity

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val db = Room.databaseBuilder(
            applicationContext,
            AppDatabase::class.java, "database-name"
        ).allowMainThreadQueries().build() 

        result_textView.text = db.todoDao().getAll().toString()

        add_button.setOnClickListener {
            db.todoDao().insert(Todo(todo_edit.text.toString()))
            result_textView.text = db.todoDao().getAll().toString()
        }
    }
}

에디트 텍스트로 값을 입력 받고 버튼을 클릭시 DB에 추가하고 화면에 표시된다.