
애플 플랫폼에서 사용되는 로컬 데이터베이스 기능을 사용하기 위한 기술
저장 측면: 앱 내 Container에서 폴더로 분류한 후, 저장 날짜, 수정된 날짜 등등의 데이터를 폴더 등으로 분류해서 저장할 필요가 있음.
불러오기 측면: 원하는 데이터를 찾기 위해 해당 폴더에 접근하고 일일이 비교해가며 찾는 일련의 과정이 필요(오래 걸림)
구조화된 데이터: 데이터베이스는 미리 정의된 관계와 데이터 타입에 따라 데이터를 체계적으로 정리할 수 있음. 예를 들어, 사용자의 이름, 파일을 각각 다른 파일에 저장하는 기존 방법 대신 이 모든 정보를 하나의 User 객체로 데이터베이스에 저장 가능
빠른 검색(쿼리): 특정 데이터를 매우 빠르고 효율적으로 검색이 가능해짐. 데이터베이스에서는 단 한 번의 쿼리로 특정 조건의 데이터를 수 밀리초 만에 작업 처리 가능.
데이터 무결성: 데이터베이스는 데이터의 일관성과 유효성을 보장하는 데이터 무결성을 유지. 일련의 작업이 모두 성공하거나 모두 실패하도록 보장하는 트랜잭션(Transaction) 기능을 제공하여 데이터 손상이나 불완전한 저장을 방지
뛰어난 성능: 데이터베이스는 고성능 읽기/쓰기 작업에 최적화되어 있음. 인덱싱 및 캐싱 기술을 활용하여 자주 사용되는 데이터에 대한 접근 속도를 크게 높여줌.
확장성: 앱이 커지고 데이터의 양이 늘어나더라도, 데이터베이스는 효율적으로 확장할 수 있도록 설계되어 있고, 대규모 데이터셋을 원활하게 처리 가능.
Apple이 제공하는 프레임워크로, macOS, iOS, iPadOS 등 Apple 플랫폼에서 객체 그래프를 관리하는 데 사용
⚠️ Database가 아닌 객체 그래프 관리 프레임워크
SQLite를 기반으로 동작
Apple 생태계 통합: iOS, macOS 등 Apple 플랫폼에 내장되어 있어 별도의 설치 없이 바로 사용 가능하며, SwiftUI와 같은 최신 프레임워크와 매끄럽게 연동
객체 그래프 관리: 단순 데이터 저장을 넘어 객체 간 복잡한 관계(1-1, 1-N 등)를 효과적으로 모델링하고 관리 가능
강력한 기능: 데이터 버전 관리 및 마이그레이션, 변경 사항 추적(undo/redo), 백그라운드 데이터 처리, iCloud 동기화 등 기능 제공
메모리 효율성: 데이터를 메모리에 올릴 때 필요한 만큼만 로드하는 Faulting 매커니즘을 통해 대규모 데이터셋에서도 메모리를 효율적으로 사용
관계된 객체를 실제로 접근하기 전까지는 메모리에 올리지 않는
Fault상태로 두는 것
학습 어려움: 설정 복잡, 이해해야 할 개념이 많음.
스레드 처리의 어려움: 멀티스레딩 환경에서 데이터를 안전하게 다루기 위해서 NSManagedObjectContext를 스레드별로 관리해야 하는 등의 처리 필요
상대적 속도: 객체-관계 매핑(ORM) 과정과 내부적인 처리 오버헤드로 인해 순수 데이터베이스인 Realm에 비해 읽기/쓰기 속도가 느릴 수 있음.
코드 길이: 데이터 모델을 생성하고 상호작용하기 위해 작성해야 하는 코드의 양이 상대적으로 많음.
추후 정보 글 작성 예정
모바일 환경을 위해 처음부터 설계된 객체 지향 데이터베이스
자체적인 C++ 엔진 위에서 동작
크로스 플랫폼 지원: 크로스 플랫폼을 지원하여 iOS와 Android 간 데이터 모델과 로직 공유 가능 + React Nativie, Xamarin도 가능
빠른 속도: Zero-copy 아키텍처를 채택하여 데이터 직렬화/역직렬화 과정 없이 디스크에 저장된 데이터에 직접 접근하므로 Core Data나 SQLite보다 월등히 빠른 성능
쉬운 사용: 직관적이고 간결한 API를 제공하여 배우기 쉽고, 적은 양의 코드로 데이터베이스 작업 가능
실시간 객체: Realm 객체는 항상 최신 데이터를 반영하는 라이브 객체로 데이터가 변경되면 해당 객체를 사용하는 모든 곳에 자동으로 변경 사항이 전파되어 데이터 동기화에 유리
외부 라이브러리 의존성: 서드파티 라이브러리이므로 프로젝트에 별도로 추가해야 하며, 이로 인해 앱의 용량이 소폭 증가
스레드 제약: Realm 객체는 생성된 스레드 내에서만 접근할 수 있다는 엄격한 스레드 규칙이 있어 다른 스레드로 객체를 전달하려면 별도의 처리 필요
제한적인 쿼리: 복잡하고 정교한 쿼리는 지원하지 않을 수 있으며, SQL을 직접 사용할 수 없음.
버전 대응: Realm 버전이 업데이트 될 때마다 변경사항에 대해 대응이 필요할 수 있음.
추후 정보 글 작성 예정
Cloud 동기화로 여러 Apple기기에서의 동기화가 필요할 때
외부 라이브러리 의존성을 피하고 싶을 때
객체 간의 관계가 앱의 핵심이며, 연쇄 삭제 등 관계 무결성을 위한 세밀한 규칙을 프레임워크 수준에서 관리하고 싶을 때
데이터 읽기/쓰기 속도가 중요할 때
크로스플랫폼이 지원이 필요할 때
빠른 개발과 쉬운 유지보수가 필요할 때
참고
https://developer.apple.com/documentation/coredata
https://github.com/realm/realm-swift
https://www.rockersinfo.com/realm-database-vs-core-data-what-is-best-for-android-ios/