Room

안드로이드 DB 라이브러리

Room

Room


안드로이드에서 SQLite 의 기능을 모두 쉽게 사용할 수 있도록 도와주는 라이브러리이다.



Entity


DB 안에 있는 테이블을 객체로 나타낸 것으로, 데이터 모델 클래스를 의미한다.

/**
 * Entity 는 DB 에 저장될 데이터의 형식으로 적어도 하나 이상의 Primary Key 가 필요하다.
 * @PrimaryKey(autoGenerate = true) 를 이용해 자동으로 생성되게 하는 것도 가능하다.
 */
@Entity(tableName = "table")
@TypeConverters(DateConverter::class)
data class BookMark(
    @PrimaryKey(autoGenerate = true)
    val id: Int = 0,

    @ColumnInfo(name = "title")
    val title: String,

    @ColumnInfo(name = "description")
    val description: String,
)



DAO(Database Access Object)


DB 에 접근해서 수행할 작업을 정의한 클래스이다.

/**
 * DAO 는 DB 를 통해 수행할 작업을 정의한 클래스이다.
 * 데이터의 삽입, 수정, 삭제 작업이나 저장된 데이터를 불러오는 작업 등을 함수 형태로 정의한다.
 * OnConflictStrategy 는 Primary Key 가 겹칠 경우의 정책을 설정하는 부분이다.
 */
@Dao
interface TableDao {

    @Query("SELECT * FROM table ORDER BY created ASC")
    fun findAll(): DataSource.Factory<Int, BookMark>


    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insert(bookMark: BookMark)


    @Delete
    fun delete(bookMark: BookMark)
}



Database


RoomDatabase 를 상속하는 추상 클래스로, 테이블과 버전을 정의한다.

@Database(
    entities = [TableEntity::class],
    version = DB_VERSION,
    exportSchema = false
)
abstract class AppDatabase: RoomDatabase() {

    abstract fun tableDao(): TableDao

    companion object {
        const val DB_VERSION = 1
        private const val DB_NAME = "app.db"

        private var appDatabase: AppDatabase? = null
				
		/**
         * synchronized 는 특정 스레드가 이미 자원을 사용하는 중이면
         * 나머지 스레드의 접근을 막아 데이터의 안정성을 보장
         */
        fun instance(context: Context): AppDatabase {
            return appDatabase ?: synchronized(this) {
                appDatabase ?: Room.databaseBuilder(
                    context.applicationContext,
                    AppDatabase::class.java,
                    DB_NAME
                ).fallbackToDestructiveMigration()
                    .build()
                    .also {
                        appDatabase = it
                    }
            }
        }
    }
}
essential