본문 바로가기
Android 개발/Room, Realm, Databases

Realm 에서 Migration 하는 방법

by Developer88 2017. 3. 1.
반응형

RealmDB를 사용해서 안드로이드 앱을 만들다보면, Migration을 해야하는 경우가 생기는데요.

특히 배포가 된 앱이라면 더욱 그렇습니다.

오늘은 이 Migration작업에 대해서 정리해보도록 하겠습니다.


1. 데이터모델 Class


오늘 Migraion을 해볼 데이터 모델클래스는,

그동안 많이 사용해 왔던 Student Class입니다.

여기서 int타입의 StudentNumber를 추가해 보겠습니다.




아래와 같이 String인 StudentNumber를 넣어서 추가하였습니다. 

studentNumber는 필수요소여서, Required attribute을 추가하였습니다.




2. Migration Class생성


그러면, Migration을 정의할 Class를 생성해 보겠습니다.

Migraion 클래스를 생성하면서, implement해야할 것은 RealmMigraion interface인데요.

구현해야할 method는 migrate입니다.




실제로 구현하기 전에 잠시, RealmMigration interface의 소스코드먼저 보고 가겠습니다.

친절하게도, 어떤 패턴으로 구현해야 할지를 설명해주네요.

그리고, 개발할때는 deleteRealm(RealmConfiguration)을 쓰면, migration할 필요없이 db파일을 삭제할수있다고도 친절히 알려주고 있습니다.




설명이 길어서 두 장의 이미지로 짤랐는데요.

아래에서보면 writeTransaction으로 wrap되어있으므로, 따로 transaction으로 감쌀 필요가 없다고 하네요.




그럼 이제 구현해보도록 하겠습니다.

위에서 제시해준 Pattern을 사용할텐데요.


저희는 migration이 이번이 처음이므로,

oldVersion이 0일 경우를 구현해보겠습니다.(즉 Version0 => Version1 로 마이그레이션 한 경우이겠죠.)


get()메소드에 인자로 migration할 데이터모델클래스명을 넣어주고요.

(만약 데이터 클래스를 생성한다면, create()메소드를 사용하면 됩니다.)


addField()메소드로 추가한 필드를 넣어주는데요.

기존의 데이터를 수정해야 할때는 transform()메소드를 사용하면 됩니다.

새로 들어가는 studentNumber는 필수사항이므로, 기존의 데이터에도 random하게 넣어주도록 하였습니다.




3. RealmConfig 빌드


이제 Realm 환경설정을 빌드해서, getInstance에 넘겨주기만 하면 되겠습니다.

아래와 같이 schemaVersion은 1로 버전을 올릴때마다 수정해주어야 하구요,

migration에는 위에서 작성했던 Migration의 객체를 생성해서 넘겨줍니다.




이제 다 준비가 다 되었으니, 한번 UI에서 테스트 해보겠습니다.

아래와 같이, 잘 적용되어서 기존 학생들의 학번도 random하게 잘 들어갔습니다.


5. 개발중일때는 deleteRealm


Migration이 중요하지만, 개발중일때는 역시 DB파일을 지우는 것이 가장 효율적이고 빠른데요.

마지막으로 deleteRealm을 하는 방법도 정리하겠습니다.

메소드 명이 매우 직관적인데요. deleteReamIfMigrationNeeded입니다.

아래와 같이 사용하면, 개발하면서 이렇게 저렇게 수정해 볼 때 매우 편리합니다.



추가적으로 마이그레이션이 필요할때 뿐만이 아니라, 

DB파일을 아에 삭제하고 새롭게 시작할 때는 아래와 같이 deleteRealm메소드를 사용해주면 됩니다.



그럼, 이 메소드의 소스코드를 보면서 글을 마무리 하겠습니다.

소스코드의 설명에는 인자로 받은 configuration에 정의된 Realm파일을 삭제한다고 나와있구요.

이 메소드를 부르기 전에 Realm객체가 곡 closed된 상태여야한다고 합니다.


728x90

댓글