@Database(
entities = [
Memo::class,
MemoCategory::class,
Cart::class,
CartList::class,
ToDoList::class
],
version = 1,
exportSchema = false //스키마를 파일로 내보내지 않도록 설정
)
abstract class AppDatabase : RoomDatabase() {
// DAO를 정의
abstract fun memoDao(): MemoDao
abstract fun memoCategoryDao(): MemoCategoryDao
abstract fun cartDao(): CartDao
abstract fun cartListDao(): CartListDao
abstract fun toDoListDao(): ToDoListDao
companion object {
@Volatile
private var INSTANCE: AppDatabase? = null
fun getInstance(context: android.content.Context): AppDatabase {
return INSTANCE ?: synchronized(this) {
val instance = androidx.room.Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"app_database" // 데이터베이스 이름
).fallbackToDestructiveMigration() // 스키마 변경 시 기존 데이터를 제거
.build()
INSTANCE = instance
instance
}
}
}
}
해당 코드를 설명하겠습니다.
1.@Datavase 어노테이션
entities: Room에서 관리할 테이블 목록을 지정.version : 데이터베이스 버전.exportSchema: Room이 데이터베이스 스키마를 파일로 내보낼지 여부를 설정, 보통 개발 초기 단계에서는 false로 설정합니다.abstract fun memoDao(): MemoDao
abstract fun memoCategoryDao(): MemoCategoryDao
abstract fun cartDao(): CartDao
abstract fun cartListDao(): CartListDao
abstract fun toDoListDao(): ToDoListDao
각 dao를 연결해줍니다.
만약 새로운 entity나 dao를 추가시 여기에도 꼭 추가해 줍시다.
해당 부분은 잘 모르는 부분이 많았었기에 추가 설명을 하겠습니다.
Room데이터베이스는 앱 전체에서 하나이 인스턴스만 생성하여 사용하는 것이 권장됩니다.
이는 데이터베이스 작업에 매우 비용이 크기 때문입니다.
전체 코드
companion object {
@Volatile
private var INSTANCE: AppDatabase? = null
fun getInstance(context: android.content.Context): AppDatabase {
return INSTANCE ?: synchronized(this) {
val instance = androidx.room.Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"app_database" // 데이터베이스 이름
).fallbackToDestructiveMigration() // 스키마 변경 시 기존 데이터를 제거
.build()
INSTANCE = instance
instance
}
}
}
3.1 @Volatile키워드
@Volatile
private var INSTANCE: AppDatabase? = null
Volatile는 변수의 변경이 모든 스레드에 즉시 반영되도록 보장합니다.INSTANCE를 변경하면, 다른 스레드에서도 변경된 값을 즉시 볼 수 있습니다.3.2 synchronized 블록
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"app_database"
).fallbackToDestructiveMigration()
.build()
INSTANCE = instance
instance
}
synchroized는 여러 스레드가 동시에 접근할 때, 한번에 하나의 스레드만 블록 내부 코드를 실행하도록 보장합니다.3.3 Room.databaseBuilder
Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"app_database"
)
Room Database를 빌드하는 메서드 입니다.
매게변수
context.applicationContext: 앱의 전체 생명 주기 동안 사용할 ContextAppDatabsse::class.java Room Database의 클래스 타입"app-database": 데이터베이스 이름3.4 fallbackToDestructiveMigration
3.5 결과반환
INSTANCE = instance
instance
INSTANCE가 null이면 synchronized 블록이 실행됩니다.INSTANCE에 저장한 후 반환합니다.INSTANCE가 이미 생성되어 있으면 즉시 반환합니다.synchronized 블록은 실행되지 않습니다.