<h1><center> Realm </center></h1> ###### tags: `💻 TIL` ###### date: `2024-07-0117:21:33.284Z` > [color=#724cd1][name=데릭] > [Sample_Project](https://github.com/derrickkim0109/Sample_Realm) # 개요 > 회사에서 번역 문구를 서버 API를 사용하는데 로컬에 저장하는 용도로 Realm을 사용하게 되었다. ## Realm **Realm은 Model로 struct를 제공하지 않는다.** > 그 이유는 Realm이 live객체를 중심으로 설계되었다는 점이다. 이 개념은 기본적으로 값 타입의 구조체와 호환되지 않는다. - 데이터의 실시간성: Realm은 데이터의 변경사항을 실시간으로 반영한다. - 반응형 API: 데이터 변화에 따라 반응하는 API를 제공한다. - 낮은 메모리 사용량: 메모리를 효율적으로 사용한다. - 작업의 성능: 높은 성능을 유지한다. - 부분 데이터에 대한 지연 및 저렴한 접근: 필요할 때만 데이터를 로드하여 메모리와 성능을 최적화함. - 데이터 직렬화/역직렬화 없음: 데이터를 직렬화하거나 역직렬화하지 않아도 된다. - 복잡한 객체 그래프 동기화: 복잡한 객체 간의 관계를 동기화하여 관리한다. ## 메모리 사용 및 스레드 **메모리 사용** > Realm은 데이터베이스와 상호작용을 최적화하여 메모리 사용을 최소화한다. Realm은 필요한 데이터를 메모리에 Lazy Loading 방식으로 로드하며, 데이터 객체가 사용되지 않으면 자동으로 해제된다. 이 접근 방식은 메모리 사용량을 줄이고, 앱의 성능을 향상시키는 데 도움이 된다고 함. - Lazy Loading: 데이터를 실제로 액세스할 때만 메모리에 로드 - 자동 갱신: Realm 객체는 항상 최신 상태를 유지하며, 데이터 변경 사항이 발생하면 자동으로 갱신 - caching: Realm은 동일한 쿼리에 대해 동일한 결과를 반환하여 중복된 데이터를 메모리에 여러 번 로드하지 않는다. - 인-메모리 Realm: 메모리에만 저장되는 Realm을 사용할 수 있다. 데이터가 영구 저장되지 않으며, 앱이 종료되면 데이터가 사라짐. **스레드** - 스레드 격리: Realm 객체는 생성된 스레드에서만 접근할 수 있다. 다른 스레드에서 접근하려면 해당 스레드에서 새로운 Realm 인스턴스를 생성해야 함. - 자동 갱신: Main Thread에서 RunLoop가 돌 때마다 자동으로 Realm을 갱신한다. 백그라운드 스레드에서는 -Realm.refresh() 메서드를 사용하여 수동으로 갱신할 수 있음 - 스레드 간 객체 전달: ThreadSafeReference를 사용하여 스레드 간에 안전하게 객체를 전달할 수 있음. 이는 객체의 참조를 안전하게 랩핑하고 다른 스레드에서 해제하여 사용할 수 있도록 함.