Realm Swift Migration
최근에 요구사항 중에 Realm을 마이그레이션 하는 작업이 있었다.
마이그레이션 없이 된다면 가장 좋겠지만, 검색 쿼리 성능 등 마이그레이션이 근본적으로 더 나아 보였다.
공식문서에 따르면 앱 설치 후 모델을 변경할 경우 마이그레이션이 필요하다.
마이그레이션 이미지
왼쪽 : 기존 모델
오른쪽 : 새로운 모델


모델을 변경 후에 코드를 실행하면 크래시가 발생

즉, 마이그레이션 하라는 문구가 나타난다.
일단 기존 모델로 저장된 값들을 Realm-Studio를 통해 시각적으로 확인할 수 있음
Relam Browser도 된다는데 M1 Mac에서 잘 안되어서 일단 이거 활용
DB 하면서 늘 느끼지만 시각적으로 보이는 것과 안보이는 것의 차이가 너무 크다.


샘플 코드
마이그레이션 코드를 해당 모델 객체에서 관리하도록 설계했다.
// MARK: - migration
static func migration(minimumVersion: UInt64) {
// 🍬 1. config 설정 (이전 버전에서 다음 버전으로 마이그레이션 될 때)
let cofiguration = Realm.Configuration(
// 🍬 2. 새로운 버전 스키마 설정
schemaVersion: minimumVersion
) { migration, oldSchemaVersion in
// 🍬 3. 마이그레이션 수행
// 🍬 3-1. 지난 버전이 최소 지원 버전보다 낮으면
if oldSchemaVersion < minimumVersion {
// 🍬 3-2. 마이그레이션을 통해 빈 필드 값 채워주기
migration.enumerateObjects(
ofType: Note.className()
) { oldObject, newObject in
// 🍬 3-3. 새로운 필드를 채워 넣기
newObject?["isBookmarked"] = false
}
}
}
// 🍬 4. Realm이 새로운 Object를 사용할 수 있도록 설정
Realm.Configuration.defaultConfiguration = cofiguration
}
그리고 나서 Realm의 extension으로 이렇게 migration 관련한 코드를 작성.
개인적으로 코드가 어느정도 집약되어 있어야 필요한 게 필요한 영역에 있어서 복잡도가 낮아진다.
> 모듈화를 모듈화를 매우 지양.

AppDelegate에서 코드를 실행.

시각적으로 확인

(참고)
Change an Object Model - Swift SDK — Realm
Avoid nesting or otherwise skipping if (oldSchemaVersion < X) statements in migration blocks. This ensures that all updates can be applied in the correct order, no matter which schema version a client starts from. The goal is to define migration logic whic
www.mongodb.com
[iOS] iOS Realm Migration(마이그레이션) 하는법
안녕하세요 Jerry입니다. Realm 데이터베이스를 Migration(마이그레이션) 하는 법에 대해 알아보겠습니다. iOS를 공부하면서 정리하는 것이기 때문에 미흡한 점이 있을 수 있습니다. 부족한 점에 대해
jerry-bakery.tistory.com
'apple > iOS, UIKit, Documentation' 카테고리의 다른 글
| [iOS] DiffableDataSource n-Section n-Item (섹션마다 다른 셀) (0) | 2022.09.18 |
|---|---|
| Realm 간단하게 구조 적용하기 (0) | 2022.09.06 |
| [Realm] The document “default.realm” could not be opened. (0) | 2022.09.05 |
| Realm CRUD more modern and swifty (0) | 2022.09.04 |
| [iOS] UICollectionView에 대해서 알아보기 7편 (UICollectionViewDiffableDataSource) (1) | 2022.09.04 |