오늘도 더 나은 코드를 작성하였습니까?

Realm (Kotlin) 본문

kotlin Multiplatform/realm-kotlin-kmm

Realm (Kotlin)

hik14 2022. 7. 22. 14:53

Realm 데이터베이스 반응형,  객체 지향, 크로스 플랫폼 모바일 데이터베이스입니다.

 

Reactive: 데이터의 현재 상태를 쿼리하고 쿼리 결과와 같은 상태 변경 또는 단일 개체에 대한 변경 사항을 구독합니다.

Object-oriented: 데이터를 행, 문서 또는 열이 아닌 객체로 구성

Cross-platform: iOS, Android, Linux, macOS 또는 Windows에서 동일한 데이터베이스를 사용합니다. 

 

Realm은 SQLite 그리고 Core Data

Database Internals

Realm 데이터베이스는  유니크한 데이터베이스 엔진, 파일 형식 및 디자인을 사용한다.

Native Database Engine

Realm 데이터베이스는 SQLite와 같은 기본 데이터베이스 엔진 위에 구축하는 것과 달리 C++로 처음부터 작성된 완전한 데이터베이스

Realm 데이터베이스의 nderlying storage layerB+ tree 객체를 구성

Realm 데이터베이스는 storage 수준에서 access 수준까지 최적화를 제어

 

Realm 데이터베이스는 Realm에 데이터(서로 다른 realm Objects의 Collection을)를 저장합니다.

각 Realm을 데이터베이스로 생각할 수 있습니다.

realm 각 objects 는 SQL 데이터베이스 테이블 또는 MongoDB 문서의 행과 동일합니다.

SQL과 달리 realm은 서로 다른 Object 유형을 개별 테이블로 분리하지 않고 하나의 파일에 생성할 수 있습니다.

 

Realm 데이터베이스는 객체를  groups of property values으로 저장합니다., 열 기반 스토리지라고 합니다.

즉, 개별 객체에 대한 쿼리 또는 쓰기는 인덱싱되지 않은 경우 행 기반 스토리지보다 느릴 수 있지만,

 여러 객체에 걸쳐 단일 필드를 쿼리하거나 여러 개체를 가져오는 것은 공간적 지역성과 CPU 내 벡터 작업으로 인해 훨씬 더 빠릅니다.

 

Realm 데이터베이스는 a zero-copy design는 ORM보다 빠르게 만들고 원시 SQLite보다 빠른 경우가 많습니다.

 

*zero-copy

CPU가 한 메모리 영역에서 다른 메모리 영역으로 데이터를 복사하는 작업을 수행하지 않거나 불필요한 데이터 복사를 피하는 컴퓨터 작업

Realm Files

Realm 데이터베이스는 device 저장소에 있는 realm file에 데이터를 유지합니다. 데이터베이스는 여러 종류의 파일을 사용합니다.

xxx.realm 파일 

-  객체 데이터를 보관

 

.xxxrealm.lock(잠금 파일)  

- realm에서 어떤 버전의 데이터가 활발하게 사용 중인지 추적한다.

- 이렇게 하면 realm 클라이언트 응용 프로그램(APP)에서 사용 중인 storage을 회수하지 못하도록 합니다.

 

.xxxrealm.memo (메모 파일)

- Thread 간 및 Process 간 notifications을 관리한다.


xxx.realm.management

- 내부 상태 관리

 

Realm 파일에는

group, table, cluster tree 및 cluster 와 같은 데이터 구조의 객체 데이터가 포함되어 있습니다

Realm 데이터베이스는 이러한 데이터 구조를 다음 형식의 트리 구조로 구성합니다.

 

- 최상위 수준은 (객체 메타데이터, 트랜잭션 로그 및 테이블 모음)을 저장한다.
- realm 스키마의 각 클래스는 최상위 그룹 내의 테이블에 해당합니다.
- 테이블은 B+ 트리의 구현인 클러스터 트리를 포함합니다.

- 클러스터 트리의 노드를 클러스터라고 합니다.

- 각 클러스터은 키 값으로 정렬된 객체 범위를 포함합니다.
- 클러스터는 객체를 열 컬렉션으로 저장합니다.


각 열에는 지정된 개체의 여러 인스턴스에 대한 단일 속성에 대한 데이터가 포함됩니다. 열은 균일한 크기의 값을 갖는 데이터 배열입니다.
열은 1, 2, 4, 8, 16, 32 또는 64비트 크기 중 하나로 데이터를 저장합니다. 각 열은 가장 큰 값으로 결정되는 하나의 값 크기를 사용합니다.

 

포인터는 메모리 주소를 참조하므로 영구 파일에 작성된 객체는 참조를 포인터로 저장할 수 없습니다. 

