๊นจ์•Œ ๊ฐœ๋… ๐Ÿ“‘/Android

[Android] Room - AutoMigrationSpec

interfacer_han 2024. 5. 8. 20:50

#1 ์ด์ „ ๊ธ€

 

[Android] Room - AutoMigration ๊ธฐ์ดˆ

#1 ๊ฐœ์š”#1-1 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ (Database Schema) [Android] Room - Entity, DAO, Database#1 ์ด์ „ ๊ธ€ [Android] Room - ๊ธฐ์ดˆ, INSERT์™€ DELETE ์—ฐ์Šต #1 Room ์†Œ๊ฐœ Room์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ์ดํ„ฐ ์ €์žฅ | Android D

kenel.tistory.com

์œ„ ๊ฒŒ์‹œ๊ธ€์—์„œ ์ด์–ด์ง„๋‹ค.

 

#2 AutoMigrationSpec

 

AutoMigrationSpec  |  Android Developers

androidx.compose.desktop.ui.tooling.preview

developer.android.com

Column ๋˜๋Š” Table์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” ์ด์ „ ๊ฒŒ์‹œ๊ธ€์˜ ๋ฐฉ์‹๋Œ€๋กœ ํ•˜๋ฉด ๋œ๋‹ค. ๋ฐ˜๋ฉด, Column ์ด๋ฆ„์˜ ๋ณ€๊ฒฝ ๋˜๋Š” ์‚ญ์ œ, Table ์ด๋ฆ„์˜ ๋ณ€๊ฒฝ ๋˜๋Š” ์‚ญ์ œ๋ฅผ ํ•  ๋•Œ๋Š” AutoMigrationSpec ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด AutoMigrationSpec์€ ๋ฌด์—‡์ธ๊ฐ€๋ฅผ ๋…ผํ•˜๊ธฐ์— ์•ž์„œ, ์™œ ์ด์ „ ๊ฒŒ์‹œ๊ธ€์—์„  AutoMigrationSpec์ด ํ•„์š”์—†์—ˆ๋Š”๊ฐ€?

 

AutoMigration์€ ๋น„๊ต(์ด์ „ ๊ฒŒ์‹œ๊ธ€ ์ฐธ์กฐ)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™๋˜๋Š”๋ฐ, Column ๋˜๋Š” Table์ด ์ถ”๊ฐ€๋œ ๊ฒฝ์šฐ ์ด์ „ ์Šคํ‚ค๋งˆ์™€ ๋น„๊ตํ•ด ๋ฌด์—‡์ด ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ๋ณ„๋„์˜ ์„ค๋ช…์—†์ด ํŒŒ์•…๋œ๋‹ค. ๋ฐ˜๋ฉด, Column์ด๋‚˜ Table์˜ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋˜์—ˆ๊ฑฐ๋‚˜ ์•„์˜ˆ ์‚ญ์ œ๋œ ๊ฒฝ์šฐ๋ผ๋ฉด ๋ฌด์—‡์ด ๋ณ€๊ฒฝใ†์‚ญ์ œ๋˜์—ˆ๋Š”์ง€ ์„ค๋ช…์ด ํ•„์š”ํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, C๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ฐ”๋€ ์ปฌ๋Ÿผ์˜ ์›๋ž˜ ์ด๋ฆ„์ด A์˜€๋Š”์ง€ B์˜€๋Š”์ง€๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋งŒ์ด ์•Œ๊ณ  ์žˆ๊ณ , ๋”ฐ๋ผ์„œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ Room์—๊ฒŒ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์•Œ๋ ค์ฃผ๋Š” ๋ช…์‹œ์  ์„ค๋ช…์ด ํ•„์ˆ˜์ ์œผ๋กœ ์š”๊ตฌ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ธํ„ฐํŽ˜์ด์Šค์˜ ํ˜•ํƒœ๋กœ ๋งŒ๋“  ๊ฒƒ์ด ๋ฐ”๋กœ AutoMigrationSpec์ด๋‹ค.

 

#3 AutoMigrationSpec์„ ์ด์šฉํ•ด Column ์ด๋ฆ„ ๋ฐ”๊ฟ”๋ณด๊ธฐ

#3-1 @ColumnInfo์˜ name ์†์„ฑ ์ˆ˜์ • (User.kt)

...

@Entity(tableName = "user_data_table")
data class User(

    ...

    @ColumnInfo(name = "user_nai", defaultValue = "-1")
    var age: Int
)

