Room ๊ฒ์๊ธ ์๋ฆฌ์ฆ
#1 ๊ฐ์
#1-1 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง (Database Schema)
[Android] Room - Entity, DAO, Database
#1 ์ด์ ๊ธ [Android] Room - ๊ธฐ์ด, INSERT์ DELETE ์ฐ์ต #1 Room ์๊ฐ Room์ ์ฌ์ฉํ์ฌ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ ์ ์ฅ | Android Developers Room ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์ฝ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๋ ๋ฐฉ๋ฒ ์์๋ณด
kenel.tistory.com
๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ Table์ ๊ฐฏ์๋ ๊ฐ ํ
์ด๋ธ์ ์๋ Column์ ๊ฐฏ์์ ํ์
๋ฑ์ ์๋ฏธํ๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ง๋ณด์ํ๋ค๊ฐ, ์ด๋ค Table์ ์๋ก์ด Column์ ์ถ๊ฐํด์ผํ ํ์์ฑ์ด ์๊ฒผ๋ค๊ณ ํด๋ณด์. ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ Room์ผ๋ก ๊ตฌํํ๋ค๋ฉด, @Entity์ ์๋ก์ด @ColumnInfo๋ฅผ ์ถ๊ฐํ์ ๊ฒ์ด๋ค. ๋, @Database์ version ์์ฑ์ ๊ฐ๋ +1 ํด์ฃผ์์ ๊ฒ์ด๋ค. (์ ๊ฒ์๊ธ ์ฐธ์กฐ)
#1-2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ๋ณ๊ฒฝ์ ์ด๋ ค์

ํ์ง๋ง, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ์๋ฌด ๋์ฑ
์์ด ๋ณ๊ฒฝํ๋ฉด (์๋ก ์ถ๊ฐํ ์ปฌ๋ผ 1์ null์ด ๋ค์ด๊ฐ๋ฉด ์๋๋ ๊ฒฝ์ฐ) ์์ ๊ฐ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฌด๊ฒฐ์ฑ์ด ๊นจ์ง ์ ์๋ค. ์ด๋, ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๋ ์ฝ๊ณ ๊ฐํธํ ๋์ฑ
์ผ๋ก ์ธ๋งํ ๊ฒ์ด Room์ AutoMigration ๊ธฐ๋ฅ์ด๋ค.
#1-3 AutoMigration์ ์ญํ

AutoMigration์ ๋ง ๊ทธ๋๋ก ์๋(auto)์ผ๋ก, ์คํค๋ง ๋ฒ์ ์ ์ด์ฃผ(migration)์์ผ์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค. ์์์ ์ต์ ๋ฒ์ ์ ์คํค๋ง์ ๊ทธ ์ง์ ๋ฒ์ ์ ์คํค๋ง๋ฅผ ๋น๊ตํ์ฌ ๋ฌด๊ฒฐ์ฑ์ด ๊นจ์ง๋งํ ๋ถ๋ถ์ ์์์ ๋ณด์ํ๋ค. ํ๋ก๊ทธ๋๋จธ๊ฐ ๋จธ๋ฆฌ๋ฅผ ์ฅ์ด๋ฏ์ผ๋ฉฐ SQL๋ฌธ์ ์ณ์ค ํ์๊ฐ ์๋ค. ์ฐธ๊ณ ๋ก, AutoMigration์ 2.4.0-alpha01 ๋ฒ์ ์ด์์ Room์์๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
#2 AutoMigration ์ฌ์ฉํ๊ธฐ
#2-1 ์กฐ๊ฑด

