본문 바로가기
Front-End/Kotlin

[Kotlin 실전] Room 사용하기

by seoyamin 2022. 7. 28.

1. Room 이란 ?

Room은 안드로이드에서 제공하는 SQLite를 더욱 효과적으로 사용할 수 있도록 돕는 라이브러리이다. 실제로 Android Developer 문서를 보면, 직접 SQLite API를 사용하는 것보다 Room을 사용하는 것을 권장하고 있다. 

 

[참고] https://developer.android.com/training/data-storage/room?hl=ko

 

Room을 사용하여 로컬 데이터베이스에 데이터 저장  |  Android 개발자  |  Android Developers

Room 라이브러리를 사용하여 더 쉽게 데이터를 유지하는 방법 알아보기

developer.android.com

 

 


 

2. Room의 전반적 구성

Room을 이용하기 위해서는 아래 3가지 파일이 필요하다.

① Database                             : Entity들을 담을 데이터베이스
② Entity                                  : DB에 담을 원소들
③ Data Access Object (DAO)   : DB와 Entity를 관리하는 쿼리를 담은 객체

 

 

 


 

3. Room 사용하기

3-1. 종속성 추가 

//  build.gradle (:app)

dependencies {
    def roomVersion = "2.4.2"  // 공식문서 버전 확인 필요

    implementation("androidx.room:room-runtime:$roomVersion")
    annotationProcessor("androidx.room:room-compiler:$roomVersion")

    kapt("androidx.room:room-compiler:$roomVersion")
   
}

 

3-2. 데이터 (Entity)

entity는 @Entity annotation을 붙인 data class로 정의한다. 해당 클래스에는 entity의 식별자인 Primary Key를 반드시 정의해줘야 하며, 나머지 attribute들을 추가로 정의할 수 있다.

 

// Dog.kt

@Entity
data class Dog(
    @PrimaryKey val id: Int,

    @ColumnInfo(name = "puppy_name") val name: String?,
    val age: Int?
)

 

3-2-1. Primary Key

Primary key는 entity를 정의하는 data class에서 필수이다. Primary key를 정의하기 위해서는 @PrimaryKey라는 annotation을 붙여주면 된다. 

 

@PrimaryKey val id: Int

 

 

만약, 여러 attribute로 구성된 복합 Primary key를 구성하고 싶으면 다음과 같이 @Entity의 primaryKeys 속성에 구성 attribute들을 나열해주면 된다.

 

@Entity(primaryKeys = ["name", "age"])
data class Dog(
    val name: String?,
    val age: Int?
)

 

 

3-2-2. Attribute

Room은 기본적으로 attribute 필드 이름을 DB의 column 이름으로 설정한다. 이때, 다른 이름으로 column명을 설정하고 싶다면 @ColumnInfo annotation을 이용하면 된다.

 

@ColumnInfo(name = "puppy_name") val name: String?,   // Column명 : puppy_name
val age: Int?                                         // Column명 : 자동으로 age

 

 

3-2-3. Table

Room은 기본적으로 Entity를 정의한 data class명을 DB의 테이블명으로 설정한다. 이때, 다른 이름으로 테이블명을 설정하고 싶다면 @Entity의 tableName 속성에 별도의 테이블 이름을 설정해주면 된다.

 

@Entity(tableName = "DogTable")
data class Dog(
    @PrimaryKey val id: Int,

    @ColumnInfo(name = "puppy_name") val name: String?,
    val age: Int?
)

 

 

3-3. 데이터 액세스 객체 (DAO)

Room은 DAO를 이용하여 저장된 데이터를 관리한다. DAO는 일반적으로 인터페이스로 정의되며, DB에 대한 access 권한을 제공하는 메소드가 포함되어 있다. 

 

DAO Methods
Convenience Methods Query Methods
SQL문을 작성하지 않아도 실행할 수 있는
간단한 insert, update, delete 메소드
SQL문을 사용해야 하는
복잡한 상황에서 사용하는 메소드

 

@Dao
interface DogDao {
    @Insert
    fun insertAll(vararg dogs: Dog)

    @Delete
    fun delete(dog: Dog)

    @Query("SELECT * FROM dogTable")
    fun getAll(): List<Dog>
}

 

 

[참고]  https://developer.android.com/training/data-storage/room/accessing-data

 

Room DAO를 사용하여 데이터 액세스  |  Android 개발자  |  Android Developers

Room 라이브러리의 일부인 DAO(데이터 액세스 개체)를 사용하여 데이터베이스 테이블을 수정하는 방법 알아보기

developer.android.com

 

 

 

3-4. 데이터베이스

데이터베이스는 @Database annotation을 부착한 데이터베이스 클래스를 통해 구현 가능하다. 이때, 데이터베이스 클래스는 아래의 조건 3개를 만족해야 한다.

 

①  @Database는 DB와 연결된 entity 종류를 모두 담은 entities 배열을 속성으로 가져야 한다. 

②  클래스는 RoomDatabase를 확장하는 추상 클래스여야 한다.

③  해당 DB와 연결된 각각의 DAO 클래스에서는
     인수가 0개이며 DAO 클래스의 instance를 리턴하는 추상 메서드가 정의되어 있어야 한다.

 

@Database(entities = [Dog::class], version = 1)
abstract class DogDatabase : RoomDatabase() {
    abstract fun dogDao(): DogDao
}