Upgrade to Pro — share decks privately, control downloads, hide ads and more …

realm case study VCNC

Realm
November 25, 2015

realm case study VCNC

realm case study
2015/11/20 VCNC 김상일 님

Realm

November 25, 2015
Tweet

More Decks by Realm

Other Decks in Technology

Transcript

  1. 발표자 소개 - 김상일 / Alpaca Kim - ACM대회 국내

    은메달, World Finalist - 비트윈에서 3년에 걸쳐 3회의 인턴 - 비트윈에서 안드로이드 개발과 낮잠을 담당
  2. 비트윈 소개 - 커플들을 위한 모바일 서비스 - 아이폰, 안드로이드

    어플리케이션 - 전 세계 1400만+ 다운로드. - http://between.us - http://engineering.vcnc.co.kr
  3. 목차 1. Realm 소개 2. Realm 사용하게 된 이유 a.

    기존 데이터베이스의 문제점 b. 새롭게 필요한 기능들 3. Realm을 사용할 때 주의했던 점들과 해결 a. 데이터모델의 변화 b. Code generation (APT)를 이용한 해결
  4. Realm 소개 - Mobile Database - ACID 지원 - Relation의

    지원 - 객체/모델 지향으로 인한 편리성 - 빠른 속도의 데이터베이스
  5. 기존 비트윈 데이터베이스의 문제점 - SqLite 사용 - Relationship이 없기

    때문에 각 Table 마다 데이터를 중복 저장 - Action 마다 각 Table 에 변경사항 직접 반영해주는 코드 작성 (버그폭발!) - 기존의 Relationship 문제도 있었지만 3.0 업데이트에서는 이 Relationship이 더 증가하였다.
  6. - Relationship 지원 - 빠른 속도 - ORM like 한

    좋은 인터페이스 => 비트윈에 도입해보기로 함
  7. RealmObject는 DAO(Data Access Object) 객체 PhotoRealm extends RealmObject{ private String

    key; private String url; ... } PhotoRealm result = realm.where(PhotoRealm.class).findFirst(); String key = result.getKey(); - 이 DAO의 객체를 스레드 간에 전달을 할 수 없음. - 자기가 원하는 시점이 아닌 특정 시점에 값이 바뀔 수 있음 - 내부에 hasKey, toString 등의 추가함수들을 정의할 수 없음. - 디버깅할 때 값을 볼 수 없었음
  8. DB Thread Main Thread Realm Photo가 필요해 Photo 주세요! PhotoRealm

    PhotoRealm PhotoRealm.getUrl() Wrong Thread!!!! 를 뿜으면서 죽는 코드를 발견하실 수 있습니 다.
  9. Realm Photo가 필요해 Photo 주세요! PhotoRealm PhotoRealm PhotoRealm.getUrl() 원하지 않는

    시점에 값이 바뀔 수 있다! PhotoRealm Insert DB Thread Main Thread
  10. Realm DAO 문제 해결은? - 내부에 toString이나 hasKey등의 함수를 정의할

    수 있고 - 특정 시점에 값이 바뀌어도 이전 값을 유지할 수 있으며 - 스레드간의 값을 전달할 수 있도록 - 새로운 DTO를 정의하기로 하였다. - 이 필드들은 RealmObject들과 유사한 Field 값을 가지는 DTO로 정의 했다. PhotoDTO { String key String url } PhotoRealm { String key String url }
  11. Realm Moment가 필요해 Moment 주세요! MomentRealm MomentDTO PhotoDTO DB Thread

    Main Thread 1. 내부에 추가 함수를 정의할 수 없다. => PhotoDTO에 정의한다.
  12. Realm Moment가 필요해 Moment 주세요! MomentRealm MomentDTO MomentDTO DB Thread

    Main Thread 2. 자기가 원하는 시점이 아닌 특정 시점에 값이 바뀔 수 있음 => PhotoRealm에서 조회한 값을 DTO로 변환시킨다면 DTO의 값은 유지!
  13. Realm Moment가 필요해 Moment 주세요! MomentRealm MomentDTO MomentDTO DB Thread

    Main Thread 3. 이 DAO의 객체를 스레드간에 전달할 수 없음. => PhotoRealm에서 조회한 값을 DTO로 변환시킨다면 DTO는 스레드 간에 전달이 가능!
  14. Realm Photo가 필요해 Photo 주세요! PhotoRealm PhotoDTO PhotoDTO 데이터 불러올

    때는 PhotoRealm -> PhotoDTO로 변환하는 코드가 필요! 데이터 저장시에는 PhotoDTO -> PhotoRealm을 변환하는 코드가 필요! DB Thread Main Thread
  15. RelataionShip문제 발생 PhotoDTO { String key ImageDTO image } ImageDTO

    { String source int width int height } PhotoRealm { String key ImageDTO photo }
  16. Recursive하게 변환이 필요하다. PhotoDTO { String key ImageDTO image }

    ImageDTO { String source int width int height } PhotoRealm { String key ImageRealm photo } ImageRealm { String source int width int height }
  17. Enum의 추가 MomentDTO: MomentType type = PHOTO ... MomentRealm: String

    type = “PHOTO” enum MomentType{ PHOTO VIDEO UNKNOWN } Enum의 역변환 코드 try{ MomentType.valueOf(MomentRealm.getType()) catch (Exception e) { MomentType.valueOf(“UNKNOWN”) }
  18. Map의 추가 MomentDTO: Map<K,V> weather ... MomentRealm: RealmList<PairKeyValue> weather Map은

    RealmList로 변환해서 저장. Key Value는 Pair<Key,Value>가 된다. Pair는 Realm을 상속받아야하니 RealmPairKeyValue Class를 만든다. 다만 Key와 Value의 조합수만큼 RealmPairKeyValue를 만들어야된다.
  19. Null 추가 - 개발 당시의 Realm은 Null을 지원하지 않았음 -

    JSON을 저장하는 거라 없는 필드 때문에 Null 값을 저장할 필요가 있었음 - isNullField를 추가해서 Null 처리를 추가. 하지만 0.83 버전부터는 Null을 지원하기 떄문에 사용하지 않게 되었 습니다.
  20. - DTO 클래스와 Realm 클래스를 만들어야 함 - 두 클래스간의

    변환과 역변환 코드를 구현해야 함 - 변환 코드와 역변환 코드를 재귀적으로 변환해야 함 - Map은 리스트로 바꿔서 저장해야 함 - Null Check Field까지 구현해야 함
  21. APT - Annotation Processing Tool 의 약자 - Annotation을 참조하여

    코드를 생성할 수 있는 툴 - RealmProxy 객체도 이 툴을 이용해서 만들어진다
  22. APT의 장단점 - 장점: - 컴파일 타임에 코드를 생성함으로써 단순

    반복을 줄이거나 Reflection을 활용해야했던 구현들을 대체하는 등 언어의 한계 를 극복할 수 있음. - 단점: - APT로 컴파일 시간의 추가 - APT로 생성된 파일을 직접적으로 사용시 초기 빌드가 필요 - APT 빌드 실패시 원인을 알기 힘든 에러 - APT 사용하는 대표적인 프로젝트: Dagger, Realm, VCNC의 프로 젝트 등
  23. 결론 - 비트윈 3.0을 개발하면서 relation, 더 좋은 인터페이스를 지원하

    는 DB를 원하게 됨 - Realm이 우리의 필요성에 맞았다! - Realm을 도입하기 위해 데이터 모델의 구조를 바꿈 - 200여개의 모델에 수정사항이 너무나 많았음 - APT를 이용한 CodeGeneration을 사용해 문제 해결