Room์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง์ ๋ณ๊ฒฝ์ ๊ฐ์งํ๋ฉด์, ๋์์ ์ต์ ๋ฒ์ ์ ์คํค๋ง์ ๊ทธ ์ง์ ๋ฒ์ ์ ์คํค๋ง๋ฅผ ๋น๊ตํ ์ ์์ด์ผ ํ๋ค. ๊ทธ๋ ๊ฒ ํ๊ธฐ ์ํด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ๋ฒ์ ๋ณ๋ก ๊ด๋ฆฌํ ํ์๊ฐ ์๋ค. @Database ์ด๋
ธํ
์ด์
์ ์์ฑ exportSchema๋ฅผ true๋ก ์ค์ ํ๊ณ (๊ธฐ๋ณธ๊ฐ๋ true๊ธด ํ๋ค), ๋ฒ์ ๋ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๊ฐ ์ ์ฅ๋ ๊ณต๊ฐ๋ ๋ช
์์ ์ผ๋ก ์ค์ ํด์ค๋ค. ๊ทธ๋ฆฌ๊ณ AutoMigration์ด ์งํ๋ ์ด์ ๋ฒ์ ๊ณผ ์ดํ ๋ฒ์ ์ ๋ช
์ํ๋ค. ๋ง์ง๋ง์ผ๋ก, AutoMigration์ ์ด๋ป๊ฒ ์งํํ ๊ฒ์ธ๊ฐ๋ฅผ ์ค์ ํ๋ค. ์๋ฅผ ๋ค์ด, ์ด๋ค ํ
์ด๋ธ์ ์๋ก์ด Column์ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด, ํด๋น Column์ ๋์๋๋ @ColumnInfo์ ์์ฑ defaultValue๋ฅผ ํน์ ๊ฐ์ผ๋ก ์ด๊ธฐํ ํจ์ผ๋ก์จ, ํด๋น ์ปฌ๋ผ ์ถ๊ฐ ์ ์ ์ฝ์
๋์ด์๋ Record๋ค์ด ํด๋น defaultValue๋ฅผ ๋ฐ๋ฅด๋๋ก ๋ง๋ ๋ค.
#2-2 ์์ ํ ์ฑ
[Android] Room - ๊ธฐ์ด, INSERT์ DELETE ์ฐ์ต
#1 Room ์๊ฐ Room์ ์ฌ์ฉํ์ฌ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ ์ ์ฅ | Android Developers Room ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์ฝ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๋ ๋ฐฉ๋ฒ ์์๋ณด๊ธฐ developer.android.com SQLite๋ ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ๋ฅผ ์ํ
kenel.tistory.com
์ ๊ฒ์๊ธ์ ์์ฑ๋ ์ฑ์ ๊ธฐ๋ฐ์ผ๋ก, AutoMigration์ ์งํํด๋ณธ๋ค.
#2-3 ๊ตฌ๋ฒ์ ์คํค๋ง์ Record ๋ฃ๊ธฐ

๋จผ์ , EditText์ ๊ฐ์ ์
๋ ฅํ๊ณ Button์ ๋๋ฌ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ Record๋ฅผ ์ ๋นํ ๋ฃ์ด๋์. ํ๋จ Bar์ ์๋ [App Inspection]์ ํด๋ฆญํด์ ๋ค์ด๊ฐ Record๋ฅผ ๊ฐํธํ๊ฒ ๊ตฌ๊ฒฝํ ์ ์๋ค. AutoMigration์ด ์งํ๋ ๋ ์ด Record๊ฐ ์ด๋ป๊ฒ ๋ณ๊ฒฝ๋๋์ง ํ์ธํ๊ธฐ ์ํ ์์
์ด๋ค.
#2-4 @Database์ ์์ฑ exportSchema๋ฅผ true๋ก ์ค์ (UserDatabse.kt)
...
@Database(
entities = [User::class],
version = 1,
exportSchema = true,
)
abstract class UserDatabase : RoomDatabase() {
...
}
@Database ์์ฑ๋ค์ ์ค๋ช
ํ๋ ๊ณต์ ๋ฌธ์
#2-5 ๋ชจ๋ ์์ค build.gradle์ room.schemaLocation ๋๋ ํ ๋ฆฌ ์ค์
plugins {
...
}
android {
...
defaultConfig {
...
}
kapt {
arguments {
arg("room.schemaLocation", "$projectDir/schemas")
}
}
buildTypes {
...
}
compileOptions {
...
}
kotlinOptions {
...
}
...
}
dependencies {
...
}
room์ ์ด๋
ธํ
์ด์
(@)์ ๊ธฐ๋ฐํ์ฌ ์๋ํ๋ค. ๋ฐ๋ผ์, ์ด๋
ธํ
์ด์
์ฒ๋ฆฌ๊ธฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ์ ์ฅํ ๊ณต๊ฐ์ ์ฃผ์(value)๋ฅผ ์๋ ค์ค๋ค. ํด๋น value์ ํค๋ "room.schemaLocation"์ด๋ค.
#2-6 ํ๋ก์ ํธ ๋น๋