Realm 파일은 파일 시작 부분의 오프셋을 사용하여 데이터를 참조합니다. 우리는 이것을 ref라고 부릅니다.

Realm 데이터베이스는 메모리 매핑을 사용하여 데이터를 읽고 쓰기 때문에 데이터베이스 작업은 데이터베이스 구조를 탐색할 때 오프셋에서 메모리 포인터로 이러한 참조를 변환합니다.

 

Copy-on-Write: 데이터 버전 관리의 비밀 소스

Realm 데이터베이스는 기록 중 복사(copy-on-write)라는 기술을 사용합니다. 

이 기술은 디스크의 이전 데이터를 덮어쓰는 대신 모든 쓰기 작업에 대해 데이터를 디스크의 새 위치에 복사합니다.

데이터의 새 복사본이 완전히 작성되면 데이터베이스는 해당 데이터에 대한 기존 참조를 업데이트합니다

이전 데이터는 더 이상 참조되지 않거나 클라이언트 애플리케이션에서 적극적으로 사용하지 않는 경우에만 가비지 수집됩니다.

 

copy-on-write로 인해 해당 복사본의 모든 참조가 여전히 다른 유효한 데이터를 가리키기 때문에 데이터의 이전 복사본이 유효한 상태로 유지됩니다. 

 

Realm 데이터베이스는 이 사실을 활용하여 클라이언트 애플리케이션의 여러 스레드에 동시에 여러 버전의 데이터를 제공합니다.

 

데이터 새로고침 ----> UI Looper Thread 다시 그리기

대규모 쓰기 작업과 같이 백그라운드 스레드에서 더 오래 실행되는 프로시저는 변경 사항을 커밋하기 전에 더 오랜 기간 동안 단일 버전의 데이터로 작업할 수 있습니다.

Memory Mapping

write는 메모리 매핑을 이용한다.


메모리에서 스토리지로 데이터를 앞뒤로 복사하는 것을 방지합니다.

접근자와 돌연변이자는 메모리 매핑을 통해 디스크를 읽고 씁니다. 결과적으로 객체 데이터는 앱의 스택이나 힙에 저장되지 않습니다.

기본적으로 데이터는 우발적인 쓰기를 방지하기 위해 읽기 전용으로 메모리 매핑됩니다.

Realm 데이터베이스는 운영 체제 수준의 페이징을 사용하여 각 운영 체제가 단일 라이브러리가 자체적으로 수행할 수 있는 것보다 더 나은 메모리 매핑 및 지속성을 구현하도록 신뢰합니다.

Compaction

Realm 데이터베이스는 데이터베이스 쓰기 후에 더 이상 필요하지 않은 여유 공간을 자동으로 재사용합니다. 그러나 Realm에 저장된 데이터 양이 크게 줄어들더라도 Realm 파일은 자동으로 축소되지 않습니다.

Realm을 압축하여 저장 공간을 최적화하고 가능한 경우 파일 크기를 줄이십시오.

Realm 최적의 크기로 유지하려면 가끔 Realm을 압축해야 합니다. 이 작업은 수동으로 수행하거나 시작 시 압축하도록Realm을 구성하여 수행할 수 있습니다. 그러나 Realm 데이터베이스는 향후 쓰기를 위해 사용하지 않은 공간을 회수하므로 압축은 장치의 공간을 절약하기 위한 최적화일 뿐입니다.

ACID 준수

커밋된 모든 쓰기 작업이 유효함을 보장하고 시스템 충돌 시 클라이언트가 일시적인 상태를 볼 수 없습니다. Realm 데이터베이스는 다음 디자인 선택으로 ACID를 준수합니다.

원자성: 트랜잭션의 작업을 그룹화하고 하나라도 실패하면 트랜잭션의 모든 작업을 롤백합니다.

 

일관성: 스키마에 대한 변경 사항의 유효성을 검사하여 데이터 손상을 방지합니다.

쓰기 작업의 결과가 유효하지 않으면 Realm은 전체 트랜잭션을 취소하고 롤백합니다.

격리: 한 번에 하나의 작성자만 허용합니다. 이것은 트랜잭션 간의 스레드 안전성을 보장합니다.

내구성: 트랜잭션이 커밋되면 즉시 디스크에 씁니다. 예를 들어 앱이 충돌하는 경우 변경 사항이 손실되거나 손상되지 않습니다.

'kotlin Multiplatform > realm-kotlin-kmm' 카테고리의 다른 글

Realm Kotlin Create  (0) 2022.07.25
Realm Transaction  (0) 2022.07.25
Realm kotlin scheme  (0) 2022.07.25
Realm kotlin schem(Data Type)  (0) 2022.07.25
Frozen Architecture - Kotlin SDK  (0) 2022.07.25