47
Realm In 리리리 2016.03.31 드드드드드드드 드드드드드 드드드 드드드

Realm in 리멤버

  • Upload
    -

  • View
    188

  • Download
    3

Embed Size (px)

Citation preview

Page 1: Realm in 리멤버

Realm In 리멤버2016.03.31

드라마앤컴퍼니 안드로이드 개발자 이승민

Page 2: Realm in 리멤버

1.리멤버 소개2.선택

3.제약사항4.Tip5.단점6.광고

목차

Page 3: Realm in 리멤버

명함 관리 비서명함을 찍으면1

2타이피스트 ( 사람 ) 가 입력해서

3앱에 자동으로 정리된다

리멤버란 ?

Page 4: Realm in 리멤버

회원 100 만명누적 명함 4,000 만장2015 년 대한민국 브랜드 대상 , 2015 년 구글플레이 올해의 앱

스마트한 비즈니스 습관100 만 비즈니스맨의 선택국민 명함앱 리멤버

Page 5: Realm in 리멤버

기술부채를 갚기 위한 API v2 작업

고민의 시작

Page 6: Realm in 리멤버

DB 스키마가 다 변하면서 클라이언트도 갈아 엎어야 한다

Page 7: Realm in 리멤버

Realm 이 좋다던데 어때 ?

Page 8: Realm in 리멤버

원래 쓰던 GreenDAO 에 비해 뭐가 더 좋아 ?* GreenDAO 는 Sqlite 기반의 ORM 입니다 . Realm 은 엔진부터 새로운 데이터베이스 입니다 .

Page 9: Realm in 리멤버

GreenDAO vs Realm- 성능

- 사용성

Page 10: Realm in 리멤버

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)

Page 11: Realm in 리멤버

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. 성능

Page 12: Realm in 리멤버

압도적인 성능 차이 ( 특히 Select)

Page 13: Realm in 리멤버

많은 row 를 자주 다루는가 ?로드 비용 중 디비 로드의 비율이 큰가 ?

Page 14: Realm in 리멤버

10,000 개부터 20,000 개의 명함을 로드 , 검색하는 유저도 있다 .많은 row 수의 DB IO 가 필요하다 .

Page 15: Realm in 리멤버

사실 Sqlite 로도 속도로 CS 가 들어온 적은 없다 .디비의 비용이 중요하지 않은 상황이다 .

Page 16: Realm in 리멤버

성능만으로는 뭔가 선택의 이유가 부족하다 !

Page 17: Realm in 리멤버

2. 사용성

Has 로 Table 끼리의 관계 표현이 가능하다 .

-> 객체를 그대로 사용하므로 , 설계가 편하다 .-> 조인 쿼리를 직접 사용하지 않아도 된다 .

Page 18: Realm in 리멤버

명함 , 그룹 , 명함 내 세부 데이터 등 다양한 Table 의 관계가 엮여있다

Page 19: Realm in 리멤버

어느정도의 성능향상을 기대하면서 높은 사용성을 얻는다 .Realm 을 사용하자 !

Page 20: Realm in 리멤버

제약사항RealmObject Customize 불가능쓰레드 간 객체 전달 불가능

Page 21: Realm in 리멤버

RealmObject Customize 는 static Util 로 해결한다

Page 22: Realm in 리멤버

쓰레드 간 객체 전달 불가능

비동기 질의비동기 트랜잭션Realm 객체 자동갱신

Page 23: Realm in 리멤버

비동기 질의

콜백 또는 Rx 를 통해 결과를 받는다 .

Page 24: Realm in 리멤버

비동기 트랜잭션

Page 25: Realm in 리멤버

Realm 객체 자동갱신

Page 26: Realm in 리멤버

Realm 객체 자동갱신

A 가 변경하면 , B 도 변경한 값을 받는다 .

Page 27: Realm in 리멤버

Tip

위험한 DTOcopyFromRealm()시간차 트랜잭션 ! Realm.refresh()

Page 28: Realm in 리멤버

DTO(Data Transfer Object)스키마는 동일하지만 , RealmObject 를 상속받지 않는다 . POJO 로 , 쓰레드 간 데이터 전달을 위한 중간 객체 .

Page 29: Realm in 리멤버
Page 30: Realm in 리멤버

비용이 크다 .변환 객체가 많으면 ANR 이 난다 .

Page 31: Realm in 리멤버

DTO 는 사용하지 않는 것이 좋다 .자동갱신을 활용하자 .

Page 32: Realm in 리멤버

copyFromRealm()

Page 33: Realm in 리멤버

시간차 트랜잭션 ! Realm.refresh()

Page 34: Realm in 리멤버

Realm 의 단점

알수 없는 예외들다중 쓰레드에서의 Realm 객체 관리부족한 쿼리들학습비용

Page 35: Realm in 리멤버

알수 없는 예외들

1. BadVersion- findAllAsync()- findAllSortedAsync()

동기적으로 실행하는 메소드로 대체한다 .findAll() & findAllSorted()

Page 36: Realm in 리멤버

알수 없는 예외들

2. SharedGroup- Realm.getDefaultInstance()

해결할 수 없다 . 감수해야 한다 .

Page 37: Realm in 리멤버

다중 쓰레드에서의 Realm 객체 관리

Thread A 에서 Realm 을 삭제하면Thread B 에서도 접근하지 못한다

Page 38: Realm in 리멤버

부족한 쿼리들Collate Localized ASCㄱ ~ ㅎ이 가 ~ 힣보다 앞으로 나온다 . Java 코드에서 초성을 추출하여 한번 더 Sorting 한다 .

CASE WHEN특수문자 , 숫자가 한글 , 영어보다 앞으로 나온다 . 첫글자 속성에 따라 Order 를 저장하는 Column 추가한다 .

MATCHContacins, Like 로는 원하는 검색 속도를 내지 못한다 . 하지만 Realm 에서 FTS 를 사용하지 못한다 .Sqlite 에서 Index 를 관리하고 , Realm 에서 명함을 검색하는 방식으로 혼용한다 .

Page 39: Realm in 리멤버

학습비용

위에 적은 것들을 모두 겪어야 자연스럽게 사용이 가능한다 .-> 학습비용이 낮은 편은 아니다 .

Page 40: Realm in 리멤버

Realm 의 장점

빠른 업데이트문서화커뮤니티

Page 41: Realm in 리멤버

문제가 있어도 빠르게 해결해주겠지

빠른 업데이트

Page 42: Realm in 리멤버

문서에 가면 해결방법이 있겠지

문서화

https://realm.io/kr/docs/java/latest/

Page 43: Realm in 리멤버

물어보면 답해주겠지

커뮤니티

https://github.com/realm/realm-java/issues

Page 44: Realm in 리멤버

Realm 살아있네

Page 45: Realm in 리멤버

아직 불완전 하지만 ,장점이 있는 구조를 들고나왔고 ,빠르게 발전할 것이라는 기대감을 준다 .

결론

http://bit.ly/1M2E6HW

Page 46: Realm in 리멤버

안드로이드 개발자웹 개발자OCR R&D기획자

http://dramancompany.com/joinus/

리멤버에서 구인해요

Page 47: Realm in 리멤버

감사합니다Q&A