Room์ ์๋๋ก์ด๋ ์ฑ์์ SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฝ๊ณ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ค.
Entity, DAO, Room Database ์ด ์ธ ๊ฐ์ ๊ตฌ์ฑ ์์๋ฅผ ํตํด Room ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ตฌ์ฑํ๋ค.
- Entity : Room์ผ๋ก ์์ ํ ๋ ํ ์ด๋ธ์ ์ค๋ช ํ๋ ์ด๋ ธํ ์ด์ ์ด ๋ฌ๋ฆฐ ํด๋์ค
- RoomDataBase : SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ก์ธ์ค ํฌ์ธํธ ์ญํ , ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฒด์ ์ธ ์์ ์ ์ญํ ์ ํ๋ฉฐ DB๋ฅผ ์๋กญ๊ฒ ์์ฑํ๊ฑฐ๋ ๋ฒ์ ์ ๊ด๋ฆฌ
- DAOData Access Object : ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ์ฌ ์ํํ ์์ ์ ๋ฉ์๋ ํํ๋ก ์ ์, SQL ์ฟผ๋ฆฌ๋ฅผ ํจ์์ ๋งคํํ๋ค. (select, insert, delete, join...)
Room | SQLite | |
---|---|---|
์ปดํ์ผํ์์ ์ฟผ๋ฆฌ ์ ํจ์ฑ ๊ฒ์ฌ | โ | โ |
Schema๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ SQL ์ฟผ๋ฆฌ ์ ๋ฐ์ดํธ | โ (์๋์ ๋ฐ์ดํธ) | โ (์๋์ ๋ฐ์ดํธ) |
๋ณด์ผ๋ฌํ๋ ์ดํธ | โ(์์ฉ๊ตฌ ์์ด ORM๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ๋งคํ) | โ (๋ง์ ์์ฉ๊ตฌ ํ์) |
LiveData, RxJava, Coroutine ์ง์ | โ | โ |
dependencies {
// Room components
implementation "androidx.room:room-ktx:$rootProject.roomVersion"
kapt "androidx.room:room-compiler:$rootProject.roomVersion"
androidTestImplementation "androidx.room:room-testing:$rootProject.roomVersion"
}
@Entity(tableName = "word_table")
data class Word(
@PrimaryKey @ColumnInfo(name = "word") val word: String
)
@PrimaryKey*(autoGenerate = true) val id : Int,
@ColumnInfo(name = "word") val word: String
@Entity(tableName = "word_table")
@Entity
์ด๋ ธํ ์ด์ ์ด ๋ฌ๋ฆฐ ํด๋์ค๋ SQLite ํ ์ด๋ธ์ ๋ํ๋ธ๋ค.- ํด๋์ค์ด๋ฆ๊ณผ ๋ค๋ฅธ ์ด๋ฆ์ ์ํ๋ ๊ฒฝ์ฐ
tableName
์์ฑ์ ์ง์ ํ๋ค
@PrimaryKey
๋ชจ๋ ์ํฐํฐ์๋ ๊ธฐ๋ณธํค๊ฐ ํ์ํ๋ค.@ColumnInfo(name= "word")
ํ ์ด๋ธ ์ปฌ๋ผ์ด ๋ฉค๋ฒ ๋ณ์์ ์ด๋ฆ๊ณผ ๋ค๋ฅธ ์ด๋ฆ์ ์ํ๋ค๋ฉด ์ค์ ํ ์ ์๋ค- PrimaryKey(๊ธฐ๋ณธํค)์ autoGenerate ์์ฑ์ ์ฌ์ฉํ์ฌ ๊ณ ์ ํค๋ฅผ ์๋ ์์ฑํ ์ ์๋ค
DAO(Data Access Object)์์ SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ํ๊ณ ๋ฉ์๋ ํธ์ถ๋ก ์ฐ๊ฒฐํ๋ค.
DAO๋ ์ธํฐํ์ด์ค ๋๋ ์ถ์ํด๋์ค์ฌ์ผ ํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ฟผ๋ฆฌ๋ ๋ณ๋์ ์ค๋ ๋์์ ์คํ๋์ด์ผ ํ๋ค.
@Dao
interface WordDao {
@Query("SELECT * FROM word_table ORDER BY word ASC")
fun getAlphabetizedWord(): List<Word>
@Insert(onConflict = OnConflictStrategy.IGNORE)
suspend fun insert(word: Word)
@Query("DELETE FROM word_table")
suspend fun deleteAll()
}
@Query("SELECT * FROM word_table ORDER BY word ASC")
์ฟผ๋ฆฌ ์ค์ @Insert
์ด๋ ธํ ์ด์ ์ SQL์ ์ ๊ณตํ ํ์๊ฐ ์๋คonConflict = OnConflictStrategy.IGNORE
์ด๋ฏธ ๋ชฉ๋ก์ ์๋ ๋จ์ด์ ์ ํํ ๋์ผํ ๊ฒฝ์ฐ ์ ๋จ์ด๋ฅผ ๋ฌด์ํ๋ ์ถฉ๋ ์ ๋ต์ ์ค์ ํ๋ค
Room DAO ์์ธํ ์์๋ณด๊ธฐ
Room Database ํด๋์ค๋ ์ถ์์ ์ด๊ณ ํ์ฅ๋์ด์ผํ๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ ์ฒด ์ฑ์๋ํด Room Database์ ์ธ์คํด์ค๋ ํ๋๋ง ํ์ํ๋ค.
@Database(entities = [Word::class], version = 1, exportSchema = false)
abstract class WordRoomDataBase : RoomDatabase() {
abstract fun wordDao(): WordDao
companion object {
@Volatile
private var INSTANCE: WordRoomDataBase? = null
fun getDatabase(context: Context): WordRoomDataBase {
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
WordRoomDataBase::class.java,
"word_database"
).build()
INSTANCE = instance
instance
}
}
}
}
- WordRoomDataBase ํด๋์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋๋๋ก
@Database
์ด๋ ธํ ์ด์ ์ ์ค์ ํ๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํ ์ํฐํฐ๋ฅผ ์ ์ธํ๊ณ , ๋ฒ์ ๋ฒํธ๋ฅผ ์ค์ ํ๋ค - ๋ง์ด๊ทธ๋ ์ด์
์ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ๋น๋ ๊ฒฝ๊ณ ๋ฅผ ํผํ๊ธฐ ์ํด
exportSchema
๋ฅผ false๋ก ์ค์ ํ๋ค - ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๊ฐ @Dao์ ๋ํ ์ถ์๋ฉ์๋๋ฅผ ํตํด dao๋ฅผ ๋ ธ์ถํ๋ค
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ธ์คํด์ค๋ 1๊ฐ๋ง ํผ์ํ๋ฏ๋ก ๋ค์ค์ธ์คํด์ค๋ฅผ ๋ฐฉ์งํ๋ค
object
,synchronized
์ ์ฌ์ฉํ์ฌ ์ฑ๊ธํค๊ตฌํ Room.databaseBuilder().build()
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค