[swift] RxSwift와 Realm의 연동 방법

RxSwift와 Realm은 각각 Reactive Programming과 데이터베이스 기능을 제공하는 라이브러리입니다. 이들을 함께 사용하면 앱을 더 효율적이고 반응적으로 개발할 수 있습니다. 이번 블로그 포스트에서는 RxSwift와 Realm을 연동하는 방법에 대해 알아보겠습니다.

1. RxSwift와 Realm 설치하기

먼저 RxSwift와 Realm을 프로젝트에 설치해야 합니다. 이를 위해 CocoaPods나 Carthage를 사용할 수 있습니다. 먼저 터미널에서 해당 프로젝트 디렉토리로 이동한 다음 다음 명령어를 사용하여 의존성을 추가합니다.

CocoaPods 사용시:

pod 'RxSwift'
pod 'RxRealm'
pod 'RealmSwift'

설치가 완료되면 import 문을 사용하여 RxSwift와 Realm을 프로젝트에 가져올 수 있습니다.

Carthage 사용시:

Carthage를 통해 RxSwift와 Realm을 설치하고자 하는 경우, Cartfile에 다음과 같이 기록하고 carthage update 명령어를 실행합니다:

github "ReactiveX/RxSwift"
github "realm/realm-cocoa"

2. Observable로 Realm 데이터 다루기

Realm은 기본적으로 blocking I/O를 사용합니다. 하지만 RxSwift를 통해 비동기적으로 데이터를 다룰 수 있도록 할 수 있습니다.

import RealmSwift
import RxSwift
import RxRealm

class ViewModel {
    let disposeBag = DisposeBag()
    
    init() {
        let realm = try! Realm()
        
        let results = realm.objects(Task.self)
            .sorted(byKeyPath: "createdAt", ascending: true)
            .asObservable()
        
        results
            .subscribe(onNext: { tasks in
                // tasks를 UI에 업데이트하는 로직 구현
            })
            .disposed(by: disposeBag)
    }
}

위의 예제에서는 Realm의 objects 메서드를 사용하여 Task 객체의 관찰 가능한 시퀀스를 가져옵니다. 그런 다음 sorted 메서드를 사용하여 결과를 정렬하고, asObservable 메서드를 호출하여 옵저버블 시퀀스로 변환합니다. 이렇게 하면 Realm에서 변경 사항이 발생할 때마다 해당 시퀀스가 업데이트됩니다.

3. Realm 내 데이터 변경하기

데이터베이스에서 데이터를 추가, 수정 또는 삭제하는 경우에도 RxSwift를 활용할 수 있습니다.

let realm = try! Realm()

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

// 또는

try! realm.write {
    task.name = "New Name"
}

// 또는

try! realm.write {
    realm.delete(task)
}

위의 코드에서 데이터를 변경하는 부분을 try! realm.write { }로 감싸주면 됩니다. 이렇게 하면 Realm이 변경 사항을 관리하고 옵저버블 시퀀스가 업데이트됩니다.

결론

이번 블로그 포스트에서는 RxSwift와 Realm을 함께 사용하여 데이터베이스 관련 작업을 반응적으로 다루는 방법에 대해 알아보았습니다. RxSwift를 사용하면 비동기적으로 데이터를 다룰 수 있으며, Realm의 강력한 데이터베이스 기능과 결합하여 앱을 더욱 효율적으로 개발할 수 있습니다.

더 많은 예제와 자세한 내용에 대해서는 RxSwiftRealm의 공식 문서를 참조하세요.