1. Room 이란 ?
Room은 안드로이드에서 제공하는 SQLite를 더욱 효과적으로 사용할 수 있도록 돕는 라이브러리이다. 실제로 Android Developer 문서를 보면, 직접 SQLite API를 사용하는 것보다 Room을 사용하는 것을 권장하고 있다.
[참고] https://developer.android.com/training/data-storage/room?hl=ko
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
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
}
'Front-End > Kotlin' 카테고리의 다른 글
[Kotlin 기초] 다양한 코틀린 클래스 (0) | 2022.01.31 |
---|---|
[Kotlin 기초] 추상클래스와 인터페이스 (0) | 2022.01.31 |
[Kotlin 기초] 상속 (0) | 2022.01.31 |
[Kotlin 기초] 클래스 (0) | 2022.01.31 |
[Kotlin 기초] 흐름 제어 구문과 연산자 (0) | 2022.01.31 |