본문 바로가기
Develop/Android

android Room 사용하기

by 라이프레이서 2020. 4. 6.

목차

    반응형

    0.Intro

    android Room 을 사용하는 방법에 대해 알아보자

    android Room은 SQLite, Realm과 같은 로컬 데이터베이스로서 원활한 데이터베이스 접근을 가능케 하는 라이브러리이다.

    현재 안드로이드 개발자 페이지에서 SQLite에 대해 검색하면 다음과 같은 내용을 볼 수 있다.

    안드로이드 개발자 페이지의 SQLite에 대한 검색 결과

    이후 android Room 지속성 라이브러리를 사용하기 위한 페이지로 이동하면 아래와 같은 내용을 확인 할 수 있다.

    출처 : https://developer.android.com/training/data-storage/room

    android Room에서

    Entities 는 데이터베이스 내의 테이블을 나타낸다.

    DAO (Data Access Objects)는 말 그대로 데이터베이스에 접근하는데 사용되는 메소드들이 들어 있다.

    android Room에 대한 기본 개념을 알았으니 실제로 구현해보는 시간을 가져보자

    1. gradle 설정 해주기

    android Room을 사용하기 위해서 먼저 gradle 설정을 해주자

    module 수준의 gradle파일에 다음과 같은 플러그인을 추가한다

    apply plugin: 'kotlin-kapt'

    이후 dependencies에 android Room에 대한 라이브러리를 추가한다.

        implementation "android.arch.persistence.room:runtime:1.1.1"
        kapt "android.arch.persistence.room:compiler:1.1.1"
        kaptTest "android.arch.persistence.room:testing:1.1.1"

    다 했으면 sync now 클릭해서 적용시켜주자

    2. activity_main.xml

    activity_main.xml은 위와 같이 editText, button, textview(아래 빈 공백부분) 세가지로 구성해서 진행하였다.

    3. Entities 만들기

    필자는 Todo라는 이름의 data class를 생성하여 Entitiy를 생성해주었다.
    이 때 @Entity 어노테이션을 붙여주어야 한다.
    또한 @PrimaryKey(autoGenerate = true)로 설정하여 id값을 설정해주었다.

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

    4. Dao 만들기

    @Dao 어노테이션을 이용하여 만들어준다.
    @Query, @insert 등등의 어노테이션을 붙여 각 메소드들을 만들어주면 편리하게 CRUD 기능이 구현 가능하다.

    @Dao
    interface TodoDao {
        @Query("SELECT * FROM Todo")
        fun getAll() : LiveData<List<Todo>> // 추후에 설명
    
        @Insert
        fun insert(todo: Todo)
    
        @Update
        fun update(todo: Todo)
    
        @Delete
        fun delete(todo: Todo)
    }

    5. Database 만들기

    Database는 @Database 어노테이션을 사용하며 첫번째 인자로 어떤 Entities를 가지는지 해당 항목의 목록을 선언해주어야 한다.
    두 번째 인자로는 버전코드에 대해 선언해 주어야 한다.
    추상 클래스로 만들어줌과 동시에 @Dao로 처리된 클래스를 반환해야 한다는 규칙을 가지고 있다.

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

    6. 사용하기

    이제 android Room에 대한 사용 준비가 되었다. MainActivity에서 사용해보자
    해당 객체를 초기화 하는 부분에서 테스트를 위해 allowMainThreadQueries를 사용했다.
    데이터베이스에 접근하는 경우 MainThread에서 처리하면 비정상 종료를 야기하나 테스트를 위해 사용

            val db = Room.databaseBuilder(this, AppDatabase::class.java, "todo_db")
                .allowMainThreadQueries()
                .build()
    
            db.todoDao().getAll().observe(this, androidx.lifecycle.Observer {
                tv_result.text = it.toString()
            })
            btn_add.setOnClickListener{
                db.todoDao().insert(Todo(title = et_todo.text.toString()))
            }

    7. 결과

    텍스트를 입력하고 추가 버튼을 누르면 다음과 같이 결과들이 갱신 됨을 알 수 있다.

     

    이번 시간에는 android Room에 대한 구현을 간단하게 해보았다.

    반응형