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

realm case study VCNC

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.
Avatar for Realm Realm
November 25, 2015

realm case study VCNC

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

Avatar for Realm

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을 사용해 문제 해결