[iOS] Core Data vs Realm

2025. 2. 1. 18:03iOS

반응형

iOS에서 데이터를 영구적으로 저장하는 대표적인 방법으로 Core DataRealm이 있습니다. 두 기술 모두 로컬 데이터베이스 역할을 하지만, 구현 방식과 장단점이 다릅니다. 각각 자세히 설명해 드리겠습니다.


1. Core Data

개요

Core Data는 Apple에서 제공하는 객체 그래프 관리 및 영속성 저장(Persistence Storage) 프레임워크입니다. 단순한 데이터 저장소가 아니라, 객체 간 관계를 관리하고, 변경 사항을 추적하며, 성능 최적화를 위한 기능들을 제공합니다.

특징

  • 객체 그래프 관리: 엔터티 간 관계를 쉽게 정의하고 관리할 수 있습니다.
  • 자동 저장 및 롤백 지원: 변경 사항을 추적하고, 자동으로 저장하거나 되돌릴 수 있습니다.
  • NSPersistentContainer 지원: iOS 10 이후부터 NSPersistentContainer를 통해 Core Data 스택을 쉽게 설정할 수 있습니다.
  • NSFetchedResultsController 제공: UI와 데이터를 쉽게 연동할 수 있도록 도와줍니다.
  • SQL 기반: 내부적으로 SQLite를 사용하지만, SQL을 직접 다루지 않고 객체를 통해 조작합니다.

구조

Core Data의 기본적인 구성 요소는 다음과 같습니다.

  1. NSManagedObjectModel: 데이터 모델을 정의하는 객체 (Xcode의 .xcdatamodeld 파일)
  2. NSPersistentStoreCoordinator: 데이터 저장소와 연결하는 역할
  3. NSManagedObjectContext: 데이터의 CRUD(Create, Read, Update, Delete) 작업을 수행하는 객체
  4. NSManagedObject: Core Data에서 관리하는 실제 엔터티 객체

코드 예제

import CoreData
import UIKit

// Core Data 스택을 관리하는 클래스
class CoreDataManager {
    static let shared = CoreDataManager()
    let persistentContainer: NSPersistentContainer

    private init() {
        persistentContainer = NSPersistentContainer(name: "MyAppModel")
        persistentContainer.loadPersistentStores { _, error in
            if let error = error {
                fatalError("Core Data 로드 실패: \(error)")
            }
        }
    }

    var context: NSManagedObjectContext {
        return persistentContainer.viewContext
    }
}

// 데이터 저장
func saveData(name: String) {
    let context = CoreDataManager.shared.context
    let newUser = User(context: context)
    newUser.name = name

    do {
        try context.save()
    } catch {
        print("저장 실패: \(error)")
    }
}

// 데이터 가져오기
func fetchData() -> [User] {
    let context = CoreDataManager.shared.context
    let fetchRequest: NSFetchRequest<User> = User.fetchRequest()

    do {
        return try context.fetch(fetchRequest)
    } catch {
        print("데이터 불러오기 실패: \(error)")
        return []
    }
}

장점

✅ Apple 공식 지원으로 안정적입니다.
✅ NSFetchedResultsController를 사용하면 UI 업데이트가 편리합니다.
✅ 데이터 모델과 관계 설정이 직관적입니다.
✅ SQL을 직접 다루지 않아도 됩니다.

단점

❌ 설정이 복잡하고 학습 곡선이 높습니다.
❌ SQLite를 직접 사용하는 것보다 성능이 느릴 수 있습니다.
❌ 멀티 스레딩 환경에서 충돌 관리가 까다롭습니다.


2. Realm

개요

Realm은 Core Data와 달리 독립적인 모바일 데이터베이스로, SQLite 기반이 아닌 자체 DB 엔진을 사용합니다. Core Data보다 속도가 빠르고, 문법이 간단하여 사용하기 쉽습니다.

특징

  • 객체 지향적인 데이터베이스: 클래스를 직접 데이터 모델로 사용할 수 있습니다.
  • 빠른 성능: Core Data보다 속도가 빠릅니다. (메모리 기반 설계)
  • 멀티 스레딩 지원: 스레드 간 데이터 공유가 용이합니다.
  • 자동 업데이트: 데이터 변경을 UI에 쉽게 반영할 수 있습니다.

구조

Realm의 기본적인 구성 요소는 다음과 같습니다.

  1. Realm 파일: .realm 확장자를 가진 데이터 파일
  2. Realm Object: 데이터를 저장하는 모델 (클래스로 정의)
  3. Realm Database: 객체를 저장하는 저장소

코드 예제

 
import RealmSwift

// 모델 정의
class User: Object {
    @Persisted var name: String
}

// 데이터 저장
func saveData(name: String) {
    let realm = try! Realm()
    let user = User()
    user.name = name

    try! realm.write {
        realm.add(user)
    }
}

// 데이터 가져오기
func fetchData() -> [User] {
    let realm = try! Realm()
    return Array(realm.objects(User.self))
}

장점

✅ Core Data보다 설정이 간단합니다.
✅ 속도가 빠릅니다. (메모리 기반 DB)
✅ 멀티 스레딩 지원이 좋습니다.
✅ JSON 지원 및 서버 동기화 기능을 제공합니다.

단점

❌ Apple 공식 지원이 아닙니다.
❌ DB 파일 크기가 비교적 큽니다.
❌ SQL을 지원하지 않아 복잡한 쿼리 작성이 어렵습니다.


3. Core Data vs Realm 비교

항목Core DataRealm

개발사 Apple Realm (MongoDB)
저장 방식 SQLite 기반 자체 엔진
성능 상대적으로 느림 빠름
설정 난이도 복잡함 쉬움
데이터 모델링 관계형 데이터 모델 지원 단순한 객체 모델
멀티 스레딩 관리가 어려움 안정적
파일 크기 상대적으로 작음 비교적 큼
지원 기능 NSFetchedResultsController, Undo, Rollback JSON 지원, 클라우드 동기화

4. 언제 Core Data, 언제 Realm을 사용할까요?

Core Data를 사용하는 경우

  • Apple 공식 프레임워크를 사용하고 싶을 때
  • 데이터 간 복잡한 관계를 관리해야 할 때
  • UI와 연동이 중요한 앱을 개발할 때

Realm을 사용하는 경우

  • 빠른 성능이 필요한 경우
  • 멀티 스레딩 환경에서 안정적인 데이터 관리가 필요할 때
  • 설정이 간편한 데이터베이스를 원할 때

결론

Core Data는 Apple이 제공하는 강력한 데이터 관리 프레임워크이지만, 설정이 복잡하고 성능이 다소 떨어질 수 있습니다. 반면 Realm은 빠르고 사용하기 쉬운 반면, Apple 공식 지원이 아니라는 점에서 장단점이 있습니다.

어떤 기술을 선택할지는 프로젝트의 규모와 요구사항에 따라 달라질 수 있습니다.

  • 대규모 데이터 & 관계형 모델이 필요하면 Core Data
  • 빠르고 간단한 로컬 DB가 필요하면 Realm
반응형

'iOS' 카테고리의 다른 글

[iOS] ILClassificationResponse  (1) 2025.02.03
[iOS] Performance Trace란?  (0) 2025.02.01
[Swift] Optional  (0) 2025.02.01
[iOS] HTTPCookieStorage와 WKHTTPCookieStore 차이  (0) 2025.01.30
[iOS] 웹뷰(WebView)기반 앱 개발 시 주의할 점  (2) 2025.01.30