@ColumnInfo์˜ name ์†์„ฑ์„ "user_age"์—์„œ "user_nai"๋กœ ๋ฐ”๊พผ๋‹ค.

 

#3-2 @Database์˜ ์†์„ฑ๋“ค ์ˆ˜์ • (UserDatabase.kt)

...

@Database(
    entities = [User::class],
    version = 3,
    exportSchema = true,
    autoMigrations = [
        AutoMigration(from = 1, to = 2),
        AutoMigration(from = 2, to = 3)
    ]
)
abstract class UserDatabase : RoomDatabase() {

    ...
}

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ์— ๋ณ€๊ฒฝ(#3-1)์ด ๋ฐœ์ƒํ–ˆ์œผ๋ฏ€๋กœ, @Database ์–ด๋…ธํ…Œ์ด์…˜์˜ version ์†์„ฑ๊ฐ’์„ 1๋งŒํผ ์˜ฌ๋ฆฐ๋‹ค. ๊ทธ๋ฆฌ๊ณ  version 2์—์„œ 3์œผ๋กœ๊ฐ€๋Š” AutoMigration์„ ๋ช…์‹œ์ ์œผ๋กœ ํ—ˆ์šฉํ•ด์ค€๋‹ค (autoMigrations ์†์„ฑ). ์—ฌ๊ธฐ๊นŒ์ง€๋งŒ ์ง„ํ–‰ํ•˜๊ณ  ํ•œ๋ฒˆ ์•ฑ์„ ์‹คํ–‰์‹œ์ผœ๋ณด๋ฉด AutoMigration Failure: Please declare an interface extending 'AutoMigrationSpec'๋ผ๋Š” ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

#3-3 AutoMigrationSpec ํด๋ž˜์Šค ๋งŒ๋“ค๊ณ  ์ ์šฉํ•˜๊ธฐ

...
import androidx.room.migration.AutoMigrationSpec

@Database(
    ...
    autoMigrations = [
        AutoMigration(from = 1, to = 2),
        AutoMigration(from = 2, to = 3, spec = UserDatabase.Migration2To3::class)
    ]
)
abstract class UserDatabase : RoomDatabase() {

    @RenameColumn(tableName = "user_data_table", fromColumnName = "user_age", toColumnName = "user_nai")
    class Migration2To3 : AutoMigrationSpec

    ...
}

์œ„์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ๋‚ด๋ถ€ class๋ฅผ ๋งŒ๋“ค๊ณ , AutoMigration์˜ spec ํ”„๋กœํผํ‹ฐ์— ํ• ๋‹นํ•œ๋‹ค.

 

#4 ์ž‘๋™ ํ™•์ธ

"user_age"๋ผ๋Š” ์ด๋ฆ„์ด์—ˆ๋˜ Column์ด "user_nai"๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ผˆ๋‹ค.

 

#5 ๋‚˜๋จธ์ง€ ์–ด๋…ธํ…Œ์ด์…˜

 

Room ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด์ „  |  Android Developers

Room ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ด์ „ํ•˜๋Š” ๋ฐฉ๋ฒ• ์•Œ์•„๋ณด๊ธฐ

developer.android.com

AutoMigrationSpec์„ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค์— ๋‹ฌ ์ˆ˜ ์žˆ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์€ ๋ณธ ๊ฒŒ์‹œ๊ธ€์—์„œ ์“ฐ์ธ @RenameColumn ์™ธ์— @DeleteColumn, @RenameTable, @DeleteTable์ด ์žˆ๋‹ค. ์œ„ ๋งํฌ์—์„œ ๊ฐ ์–ด๋…ธํ…Œ์ด์…˜์˜ ์“ฐ์ž„ ์˜ˆ์‹œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

#6 ์š”์•ฝ

Room์€ ์•Œ ์ˆ˜ ์—†์ง€๋งŒ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์•Œ๊ณ  ์žˆ๋Š” ๋ณ€๊ฒฝ์‚ฌํ•ญ์„, class์˜ ํ˜•ํƒœ๋กœ Room์—๊ฒŒ ์•Œ๋ ค์ค€๋‹ค.

 

#7 ์™„์„ฑ๋œ ์•ฑ

 

android-practice/room/AutoMigrationSpec at master · Kanmanemone/android-practice

Contribute to Kanmanemone/android-practice development by creating an account on GitHub.

github.com