Upload
-
View
188
Download
3
Embed Size (px)
Citation preview
Realm In 리멤버2016.03.31
드라마앤컴퍼니 안드로이드 개발자 이승민
1.리멤버 소개2.선택
3.제약사항4.Tip5.단점6.광고
목차
명함 관리 비서명함을 찍으면1
2타이피스트 ( 사람 ) 가 입력해서
3앱에 자동으로 정리된다
리멤버란 ?
회원 100 만명누적 명함 4,000 만장2015 년 대한민국 브랜드 대상 , 2015 년 구글플레이 올해의 앱
스마트한 비즈니스 습관100 만 비즈니스맨의 선택국민 명함앱 리멤버
기술부채를 갚기 위한 API v2 작업
고민의 시작
DB 스키마가 다 변하면서 클라이언트도 갈아 엎어야 한다
Realm 이 좋다던데 어때 ?
원래 쓰던 GreenDAO 에 비해 뭐가 더 좋아 ?* GreenDAO 는 Sqlite 기반의 ORM 입니다 . Realm 은 엔진부터 새로운 데이터베이스 입니다 .
GreenDAO vs Realm- 성능
- 사용성
1. 성능Insert Bulk
1 차 100 500 1,000 10,000 20,000 50,000 100,000
Greendao 25 32 56 483 880 2288 3916
Realm 8 17 32 322 640 1500 3135
100 500 1,000 10,000 20,000 50,000 100,0000
1000
2000
3000
4000
5000Greendao Realm
row
시
간(m
s)
Select
1 차 1000 row 10,000 row 20,000 row 50,000 row 100,000 row
Greendao 5 146 449 2423 5243
Realm 0 5 7 19 48
1000 row 10,000 row 20,000 row 50,000 row 100,000 row0
1500
3000
4500
6000Greendao Realm
row
시
간(m
s)
1. 성능
압도적인 성능 차이 ( 특히 Select)
많은 row 를 자주 다루는가 ?로드 비용 중 디비 로드의 비율이 큰가 ?
10,000 개부터 20,000 개의 명함을 로드 , 검색하는 유저도 있다 .많은 row 수의 DB IO 가 필요하다 .
사실 Sqlite 로도 속도로 CS 가 들어온 적은 없다 .디비의 비용이 중요하지 않은 상황이다 .
성능만으로는 뭔가 선택의 이유가 부족하다 !
2. 사용성
Has 로 Table 끼리의 관계 표현이 가능하다 .
-> 객체를 그대로 사용하므로 , 설계가 편하다 .-> 조인 쿼리를 직접 사용하지 않아도 된다 .
명함 , 그룹 , 명함 내 세부 데이터 등 다양한 Table 의 관계가 엮여있다
어느정도의 성능향상을 기대하면서 높은 사용성을 얻는다 .Realm 을 사용하자 !
제약사항RealmObject Customize 불가능쓰레드 간 객체 전달 불가능
RealmObject Customize 는 static Util 로 해결한다
쓰레드 간 객체 전달 불가능
비동기 질의비동기 트랜잭션Realm 객체 자동갱신
비동기 질의
콜백 또는 Rx 를 통해 결과를 받는다 .
비동기 트랜잭션
Realm 객체 자동갱신
Realm 객체 자동갱신
A 가 변경하면 , B 도 변경한 값을 받는다 .
Tip
위험한 DTOcopyFromRealm()시간차 트랜잭션 ! Realm.refresh()
DTO(Data Transfer Object)스키마는 동일하지만 , RealmObject 를 상속받지 않는다 . POJO 로 , 쓰레드 간 데이터 전달을 위한 중간 객체 .
비용이 크다 .변환 객체가 많으면 ANR 이 난다 .
DTO 는 사용하지 않는 것이 좋다 .자동갱신을 활용하자 .
copyFromRealm()
시간차 트랜잭션 ! Realm.refresh()
Realm 의 단점
알수 없는 예외들다중 쓰레드에서의 Realm 객체 관리부족한 쿼리들학습비용
알수 없는 예외들
1. BadVersion- findAllAsync()- findAllSortedAsync()
동기적으로 실행하는 메소드로 대체한다 .findAll() & findAllSorted()
알수 없는 예외들
2. SharedGroup- Realm.getDefaultInstance()
해결할 수 없다 . 감수해야 한다 .
다중 쓰레드에서의 Realm 객체 관리
Thread A 에서 Realm 을 삭제하면Thread B 에서도 접근하지 못한다
부족한 쿼리들Collate Localized ASCㄱ ~ ㅎ이 가 ~ 힣보다 앞으로 나온다 . Java 코드에서 초성을 추출하여 한번 더 Sorting 한다 .
CASE WHEN특수문자 , 숫자가 한글 , 영어보다 앞으로 나온다 . 첫글자 속성에 따라 Order 를 저장하는 Column 추가한다 .
MATCHContacins, Like 로는 원하는 검색 속도를 내지 못한다 . 하지만 Realm 에서 FTS 를 사용하지 못한다 .Sqlite 에서 Index 를 관리하고 , Realm 에서 명함을 검색하는 방식으로 혼용한다 .
학습비용
위에 적은 것들을 모두 겪어야 자연스럽게 사용이 가능한다 .-> 학습비용이 낮은 편은 아니다 .
Realm 의 장점
빠른 업데이트문서화커뮤니티
문제가 있어도 빠르게 해결해주겠지
빠른 업데이트
문서에 가면 해결방법이 있겠지
문서화
https://realm.io/kr/docs/java/latest/
물어보면 답해주겠지
커뮤니티
https://github.com/realm/realm-java/issues
Realm 살아있네
안드로이드 개발자웹 개발자OCR R&D기획자
http://dramancompany.com/joinus/
리멤버에서 구인해요
감사합니다Q&A