본문 바로가기

iOS

[Realm] Migration (개념)

728x90

oh ma boi ~ oh ma boi ~ babe 가 아니고

마이그레이션 .. 톺아보기 .. ! 그 첫번째 .. 개념편 .. ? 

 

#Migration

마이그레이션이란?

하드웨어, 소프트웨어, 네트워크 등 넓은 범위에서 사용되고 있는 개념으로 현재 운영되고 있는 환경으로부터 다른 운영 환경으로 옮기는 작업을 말한다.

 

DB에서는 스키마 버전을 관리하기 위해서 마이그레이션을 사용한다. 

 

 

#Schema Version

Realm DB에서는 컬럼이 추가/삭제될 때 Schema Version을 증가시키기만 하면 자동으로 마이그레이션이 이루어진다. 

 

별도로 스키마 버전을 지정하지 않으면 realm의 기본값은 0이다.

마이그레이션을 진행할 때는 항상 (숫자를 올려서)상위 버전으로 업데이트를 해야한다.

ㄴ 버전 3에서 버전 2로 내려갈 수 없다. (만약 DB구조가 이전으로 변경되었다고 해도)

ㄴ 만약 앱에서 현재 버전보다 낮은 스키마 버전일 때 앱을 실행하여 렘을 열면 오류가 발생한다. 앱이 꺼질 수도 있다.

 

더 복잡하게 스키마를 업데이트 해야한다면, migrationBlock을 활용해서 수동으로 마이그레이션 업데이트를 해야한다.

 

 

#deleteRealmIfMigrationNeeded

앱을 출시할 때가 아니라, 앱을 디버깅하거나 개발할 때 마이그레이션을 대응하는 것 대신 사용할 수 있는 옵션이다.

즉 DB 구조가 바뀌었을 때 앱을 삭제 후 재설치해서 테스트 하는 것이 아니라 해당 프로퍼티를 true로 설정해서 대응할 수 있다.

 

extension AppDelegate {
    func aboutRealmMigration() {
        let config = Realm.Configuration(schemaVersion: 1, deleteRealmIfMigrationNeeded: true)
        Realm.Configuration.defaultConfiguration = config
    }
}

 

이렇게 코드를 작성하고 해당 함수를 

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) 내에서 호출하면 된다.

 

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        
        aboutRealmMigration()
        
        return true
    }

 

deleteRealmIfMigrationNeeded을 사용하면

기존 스키마와 현재 스키마가 불일치할 경우 해당 옵션을 통해 마이그레이션이 필요할 때 자동으로 기존 스키마를 제거한다.

 

그러나 !! 주의할 점은 !!

릴리즈 버전에서는 사용하면 안된다.

 

기존 스키마를 모두 제거하는 방식이므로 만약 스키마 버전이 0(앱 버전은 1.0)인 유저가 있을 때, 스키마 구조를 업데이트해서 스키마 버전이 1(앱 버전 1.1)로 배포가 되었다면 그 유저는 앱을 실행하면 기존의 정보가 모두 날라가게 된다. 

 

 

#Linear Migrations

마이그레이션 블록은 올바른 순서로, linear하게 작성해야 한다.

 

중첩하거나 건너뛰면 안되고,

모든 스키마 업데이트를 올바른 순서로 적용할 수 있게 if (oldSchemaVersion < 버전숫자) 를 작성해야 한다.

 

*else if 구문으로 작성하지 않는 이유도 같은 맥락이다.

모든 버전에 대한 대응이 필요하기 때문에 if문으로 작성을 해야한다. 

 

 

#Current Schema Version

개발자가 아무리 J+++여서 업데이트마다 스키마 버전을 정리하고 있다고 해도 .. 현재 앱에서 사용하고 있는 스키마 버전이 몇인지 까먹을 수 있다.

 

ViewController.swift 

do {
    let version = try schemaVersionAtURL(localRealm.configuration.fileURL!)
    print("Schema Version: \(version)")
} catch {
    print(error)
}

위의 코드를 사용해서 현재 앱에서 사용하고 있는 스키마 버전이 무엇인지 확인할 수 있다.

 

이렇게 콘솔창에 나타나게 된다.

 


여기까지는 개념 .. 에 .. 약간의 코드를 곁들인 것이었다면 .. 다음 글에서 실제 프로젝트에서 DB 구조를 바꾸고 스키마 버전을 업데이트 하는 마이그레이션 과정을 진행해보자 ~ .. 

'iOS' 카테고리의 다른 글

[iOS] Collection View APIs  (0) 2022.10.23
[Realm] Migration (실습)  (0) 2022.10.13
[iOS] Push Notification의 원리/동작 구조  (2) 2022.10.13
[iOS] Remote Notification (.p8 VS .p12)  (2) 2022.10.11
[iOS 16+] 개발자모드 (Developer Mode)  (0) 2022.10.11