apple/iOS, UIKit, Documentation

Realm Swift Migration

lgvv 2022. 9. 5. 20:01

Realm Swift Migration

 

최근에 요구사항 중에 Realm을 마이그레이션 하는 작업이 있었다.

마이그레이션 없이 된다면 가장 좋겠지만, 검색 쿼리 성능 등 마이그레이션이 근본적으로 더 나아 보였다.

 

공식문서에 따르면 앱 설치 후 모델을 변경할 경우 마이그레이션이 필요하다.

 

마이그레이션 이미지

왼쪽 : 기존 모델

오른쪽 : 새로운 모델

 

(좌기존 모델 (우) 새로운 모델



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

Thread 1: Fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=10 "Migration is required due to the following errors: - Property 'Note.isbookmarked' has been added." UserInfo={NSLocalizedDescription=Migration is required due to the following errors: - Property 'Note.isbookmarked' has been added., Error Code=10}

 


즉, 마이그레이션 하라는 문구가 나타난다.

 

일단 기존 모델로 저장된 값들을 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에서 코드를 실행.

AppDelegate에 추가

 

시각적으로 확인

 

 

마이그레이션 성공!!

 

 

 

 

(참고)

https://www.mongodb.com/docs/realm/sdk/swift/model-data/change-an-object-model/#std-label-ios-perform-a-schema-migration

 

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

https://jerry-bakery.tistory.com/entry/iOS-iOS-Realm-Migration%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-%ED%95%98%EB%8A%94%EB%B2%95

 

[iOS] iOS Realm Migration(마이그레이션) 하는법

안녕하세요 Jerry입니다. Realm 데이터베이스를 Migration(마이그레이션) 하는 법에 대해 알아보겠습니다. iOS를 공부하면서 정리하는 것이기 때문에 미흡한 점이 있을 수 있습니다. 부족한 점에 대해

jerry-bakery.tistory.com