๐ก๋ก์ปฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌํ์ ์ํด ์ฌ์ฉ๋๋ Room, sharedPreference, DataStore์ ์ฐจ์ด์ ๋ํ์ฌ ์ ๋ฆฌํ์์ต๋๋ค.
๊ฐ์
- Room, SharedPreferences, DataStore๋ ๋ชจ๋ ์๋๋ก์ด๋์์ ๋ฐ์ดํฐ๋ฅผ ๋ก์ปฌ ํ๊ฒฝ์ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ ๋๋ค.
- ๊ฐ ๋ฐฉ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์ฉ๋์ ๋ฐฉ์์ ์ฐจ์ด๊ฐ ์์ผ๋ฉฐ, ๊ฐ ์ฅ๋จ์ ๊ณผ ์ฑ๋ฅ์ ์ฐจ์ด๊ฐ ์์ด์ ์ฐจ์ด๋ฅผ ์๊ณ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
Room
- Room์ ์๋๋ก์ด๋์์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ORM ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์
๋๋ค.
- Object-Relational Mapping : ๊ฐ์ฒด ๊ด๊ณ ๋งคํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ๋ด๋ถ์ ์ผ๋ก SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ์ง๋ง, ๋ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๊ฐ์ฒด ์งํฅ์ ์ธ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
- SQLite์ ๋ณต์กํ SQL ์ฟผ๋ฆฌ ์์ฑ ๊ณผ์ ์ ์ถ์ํํ์ฌ ๋ ์ฝ๊ฒ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ณ , ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ์ํ ๊ฐ๋จํ API๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํน์ง
- ๊ฐ ํ ์ด๋ธ์ด ์๋ก ๊ด๊ณ๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํ ์ด๋ธ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- Entity-DAO ๊ตฌ์กฐ๋ฅผ ํ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด๋ก ํํ(Entity)ํ๋ ํด๋์ค์, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ์ฐ์ ๋ด๋นํ๋(DAO)๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
- Coroutines, LiveData, Flow๋ฅผ ํตํด ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ๊ฐ์งํ๊ณ ์ค์๊ฐ UI๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
@Entity
data class User(
@PrimaryKey val uid: Int,
@ColumnInfo(name = "first_name") val firstName: String?,
@ColumnInfo(name = "last_name") val lastName: String?
)
@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAll(): List<User>
@Insert
fun insertAll(vararg users: User)
}
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
SharedPreferences
- SharedPreferences๋ Android์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ key - value ํ์์ผ๋ก ๊ฐ๋จํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ ์ ์ฅ์์ ๋๋ค.
- ์ฃผ๋ก ์ฑ ์ค์ ๊ฐ์ด๋ ๊ฐ๋จํ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉํ์ฌ, ๋ด๋ถ ์ ์ฅ์์ XML ํ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ฌ ์๊ตฌ์ ์ผ๋ก ์ ์งํฉ๋๋ค.
ํน์ง
- ๊ธฐ๋ณธ ํ์ ์ ๋ฐ์ดํฐ๋ฅผ ํค - ๊ฐ ์์ผ๋ก ์ฌ์ฉํ ์ ์์ด์ ๊ฐ๋จํ ๋ฐ์ดํฐ ์ ์ฅ์ ๋น ๋ฅด๊ณ ์ ์ฉํ๊ฒ ํ์ฉํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ์ ์ฅ์ ๋น๋๊ธฐ ์ ์ผ๋ก ์ฒ๋ฆฌ(apply()), ๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌ(commit())ํ ์ ์์ต๋๋ค.
val sharedPreferences = getSharedPreferences("prefs", Context.MODE_PRIVATE)
val editor = sharedPreferences.edit()
// ๋ฐ์ดํฐ ์ ์ฅ
editor.putString("user_name", "John Doe")
editor.putInt("user_age", 30)
editor.apply()
// ๋ฐ์ดํฐ ์ฝ๊ธฐ
val userName = sharedPreferences.getString("user_name", null)
val userAge = sharedPreferences.getInt("user_age", -1)
DataStore
- DataStore๋ Android์์ SharedPreferences์ ๋์ฒด๋ก ์ ๊ณต๋๋ ํ๋์ ์ธ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐฉ์์ ๋๋ค.
- SharedPreferences์ ๋ง์ฐฌ๊ฐ์ง๊ณ ํค - ๊ฐ ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ง๋ง, ๋น๋๊ธฐ ๋ฐฉ์์ ๋ ์์ ํ๊ณ ํจ์จ์ ์ผ๋ก ๋์ํ๊ฒ ํ ์ ์์ต๋๋ค.
ํน์ง
- Coroutines, Flow ๊ธฐ๋ฐ์ผ๋ก ๋น๋๊ธฐ ์์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํ๋ฉฐ, ์ฐ์ํ ์ฑ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- IO ์ค๋ ๋์์ ์๋ํ์ฌ ๋ฐ์ดํฐ ์ถฉ๋์ด๋ ์์ค์ ๋ฐฉ์งํ์ฌ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
- Proto DataStore๋ฅผ ํ์ฉํ๋ฉด ๋ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค.
Preferences DataStore
- SharedPreferences์ ์ ์ฌํ ํค - ๊ฐ ํ์์ผ๋ก ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
Proto DataStore
- Protocol Buffers๋ฅผ ์ฌ์ฉํด ๋ ๊ตฌ์กฐํ ๋ ๋ฐ์ดํฐ ์ ์ฅ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ์ด๋ฅผ ํ์ฉํ๋ฉด ํด๋์ค๋ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค.
Room vs SharedPreferences vs DataStore
ํน์ง | Room | SharedPreferences | DataStore |
๋ฐ์ดํฐ ๊ตฌ์กฐ | ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค (ํ ์ด๋ธ ๊ตฌ์กฐ) | ํค-๊ฐ ์ | ํค-๊ฐ ์ (Preferences), ํ๋กํ ์ฝ ๋ฒํผ (Proto) |
์ ์ฅ์ ์์น | SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ผ | XML ํ์ผ | ํ๋กํ ์ฝ ๋ฒํผ ํ์ผ ๋๋ Preferences ํ์ผ |
๋น๋๊ธฐ ์ฒ๋ฆฌ | ๋น๋๊ธฐ ์ฒ๋ฆฌ (Coroutines, LiveData, Flow) | ๊ธฐ๋ณธ์ ์ผ๋ก ๋๊ธฐ (apply()๋ ๋น๋๊ธฐ) | ๊ธฐ๋ณธ์ ์ผ๋ก ๋น๋๊ธฐ (Coroutines, Flow) |
์ฌ์ฉ ์ฉ๋ | ๋ณต์กํ ๋ฐ์ดํฐ ๋ฐ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ ์ ์ฅ | ๊ฐ๋จํ ์ค์ ๊ฐ ๋๋ ์๋์ ๋ฐ์ดํฐ ์ ์ฅ | ๊ฐ๋จํ ์ค์ ๊ฐ ๋๋ ๋ ๋ณต์กํ ๋ฐ์ดํฐ ์ ์ฅ |
๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ ์ง์ | ์ง์ | ์ง์ํ์ง ์์ | Preferences๋ ํค-๊ฐ, Proto๋ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ ์ง์ |
์ฑ๋ฅ | ํฐ ๋ฐ์ดํฐ, ๋ณต์กํ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌ | ๊ฐ๋จํ ๋ฐ์ดํฐ์ ์ ํฉํ์ง๋ง ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ๋ถ์ ํฉ | ์ฑ๋ฅ ์ฐ์ (๋น๋๊ธฐ, IO ์ค๋ ๋์์ ์คํ) |
์ ๋ฆฌ
- Room์ ๋ณต์กํ ๊ตฌ์กฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ์ฑ์ ์ ํฉํฉ๋๋ค.
- SharedPreferences๋ ๊ฐ๋จํ ์ค์ ๊ฐ์ด๋ ์ฌ์ฉ์ ๋ฐ์ดํฐ์ ๊ฐ์ ์๊ท๋ชจ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ ์ ํฉํฉ๋๋ค.
- DataStore๋ SharedPreferences์ ์์ ๋ฒ์ ์ผ๋ก, ๋น๋๊ธฐ ๋ฐ์ดํฐ ์ ์ฅ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ํ๊ฑฐ๋ ๋ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ๋ ์ ์ฉํฉ๋๋ค.
- ์ฑ์ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ์ํฉ์ ๋ง๊ฒ ์ฌ์ฉํ๋ฉด ํจ์จ์ ์ธ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.