안드로이드의 SQLite의 데이터를 Realm으로 옮기는 방식이 궁금하신가요? Pluu라는 닉네임으로 활동 중인 노현석님이 Realm 사용자 모임에서 SqliteToRealm을 사용하여 Sqlite에서 Realm으로 마이그레이션한 경험을 공유합니다.
Realm 도입 배경 및 SqliteToRealm을 사용한 마이그레이션
노현석님의 11월 20일 Realm 사용자 모임 발표 입니다.
프로젝트에 Realm을 도입한 배경과 함께 SqliteToRealm에 대한 소개와 적용 방법, Realm으로의 마이그레이션 중 좋았던 점과 아쉬웠던 점에 대해서 발표해 주셨습니다. Sqlite로부터 Realm으로 마이그레이션을 하고자 하는 분을 위한 조언도 덧붙여 주셨습니다.
Realm 도입 배경
- 웹툰을 가져와서 보여주는 앱을 혼자서 개발하던 중에 Bitbucket에만 올리던 기존 소스를 GitHub에 공개하기로 함
- 공개를 위해 소스를 리팩토링하면서 여러 가지를 바꾸던 중 Realm을 적용하게 됨
- 바꾸기 전 오픈 소스
- jsoup
- butterknife
- glide
- SQLbrite
- rxandroid
- 바꾼 후 오픈 소스
- okhttp
- jsoup
- butterknife
- glide
- Realm
- otto
- rxandroid
Realm 적용 범위
- Favorite Info : 즐겨 찾기 정보
- Read Info : 책갈피 정보
Favorite ———— service Name : String Toon ID : String
Read ———— service Name : String Toon ID : String Episode ID : String
기존 사용 오픈 소스: SQLbrite
- Picasso와 OKHttp, Retrofit을 만든 Square사에서 제작
- SQLiteOpenHelper + Reactive 기능 제공
- 사용 계기는 Rx 관련 세미나에서 Rx를 접했고 Square사에 대한 신뢰가 있었기 때문임
- 코드는 Rx와 동일한 구조
- Realm 다음으로 간편한 라이브러리
Realm
- Core 부문은 NDK
- Realm과 Sqlite는 같지 않음
- Sqlite 마이그레이션에 대한 가이드가 없음
SqliteToRealm
- 마이그레이션 방법을 찾다가 발견한 애드온
- 한국 페이지에는 없지만 Realm의 add-ons 사이트가 존재함
- SQLiteToRealm도 add-ons > Java > Tools에서 접근 가능
- SQLite의 데이터를 Realm에 넣는 코드
public void pushSynonymsToWords(){
SqliteHelper dbs = SqliteHelper.getInstance();
RealmHelper dbr = RealmHelper.getIntance();
List<Word> rawWords = getAllRawWords();
List<List<String>> records = dbs.getRecords("synonym");
List<IntPair> synonyms = new ArrayList<>();
for(List<String> record : records){
if(null == record.get(0) || null == record.get(1))
continue;
IntPair pair = new IntPair(Integer.parseInt(record.get(0)),Integer.parseInt(record.get(1)));
synonyms.add(pair);
}
dbr.addSynonymToWords(synonyms);
}
- SQLite를 오픈하고 데이터를 가져와서 SQLite를 닫고 Realm 객체를 받아와서 트랜잭션을 시작한 후 데이터를 넣고 커밋하는 과정을 거침
마이그레이션 중 느낀 점
- Realm의 빠른 속도와 ORM인 점이 좋았음
- 혹시 싶어서 기존 SQLite 코드를 삭제할 수 없었음
- SQLiteOpenHelper
- Item Class
- 한국어 사이트에 add-ons 페이지가 없는 것이 아쉬움
일본 사이트의 피드백
- APK 크기가 커지는 문제는 ABI Split으로 해결 가능
- 수만 건 이상의 큰 데이터를 옮기려면 트랜잭션에서 처리하는 단위가 큰 경우 OOM 발생 가능해서 100~200 단위로 처리함
- Realm version에 맞는 Proguard 처리가 필요함
- SQLite와 Realm 속도 비교
query, count | SQLite | Realm |
---|---|---|
Insert, 20 Count | 150ms | 100ms |
Search, 4 Count | 14ms | 8ms |
Search, 4 Count | 17ms | 10ms |
Insert, 16 Count (62kb) | 97ms | 38ms |
마이그레이션시 추천 사항
- 처음부터 Realm을 사용하는 것을 추천함
- 마이그레이션시 Rx를 쓰면 코드가 깔끔해짐
- 실행 시 SqliteToRealm이 필요한데 Preference에 flag를 등록해서 나중에는 Realm 작업이 실행되지 않도록 함
컨텐츠에 대하여
이 컨텐츠는 저자의 허가 하에 이곳에서 공유합니다.