SW 공부노트
[안드로이드/Kotlin] Room 본문
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
'안드로이드 > 안드로이드 공부' 카테고리의 다른 글
[안드로이드/Kotlin] ViewModel (0) | 2023.04.12 |
---|---|
[안드로이드/Kotlin] Retrofit 라이브러리 (0) | 2023.04.12 |
[안드로이드/Kotlin] Binding(View, Data) (0) | 2023.04.12 |
[안드로이드/Kotlin] Navigation (with 프래그먼트) (0) | 2023.04.12 |
[안드로이드/Kotlin] RecyclerView 정리(Adapter, 클릭 리스너) (0) | 2023.04.09 |