ํ๋ก์ ํธ๋ฅผ ์ปดํ์ผํด์ผ ๋น๋ก์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๊ฐ ์๊ธด๋ค. ๋ฐ๋ผ์, ์ฐ์ ์ปดํ์ผ(๊ทธ๋ฅ ์ฑ์ ์คํ์ํค๋ฉด ๋๋ค)ํด์ ๊ตฌ๋ฒ์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ์ ์ฅํ๋ค. #2-1์์ AutoMigration์ ๋น๊ตํ ์ ์์ด์ผ ๋์๋๋ค๊ณ ํ๋ค. ๊ทธ๋์ ๊ตฌ๋ฒ์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ์ฐ์ ์ ์ฅํด๋๋ ๊ฒ์ด๋ค. ํด๋น ํ์ผ์ ์ผ์ชฝ Bar์ ๋ณด๊ธฐ ๋ชจ๋๋ฅผ [Andorid]์์ [Project Files]๋ก ๋ณ๊ฒฝํด์ผ ๋ณด์ธ๋ค.
#2-7 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ๋ณ๊ฒฝ ๋ฐ AutoMigration์ ํ๋ฆ ์ค์ (User.kt)
...
@Entity(tableName = "user_data_table")
data class User(
...
@ColumnInfo(name = "user_age", defaultValue = "-1")
var age: Int
)
์ Column์ ์ถ๊ฐํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ๋ ๊ฒ์ผ๋ก AutoMigration์ ํ๋ฆ์ ์ง์ ํ๋ค. ๊ธฐ๋ณธ๊ฐ์ ์ ์คํ๊ฒ ์ค์ ํด์ผ ํ๋ค. ์๋ฅผ ๋ค์ด ๋์ด๊ฐ -1์ธ ๊ฒฝ์ฐ๋ ์กด์ฌํ์ง ์์ผ๋ฏ๋ก, ๋์ด๊ฐ -1์ธ ์ ์ ๋ ์์ ์คํค๋ง ๋ ์
๋ ฅ๋ ์ ์ ๋ผ๊ณ ํ๋ณ ๊ฐ๋ฅํ๋ค. ์ด๋ฌ๋ฉด ํด๋น ์ ์ ๋ค์๊ฒ๋ง ๋์ด ์
๋ ฅ์ ์ถ๊ฐ๋ก ์์ฒญํ๋ ์ฐฝ์ ๋์ฐ๋ ์์ผ๋ก ์ฑ์ ์ค๊ณํ ์ ์์ ๊ฒ์ด๋ค.
#2-8 Database์ version ์์ฑ ๋ฐ autoMigrations ์์ฑ ์ค์ (UserDatabase.kt)
...
@Database(
entities = [User::class],
version = 2,
exportSchema = true,
autoMigrations = [AutoMigration(from = 1, to = 2)]
)
abstract class UserDatabase : RoomDatabase() {
...
}
์คํค๋ง๊ฐ ๋ณ๊ฒฝ๋์์ผ๋ฏ๋ก version ๊ฐ์ 1๋งํผ ์ฌ๋ฆฐ๋ค. ๊ทธ๋ฆฌ๊ณ autoMigrations ์์ฑ์ ์์ ๊ฐ์ด ์ค์ ํ๋ค (์ฐธ์กฐ). ์ด ์์ฑ์ ๋ณธ ํ๋ก์ ํธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํ๋ ์ ์๋ AutoMigration์ ๋ชฉ๋ก์ ๋ช
์์ ์ผ๋ก ์ ์ดํ๋ ์์ฑ์ด๋ค.
#2-9 ๊ธฐํ ๋ค๋ฌ๊ธฐ ์์

