#1 이전 글
위 게시글에서 이어진다.
#2 AutoMigrationSpec
Column 또는 Table을 추가할 때는 이전 게시글의 방식대로 하면 된다. 반면, Column 이름의 변경 또는 삭제, Table 이름의 변경 또는 삭제를 할 때는 AutoMigrationSpec 클래스의 인스턴스가 필요하다. 그렇다면 AutoMigrationSpec은 무엇인가를 논하기에 앞서, 왜 이전 게시글에선 AutoMigrationSpec이 필요없었는가?
AutoMigration은 비교(이전 게시글의 #2-1 참조)를 기반으로 작동되는데, 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 나머지 어노테이션
AutoMigrationSpec을 구현하는 클래스에 달 수 있는 어노테이션은 본 게시글에서 쓰인 @RenameColumn 외에 @DeleteColumn, @RenameTable, @DeleteTable이 있다. 위 링크에서 각 어노테이션의 쓰임 예시를 볼 수 있다.
#6 요약
Room은 알 수 없지만 프로그래머는 알고 있는 변경사항을, class의 형태로 Room에게 알려준다.
#7 완성된 앱
'깨알 개념 > Android' 카테고리의 다른 글
[Android] Retrofit - 기초 (0) | 2024.05.29 |
---|---|
[Android] Retrofit - 배경과 구조 (0) | 2024.05.28 |
[Android] Room - AutoMigration 기초 (0) | 2024.05.06 |
[Android] Room - 반환 값이 있는 INSERT (0) | 2024.02.29 |
[Android] RecyclerView - notifyDataSetChanged() (0) | 2024.02.28 |