본문 바로가기
Kotlin

[TIL] Room DB 사용법

by 명훈스토리 2023. 2. 2.
SMALL

Room DB 사용법

1. Room을 Gradle에 추가하는 방법

MainActivity에서 'Room'이라고 작성한 후 Alt + Enter해서 추가하거나 앱 단의 gradle에서 직접 아래와 같이 작성하고 우측 상단 Sync now를 클릭하면 된다.

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'kotlin-kapt'
}
// Room DB
implementation 'androidx.room:room-runtime:2.5.0'
kapt 'androidx.room:room-compiler:2.5.0'

 

2. Entity 데이터 클래스 추가

@Entity
data class User(
    var name: String,
    var age: String,
    var phone: String
) {
    @PrimaryKey(autoGenerate = true) var id: Int = 0
}

코틀린 클래스를 하나 추가한 후 데이터 클래스를 만든다. 데이터 클래스에 @Entity 어노테이션을 붙여 저장할 변수 이름과 타입을 정해준다. primaryKey는 고유의 키값으로 만든다. 직접 지정 가능하지만 autoGenerate를 true로 주면 자동으로 값을 생성할 수 있다.

 

3. DAO Interface 추가

Data Access Object의 줄임말로 데이터에 접근할 수 있는 메서드를 정의해놓은 인터페이스이다. 말하자면 데이터가 변경될 때 실행할 메소드를 모아놓은 것으로 Activity와 Database 간 상호작용 역할을 한다.

@Dao
interface UserDao {

    @Insert
    fun insert(user: User) {
        Log.d("UserDao : ", user.toString())
    }

    @Update
    fun update(user: User)

    @Delete
    fun delete(user: User)

    @Query("SELECT * FROM User")
    fun getAll(): List<User>

    @Query("DELETE FROM User WHERE name = :name")
    fun deleteUserByName(name: String)
}

위와 같이 생성할 수 있으며 interface 이름 위에 @Dao, 메소드마다 Query를 붙일 수 있고, 각각의 역할을 하는 어노테이션을 붙일 수 있다.

 

4. Room Database 추가

@Database(entities = [User::class], version = 1)
abstract class UserDatabase: RoomDatabase() {
    abstract fun userDao(): UserDao

    companion object {
        private var instance: UserDatabase? = null

        @Synchronized
        fun getInstance(context: Context): UserDatabase? {
            if (instance == null) {
                synchronized(UserDatabase::class) {
                    instance = Room.databaseBuilder(
                        context.applicationContext,
                        UserDatabase::class.java,
                        "user-database"
                    ).build()
                }
            }
            return instance
        }
    }
}

데이터베이스를 생성하고 관리하는 데이터베이스 객체를 만들기 위해 위와 같이 추상 클래스를 작성하고 RoomDatabase를 상속받고, @Database로 데이터베이스임을 표시해준다. @Database안에 entity를 넣고 version은 앱 운영 중 entity의 구조를 변경해야 하는 일이 생길 때 이전과 구별해주는 역할을 한다. 만약 구조가 달라졌지만 version이 같다면 에러가 난다. 처음에는 version을 1로 해주면 된다.

 

공식문서에 따르면 데이터베이스 객체를 인스턴스할 때는 싱글톤으로 구현하기를 권장하고 있다. 여러 인스턴스에 접근해야 하는 일이 거의 없고 객체 생성에 비요잉 많이 들기 때문이다.

 

5. 데이터베이스 사용하기

var newUser = User("임명훈", "29", "010-6878-8517")

val db = UserDatabase.getInstance(applicationContext)
CoroutineScope(Dispatchers.IO).launch {
    if (db != null) {
        db.userDao().insert(newUser)
    }
}

위 코드를 실행할 액티비티에 넣으면 되고, 데이터베이스 작업은 메인 스레드가 아닌 별개의 스레드에서 작업해야 한다. 따라서 Coroutine을 사용해야 한다. 따라서 gradle에 아래 코드를 작성하고 위와 같이 CoroutineScope로 네트워크나 DB 등 백그라운드에서 필요한 작업을 위해 IO 스레드에서 데이터베이스 작업을 수행한다.

LIST

'Kotlin' 카테고리의 다른 글

[Paging] Paging이란?  (0) 2023.02.03
[ViewModel] ViewModel이란?  (0) 2023.02.03
[LifeCycles] LifeCycles란?  (0) 2023.02.03
[Coroutine] Coroutine이란?  (0) 2023.02.02
[TIL] Room DB와 Realm DB의 차이  (0) 2023.01.31

댓글