[일단기록] 안드로이드 로컬 스토리지 고민

kjoo0·2024년 6월 29일
0

일단기록

목록 보기
3/10
post-thumbnail

채팅 데이터를 저장할 안드로이드 로컬 스토리지 db 고민

realm

  • 매우 빠른 읽기/쓰기 성능
  • 직관적인 API
  • 관계형 데이터 모델링 지원(복잡한 쿼리 가능)
  • 데이터 모델 정의 필요

SQLite

  • 널리 사용되고 검증된 기술
  • 관계형 데이터베이스(복잡한 쿼리 가능)
  • 외부 라이브러리 설치 필요

WatermelonDB

  • 실시간 동기화
  • 매우 빠른 성능
  • 관계형 데이터 모델 지원(복잡한 쿼리 가능)

그 중에서도 Realm을 선택한 이유

현재 우리가 저장할 데이터는 채팅 데이터로, 모든 채팅 데이터를 fcm으로 수신하면 바로 저장하고, 소켓 연결 시 안 읽음 / 읽음 처리를 위해 로컬 스토리지에서 조회하는 빠른 읽기 쓰기 성능이 필요합니다.

읽기 기능에서 Realm은 메모리 매핑을 통해 데이터에 직접 접근하기 때문에 SQLite보다 읽기 성능이 뛰어납니다. 채팅방에 들어갔을 때 사용자에게 데이터를 조회해서 주는 기능, 소켓에 연결되었을 때 서버에서 읽음 처리를 위해 데이터 조회에 유리합니다.

Realm의 내부 데이터 구조와 메모리 관리

Realm의 내부 데이터 구조는 전통적인 B-트리와 같은 데이터베이스 구조와 다릅니다. 대신, Realm은 "Zero-copy" 설계와 메모리 매핑 방식을 사용하여 성능을 최적화합니다. 이를 통해 데이터 접근 속도를 크게 향상시키고, 데이터 수정이 빈번할 때도 높은 성능을 유지합니다. 다음은 Realm의 내부 구조와 메모리 관리 기법에 대한 설명입니다.

주요 특징

  1. Column-oriented Storage (컬럼 지향 저장 방식):

    • Realm은 데이터를 컬럼 지향 방식으로 저장합니다. 이는 데이터베이스의 모든 컬럼을 별도의 연속적인 메모리 블록에 저장하는 방식입니다. 이를 통해 특정 컬럼에 대한 연산을 매우 빠르게 수행할 수 있습니다.
    • 예를 들어, 모든 사용자 이름을 조회할 때, Realm은 사용자 이름이 저장된 연속적인 메모리 블록만을 읽으면 됩니다.
  2. Zero-copy Design (제로-카피 설계):

    • Realm은 데이터를 복사하지 않고, 메모리 매핑을 통해 직접 접근합니다. 이를 통해 데이터 접근과 수정 시의 오버헤드를 줄일 수 있습니다.
    • 이는 데이터베이스가 메모리 상에 직접 매핑되어 있어, 파일 시스템 I/O 비용을 최소화합니다.
  3. MVCC (Multiversion Concurrency Control):

    • Realm은 MVCC를 사용하여 동시성을 관리합니다. 이를 통해 다중 쓰레드가 동시에 데이터에 접근하고 수정할 수 있으며, 각 쓰레드는 자체적인 데이터 스냅샷을 가집니다.
    • 트랜잭션 간의 충돌을 방지하며, 데이터 일관성을 유지합니다.
  4. Dynamic Queries and Lazy Loading:

    • Realm은 쿼리 실행 시 모든 데이터를 메모리에 로드하지 않고, 필요한 데이터만을 동적으로 로드합니다. 이를 통해 메모리 사용량을 최적화하고, 불필요한 데이터 로딩을 방지합니다.
  5. Efficient Indexing:

    • Realm은 각 컬럼에 대해 인덱스를 효율적으로 관리합니다. 인덱스는 B-트리와 유사한 방식으로 구현되지만, 메모리 매핑과 제로-카피 설계로 인해 성능이 향상됩니다.

요약

Realm의 성능이 뛰어난 이유는 그 내부 데이터 구조와 메모리 관리 기법에 있습니다. 컬럼 지향 저장 방식, 제로-카피 설계, MVCC, 동적 쿼리 및 지연 로딩, 효율적인 인덱싱 등이 결합되어, 높은 읽기/쓰기 성능과 동시성 관리를 제공합니다. 이러한 설계는 특히 모바일 환경에서의 데이터베이스 성능을 극대화하는 데 기여합니다.

SQLite vs RealM

profile
티스토리 이사 준비 중..

0개의 댓글