-
Realm은 오픈소스로 운영되는 모바일용 데이터베이스 클래스다. CoreData 처럼 관계형 데이터베이스를 읽고 쓰는 것을 지원하고있다. 개인적으로 CoreData를 사용하는 것 보다 훨씬 직관적이고 사용하기가 간편하다. 이번 포스트에서는 Realm을 Swift에 사용하는 방법을 간단히 정리해본다.
1. Realm cocoapod 임포트
pod 'RealmSwift', '~> 4.4.1'
RealmSwift 라이브러리를 임포트시킨다. 몇 ios 버전에선 이전 Realm 버전으로 임포트하면 persmission 에러가 뜬다고 해서 4.4.1 버전으로 임의로 설정했다.
2. 클래스 설정
import Foundation import RealmSwift class Category: Object { @objc dynamic var name: String = "" let items = List<Item>() }
Realm의 테이블로 추가할 클래스를 선언한다. Object 클래스를 상속해야하는데 이 클래스가 RealmSwift에 포함돼 있어야하는것을 유의하자. name은 Category 클래스의 이름에 해당하는 값이고 items는 Category 클래스와 연결된(relation) 클래스를 의미한다. Category와 Item이 1:N 의 관계가 될 예정이다.
import Foundation import RealmSwift class Item: Object { @objc dynamic var title: String = "" @objc dynamic var done: Bool = false @objc dynamic var dateCreated: Date? var parentCategory = LinkingObjects(fromType: Category.self, property: "items") }
Category 클래스에 포함될 Item 클래스를 선언한다. 아래 parentCategory에 LinkingObjects 를 활용하면 쉽게 둘간의 관계를 정해줄 수 있다.
3. CRUD
3.1 Create
let newCategory = Category() newCategory.name = textField.text! save(category: newCategory) func save(category: Category) { let realm = try! Realm() do { try realm.write { realm.add(category) } } catch { print("Error saving contet \(error)") } self.tableView.reloadData() }
생성하는 작업은 CoreData랑 비슷하다. 임의의 Category 클래스를 만들고 realm 라이브러리로 추가해주는 작업을 하면 된다. realm.write 함수의 콜백 내에 add 함수를 추가하면 된다.
if let currentCategory = self.selectedCategory { do { try self.realm.write { let realm = try! Realm() let newItem = Item() newItem.title = textField.text! newItem.done = false newItem.dateCreated = Date() currentCategory.items.append(newItem) }
Category에 포함된 Item의 경우는 약간 다르다. 아래 코드를 보면 Category처럼 add 함수로 추가하는게 아니라 포함되어있는 Category 클래스의 items 리스트에 append 시켜서 추가하고 있다. 서로 linking되어 있어서 그렇다.
3.2 READ
func loadCategoreis() { let realm = try! Realm() self.categories = realm.objects(Category.self) self.tableView.reloadData() }
읽어오는 작업은 realm 클래스에서 objects 함수에 읽어오려는 클래스를 추가하면 된다. 이러면 간단히 읽어올 수 있게 된다.
3.3 UPDATE
if let item = todoItems?[indexPath.row] { do { try realm.write { item.done = !item.done
realm으로부터 읽어온 클래스를 realm.write 콜백내에서 값을 수정하기만 하면 된다.
3.4. DELETE
if let item = todoItems?[indexPath.row] { do { try realm.write { realm.delete(item)
수정과 마찬가지로 realm으로 읽어온 클래스를 realm.write 콜백내에서 삭제하면 된다.
4. 총평
다른 개발자들도 CoreData가 정말 쓰기 불편했나보다. realm을 찬양하는 개발자들이 더 많다. 그리고 성능도 realm이 coredata에 비해서 압도적으로 훌륭하다. 물론 앱에서 데이터를 저장할 때는 이정도로 중요할것 같지는 않지만 말이다.
'개발 > iOS' 카테고리의 다른 글
CoreData (0) 2020.12.05 UserDefaults (0) 2020.12.05 IQKeyboardManager (0) 2020.11.30 URLSession (0) 2020.11.30 Pod (0) 2020.11.30