Meetup1511 apt vcnc

Between 사용 사례: APT를 활용한 Realm 마이그레이션

많은 사용자들의 사랑을 받는 Between도 Realm을 사용합니다. APT를 활용하여 Realm으로 마이그레이션한 Between의 사용 사례를 VCNC의 김상일님이 Realm 사용자 모임에서 공유합니다.

Between은 Realm으로 이주하기 전에 이미 많은 DTO 객체를 가지고 있었고 그 객체들은 특정 시점의 데이터를 가지고 있어야 한다는 제약이 있었습니다. 비동기 Realm이 추가되기 전에 스레드를 넘어 데이터를 공유해야 하는 제약들도 있었고요. 이런 제약들을 어떻게 손쉽게 해결할 수 있을까요? Between은 해당 문제를 어노테이션 프로세싱을 사용하여 Realm 객체와 DTO 객체의 간극을 매꾸는 시도를 하였습니다. 이 시도를 통해 현재의 자료구조의 최소한의 변경으로 요구사항을 쉽게 달성하는 법을 알아봅니다.


APT를 활용한 Realm으로의 마이그레이션

VCNC 김상일님의 10월 23일 Realm Seoul 사용자 모임 발표 입니다.

이런 개발 뉴스를 더 만나보세요

Between 앱에 Realm을 도입한 배경과, 많은 모델을 담고 있던 SQLite 내부의 데이터를 Realm으로 마이그레이션하면서 발생한 문제점, APT를 활용한 코드 자동 생성 방법을 포함한 Realm 사용 사례를 발표해 주셨습니다.

Realm 소개

  • Mobile Database
  • ACID 지원
  • Relation의 지원
  • 객체/모델 지향으로 인한 편리성
  • 빠른 속도의 데이터베이스

Realm을 사용하게 된 이유

  • Between이 3.0 업데이트되면서 Relationship이 더욱 복잡해짐
  • 기존 비트윈 데이터베이스는 Sqlite를 사용함
    • Relationship이 없으므로 Table마다 데이터를 중복 저장함
    • Action마다 각 Table에 변경 사항을 직접 반영해주는 코드 작성이 필요해짐
  • Relationship도 지원하고 ORM like 한 좋은 인터페이스를 가진 Realm 도입을 결정

Realm을 사용할 때 주의했던 점

  • RealmObject는 DAO(Data Access Object) 객체
    • 객체의 스레드간 전달 불가
    • 원하는 시점이 아닌 특정 시점에 값이 변화할 수 있음
    • 내부에 hasKey, toString 등 추가 함수 정의가 안됨
    • 디버깅할 때 값을 볼 수 없음

데이터 모델 변화 방안 및 주의사항

  • 새로운 DTO 정의
    • 내부에 함수 정의 가능
    • 특정 시점에 값이 바뀌어도 이전 값 유지
    • 스레드 간에 값을 전달할 수 있음
  • DTO로 변환하는 과정에서의 주의 사항
    • DTO를 RealmObject로 Convert 해야 하므로 Recursive 한 변환 필요
    • 내부 필드가 있는 경우 재귀적인 변환 필요
    • Enum을 추가함
    • Map을 RealmList로 변환해서 저장, 이때 Key와 Value의 조합 수만큼 RealmPairKeyValue를 생성
    • 0.83 버전 이전에서 개발했기 때문에 Null도 추가함
  • 구현해야 할 모델들이 약 200개라서 DTO 변환 작업이 너무 많았음

Code generation(APT)를 이용한 해결 방안

  • APT
    • Annotation Processing Tool
    • Annotation을 참조해서 코드를 만들어 내는 도구
    • ReamlProxy 객체도 이 도구를 사용함
  • APT Code Generate는 JavaPoet을 이용함
  • APT의 장점
    • 컴파일 타임에 코드를 생성해서 단순 반복을 줄임
    • Reflection 활용 구현을 대체하여 언어의 한계를 극복할 수 있음
  • APT의 단점
    • APT로 컴파일 시간이 추가됨
    • 생성된 파일을 직접 사용 시 초기 빌드가 필요함
    • APT 빌드 실패시 에러 원인을 찾기 힘듦
  • APT 사용 프로젝트: Dagger, Realm, VCNC의 프로젝트 등

결론

  • 비트윈 3.0을 개발하면서 Relation과 더 나은 인터페이스를 지원하는 DB를 원하게 되었고 Realm이 이에 적합하였음
  • Realm의 도입을 위해 데이터 모델 구조를 바꿈
  • 200여 개의 모델에 수정할 사항이 너무 많았음
  • APT를 이용한 CodeGeneration을 사용해 문제를 해결함

컨텐츠에 대하여

이 컨텐츠는 저자의 허가 하에 이곳에서 공유합니다.

Realm Team

Realm의 미션은 더 나은 앱을 빠르게 개발할 수 있도록 돕는 것입니다. 이를 위해 저희는 개발자들이 실시간 협업, 가상 현실, 라이브 데이터 동기화, 오프라인 경험, 메시징 등 정교하고 강력한 기능을 쉽게 개발할 수 있도록 하는 개발 도구와 플랫폼을 제공하고 있습니다.

저희는 모바일 인터넷이 수많은 사용자와 보다 많은 디바이스가 속한 개방형 네트워크와 이들 간의 실시간 상호 작용으로 진화할 것이라고 믿으며, 개발자가 이같은 방향으로 발전할 수 있도록 돕기 위해 저희 제품들을 개발하고 있습니다.

4 design patterns for a RESTless mobile integration »

close