SW 공부노트

[안드로이드/Kotlin] Room 본문

안드로이드/안드로이드 공부

[안드로이드/Kotlin] Room

요빈 2023. 5. 11. 16:35

Room DB

Room은 앱을 견고하고 유지보수성이 뛰어나도록 만들어주는 라이브러리 모음인 AAC 중 하나이다.

Room은 SQLite DB를 모두 사용할 수 있고, 더 쉽게 사용할 수 있도록 하는 라이브러리이다.

Room 데이터베이스는 SQLite를 사용하기 위한 액세스 포인트이다.

AAC의 다른 컴포넌트인 LiveData, ViewModel 등을 사용해 더 간편하게 DB를 관리하고 UI를 갱신할 수 있다.

 

Room의 구성요소는 다음과 같다.

 

  • Database: 기본 앱 데이터베이스 연결을 위한 기본 액세스 포인트
  • Dao(Data Access Object): 데이터베이스에 접근하는 함수를 포함한다.
  • Model(Entity): 데이터베이스 내 테이블을 클래스로 나타낸 것이다.

Gradle 설정

// Room components
def roomVersion = '2.2.5'
implementation "androidx.room:room-runtime:$roomVersion"
kapt "androidx.room:room-compiler:$roomVersion"
implementation "androidx.room:room-ktx:$roomVersion"
androidTestImplementation "androidx.room:room-testing:$roomVersion"

// ViewModel
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1'

Entity 클래스 생성

Entity를 위한 데이터 클래스를 생성한 후 다음 주석들을 작성한다.

 

  • @Entity
  • @PrimaryKey(autoGenerate = bool)
  • @ColumnInfo(name = "열 이름")
package com.example.pattern.model

@Entity
data class Item (
    @PrimaryKey(autoGenerate = true) val id: Int,
    val name: String,
    val fav_movie: String,
    val fav_actor: String,
    val genre: String
)

DAO 인터페이스 생성

DAO는 데이터베이스 작업 실행과 관련된 모든 복잡성을 숨기기위해 사용한다.

 

  • @Dao
  • @Insert(onConflict = OnConflictStrategy. )
  • @Update, Delete etc
  • @Query("SQL문") + 메서드 인수를 매개변수로 전달 가능
package com.example.pattern.database

@Dao
interface ItemDao {
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    fun insert(item: Item)

    @Update()
    fun update(item: Item)

    @Delete
    fun delete(item: Item)

    @Query("SELECT * FROM Item")
    fun getAllItems(): Flow<List<Item>>

    @Query("SELECT * FROM Item WHERE id = :id")
    fun getItem(id: Int): Flow<Item>
}

* 데이터베이스가 업데이트되면 변경된 데이터를 UI에 반영하는 작업이 필요하다.

Coroutine에서 제공하는 Flow를 반환하면 데이터가 변경됐을 때 자동으로 변경된 데이터를 반환한다.

Room에서도 Flow 반환형을 처리하는 코드를 생성한다.

 

Database 추상 클래스 생성

Database 파일에는 Dao 인스턴스 호출 메서드와 Database 인스턴스 생성 메서드가 포함되어 있다.

 

  • RoomDatabase() 상속 + abstract 선언
  • @Database(entities, version, exportSchema)
  • Dao 인스턴스 호출 추상 메서드
  • Companion Object 내 데이터베이스 인스턴스 및 생성 함수 -> 싱글톤 패턴
    • 인스턴스 @Volatile 휘발성 변수로 선언 -> 모든 작업이 캐시가 아닌 메모리에서 실행
    • 경합 상태 발생 시 한 번에 하나씩 접근할 수 있도록 synchronized 사용
    • Room.databaseBuilder(ctx, klass, databaseName)
@Database(entities = [Item::class], version =  1, exportSchema = false)
abstract class ItemDatabase: RoomDatabase() {
    abstract fun itemDao(): ItemDao

	// DB 초기 데이터 설정을 여기서 하기도 하더라
	// 코루틴과 Dao 사용해서 비동기로 데이터 삽입 작업
    
    companion object{
        @Volatile
        var INSTANCE: ItemDatabase? = null

        fun getDatabase(ctx: Context): ItemDatabase{
            return INSTANCE ?: synchronized(this){
                val instance = Room.databaseBuilder(
                    ctx.applicationContext,
                    ItemDatabase::class.java,
                    "item_database")
                    .build()
                INSTANCE = instance
                return instance
            }
        }
    }
}

- Application 클래스에서 데이터베이스 인스턴스를 인스턴스화해 앱 전체에서 사용할 수 있도록 한다.

 

  • Application 상속
  • 늦은 초기화 위해 by lazy 사용
class BaseApplication: Application() {
    val database: ItemDatabase by lazy {
        ItemDatabase.getDatabase(this)
    }
}

Reference

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

 

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

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

developer.android.com

https://developer.android.com/codelabs/android-room-with-a-view-kotlin#0

 

뷰를 사용한 Android Room - Kotlin  |  Android 개발자  |  Android Developers

이 Codelab에서는 Kotlin 코루틴과 함께 Android 아키텍처 구성요소(RoomDatabase, Entity, DAO, AndroidViewModel, LiveData)를 사용하는 Android 앱을 Kotlin으로 빌드합니다. 이 샘플 앱은 단어 목록을 Room 데이터베이스

developer.android.com