Swift: Core Data vs Realm

틀틀보·2025년 9월 13일

Swift

목록 보기
15/19

애플 플랫폼에서 사용되는 로컬 데이터베이스 기능을 사용하기 위한 기술

왜 사용할까?

파일 저장 방식을 사용할 경우

  • 저장 측면: 앱 내 Container에서 폴더로 분류한 후, 저장 날짜, 수정된 날짜 등등의 데이터를 폴더 등으로 분류해서 저장할 필요가 있음.

  • 불러오기 측면: 원하는 데이터를 찾기 위해 해당 폴더에 접근하고 일일이 비교해가며 찾는 일련의 과정이 필요(오래 걸림)

데이터베이스 방식을 사용할 경우

  • 구조화된 데이터: 데이터베이스는 미리 정의된 관계와 데이터 타입에 따라 데이터를 체계적으로 정리할 수 있음. 예를 들어, 사용자의 이름, 파일을 각각 다른 파일에 저장하는 기존 방법 대신 이 모든 정보를 하나의 User 객체로 데이터베이스에 저장 가능

  • 빠른 검색(쿼리): 특정 데이터를 매우 빠르고 효율적으로 검색이 가능해짐. 데이터베이스에서는 단 한 번의 쿼리로 특정 조건의 데이터를 수 밀리초 만에 작업 처리 가능.

  • 데이터 무결성: 데이터베이스는 데이터의 일관성과 유효성을 보장하는 데이터 무결성을 유지. 일련의 작업이 모두 성공하거나 모두 실패하도록 보장하는 트랜잭션(Transaction) 기능을 제공하여 데이터 손상이나 불완전한 저장을 방지

  • 뛰어난 성능: 데이터베이스는 고성능 읽기/쓰기 작업에 최적화되어 있음. 인덱싱 및 캐싱 기술을 활용하여 자주 사용되는 데이터에 대한 접근 속도를 크게 높여줌.

  • 확장성: 앱이 커지고 데이터의 양이 늘어나더라도, 데이터베이스는 효율적으로 확장할 수 있도록 설계되어 있고, 대규모 데이터셋을 원활하게 처리 가능.

Core Data

Apple이 제공하는 프레임워크로, macOS, iOS, iPadOSApple 플랫폼에서 객체 그래프를 관리하는 데 사용

⚠️ Database가 아닌 객체 그래프 관리 프레임워크

특징 및 장점

  • SQLite를 기반으로 동작

  • Apple 생태계 통합: iOS, macOSApple 플랫폼에 내장되어 있어 별도의 설치 없이 바로 사용 가능하며, SwiftUI와 같은 최신 프레임워크와 매끄럽게 연동

  • 객체 그래프 관리: 단순 데이터 저장을 넘어 객체 간 복잡한 관계(1-1, 1-N 등)를 효과적으로 모델링하고 관리 가능

  • 강력한 기능: 데이터 버전 관리 및 마이그레이션, 변경 사항 추적(undo/redo), 백그라운드 데이터 처리, iCloud 동기화 등 기능 제공

  • 메모리 효율성: 데이터를 메모리에 올릴 때 필요한 만큼만 로드하는 Faulting 매커니즘을 통해 대규모 데이터셋에서도 메모리를 효율적으로 사용

Faulting

관계된 객체를 실제로 접근하기 전까지는 메모리에 올리지 않는 Fault 상태로 두는 것

단점

  • 학습 어려움: 설정 복잡, 이해해야 할 개념이 많음.

  • 스레드 처리의 어려움: 멀티스레딩 환경에서 데이터를 안전하게 다루기 위해서 NSManagedObjectContext를 스레드별로 관리해야 하는 등의 처리 필요

  • 상대적 속도: 객체-관계 매핑(ORM) 과정과 내부적인 처리 오버헤드로 인해 순수 데이터베이스인 Realm에 비해 읽기/쓰기 속도가 느릴 수 있음.

  • 코드 길이: 데이터 모델을 생성하고 상호작용하기 위해 작성해야 하는 코드의 양이 상대적으로 많음.

추후 정보 글 작성 예정

Realm

모바일 환경을 위해 처음부터 설계된 객체 지향 데이터베이스

특징 및 장점

  • 자체적인 C++ 엔진 위에서 동작

  • 크로스 플랫폼 지원: 크로스 플랫폼을 지원하여 iOSAndroid 간 데이터 모델과 로직 공유 가능 + React Nativie, Xamarin도 가능

  • 빠른 속도: Zero-copy 아키텍처를 채택하여 데이터 직렬화/역직렬화 과정 없이 디스크에 저장된 데이터에 직접 접근하므로 Core DataSQLite보다 월등히 빠른 성능

  • 쉬운 사용: 직관적이고 간결한 API를 제공하여 배우기 쉽고, 적은 양의 코드로 데이터베이스 작업 가능

  • 실시간 객체: Realm 객체는 항상 최신 데이터를 반영하는 라이브 객체로 데이터가 변경되면 해당 객체를 사용하는 모든 곳에 자동으로 변경 사항이 전파되어 데이터 동기화에 유리

단점

  • 외부 라이브러리 의존성: 서드파티 라이브러리이므로 프로젝트에 별도로 추가해야 하며, 이로 인해 앱의 용량이 소폭 증가

  • 스레드 제약: Realm 객체는 생성된 스레드 내에서만 접근할 수 있다는 엄격한 스레드 규칙이 있어 다른 스레드로 객체를 전달하려면 별도의 처리 필요

  • 제한적인 쿼리: 복잡하고 정교한 쿼리는 지원하지 않을 수 있으며, SQL을 직접 사용할 수 없음.

  • 버전 대응: Realm 버전이 업데이트 될 때마다 변경사항에 대해 대응이 필요할 수 있음.

추후 정보 글 작성 예정

뭘 사용해야 할까?

Core Data

  • Cloud 동기화로 여러 Apple기기에서의 동기화가 필요할 때

  • 외부 라이브러리 의존성을 피하고 싶을 때

  • 객체 간의 관계가 앱의 핵심이며, 연쇄 삭제 등 관계 무결성을 위한 세밀한 규칙을 프레임워크 수준에서 관리하고 싶을 때

Realm

  • 데이터 읽기/쓰기 속도가 중요할 때

  • 크로스플랫폼이 지원이 필요할 때

  • 빠른 개발과 쉬운 유지보수가 필요할 때

참고
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/

https://stackshare.io/stackups/coredata-vs-realm

profile
안녕하세요! iOS 개발자입니다!

0개의 댓글