@Entity์ ๋ณ๊ฒฝ๊ณผ ์ฐ๊ด๋ ๊ธฐ์กด ๋ฐฑ์๋ ์ฝ๋๋ค์ ์
๋ฐ์ดํธํ๊ณ , ํ๋ก ํธ์๋์์ ์ฌ์ฉ์์ ๋์ด๋ฅผ ์
๋ ฅ๋ฐ์ EditText๋ฅผ ์ถ๊ฐํ๋ค. Age๋ ๋ด๋ถ์ ์ผ๋ก Intํ์ผ๋ก ๊ด๋ฆฌ๋๋๋ฐ ๋ฐํด, ํด๋น ๊ฐ์ ์
๋ ฅ๋ฐ๋ EditText๋ String์ผ๋ก์ ๊ฐ์ ๋ค๋ฃจ๋ฏ๋ก, ์ด ์ฐจ์ด๋ฅผ ์กฐ์ ํ๋ฉฐ ์๋ฐฉํฅ ๋ฐ์ดํฐ๋ฐ์ธ๋ฉ์ ํ๊ธฐ ์ํด Converter๋ฅผ ์ฌ์ฉํ๋ค. (์ ์ฒด ์ฝ๋๋ #5 ์ฐธ์กฐ)
#3 ์๋ ํ์ธ

๊ธฐ์กด ์คํค๋ง์ ์ถ๊ฐ๋์๋ Record๋ค์ user_age Column์ -1์ด ํ ๋น๋์ด์๋ ๋ชจ์ต์ ํ์ธํ ์ ์๋ค. 4๋ฒ์งธ ๋ ์ฝ๋๋ ์ต์ ์คํค๋ง์์ ์ถ๊ฐํ Record๋ค.
#4 ์์ฝ
AutoMigration๋ ์ง๋ฃจํ๊ณ ํ์ ๋ฐํ SQL๋ฌธ ์ฌ์ฉ์ ์๋ตํ๊ฒ ๋ง๋ค์ด์ค๋ค.
#5 ์์ฑ๋ ์ฑ
android-practice/room/AutoMigrationBasics at master ยท Kanmanemone/android-practice
Contribute to Kanmanemone/android-practice development by creating an account on GitHub.
github.com
#6 ์ด์ด์ง๋ ๊ธ
[Android] Room - AutoMigrationSpec
#1 ์ด์ ๊ธ [Android] Room - AutoMigration ๊ธฐ์ด#1 ๊ฐ์#1-1 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง (Database Schema) [Android] Room - Entity, DAO, Database#1 ์ด์ ๊ธ [Android] Room - ๊ธฐ์ด, INSERT์ DELETE ์ฐ์ต #1 Room ์๊ฐ Room์ ์ฌ์ฉํ์ฌ ๋ก
kenel.tistory.com
์ด์ด์ง๋ ๊ฒ์๊ธ์์ AutoMigrationSpec์ ์ด์ฉํ์ฌ Column ์ด๋ฆ์ ๋ณ๊ฒฝ ๋๋ ์ญ์ , Table ์ด๋ฆ์ ๋ณ๊ฒฝ ๋๋ ์ญ์ ๋ฅผ ํด๋ณธ๋ค.
'๊นจ์ ๊ฐ๋ ๐ > Android' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android] Retrofit - ๋ฐฐ๊ฒฝ๊ณผ ๊ตฌ์กฐ (0) | 2024.05.28 |
---|---|
[Android] Room - AutoMigrationSpec (0) | 2024.05.08 |
[Android] Room - ๋ฐํ ๊ฐ์ด ์๋ INSERT (0) | 2024.02.29 |
[Android] RecyclerView - notifyDataSetChanged() (0) | 2024.02.28 |
[Android] ViewModel - View์ Event ๋ฐ์์ํค๊ธฐ (0) | 2024.02.27 |