개인 프로젝트로 Realm을 사용하기 위해 특징과 알아보겠습니다.
open source object database management system, initially for mobile operating systems (Android / iOS)
모바일에 특화된 오픈소스 객체 데이터베이스 관리 시스템입니다.
Realm 특징
- Realm은 NoSQL 입니다.
- Realm은 객체 중심 데이터베이스 입니다. → ORM 이 필요하지 않고 개발자에게 직관적입니다.
- iOS와 Android 간 DB 공유가 가능합니다.
- 코드로 작업할 수 있습니다. → SQL과 같은 중간 쿼리 언어를 사용하지 않습니다.
- 메인 스레드에서 읽기/ 쓰기를 할 수 있습니다. → 다중 쓰레드에서의 Realm 객체 관리가 어렵습니다. (쓰레드별 객체 관리 필요함)
- 객체를 직접 디스크에 유지합니다. → 서드파티 스토리지 엔진을 사용하지 않습니다.
→ 디스크에서 데이터를 읽거나 쓸 때 데이터를 상호 변환하지 않아도 됩니다. - SQLite와 CoreData보다 작업 속도가 빠릅니다.
- 다양한 쿼리를 지원하지 않습니다.
- iOS 8 이상부터 사용이 가능합니다.
NoSQL
- Not Only SQL 의 약자로 데이터베이스 관리시스템을 지칭합니다.
- 여러 유형의 DB를 사용합니다.
- SQL 외에 데이터를 저장하는 방식이 있습니다.
Realm 선택
iOS의 데이터를 저장하는 방식에는
UserDefaults, CoreData, SQLite, Realm 등이 있습니다.
이 중에서 UserDefaults는 저번 프로젝트에서 사용했어서 제외하였고
(단일 데이터를 저장하는데 적합하다고 합니다.)
CoreData와 SQLite는 써보지 않았지만 Realm의 장점이 도드라져 보였기 때문에 Realm을 선택하였습니다.
CoreData를 더 알아보면 기본으로 제공되는 데이터 저장용 프레임워크로 객체 형태로 데이터를 관리할 수 있다는 장점이 있지만,
XCode를 통해서 Entity를 생성하고, 코드로 데이터를 Read, Write하는 과정이 직관적이지 않고 사용이 불편하다고 합니다.
객체 선언
import Foundation
import RealmSwift
class Dog: Object {
@Persisted var name: String
@Persisted var age: Int
}
class Person: Object {
@Persisted(primaryKey: true) var _id: String
@Persisted var name: String
@Persisted var age: Int
@Persisted var dogs: List<Dog>
}
Create
import UIKit
import RealmSwift
class ViewController: UIViewController {
let realm = try! Realm()
let dog = Dog()
dog.name = "MAX"
try! realm.write {
realm.add(dog)
}
}
Read
realm.objects(Dog.self) // 반환값: Results<Repository>
Update
try! realm.write {
dog.name = "Wolfie"
}
listener & observe object notifications
token = dog.observe { change in
switch change {
case .change(let properties):
for property in properties {
print("Property '\(property.name)' changed to '\(property.newValue!)'");
}
case .error(let error):
print("An error occurred: (error)")
case .deleted:
print("The object was deleted.")
}
}
자동 갱신되는 객체와 쿼리
let puppies = realm.objects(Dog).filter("age < 2")
puppies.count // => 아직 개가 Realm에 추가되지 않았기 때문에 0
let myDog = Dog()
myDog.name = "Rex"
myDog.age = 1
try! realm.write {
realm.add(myDog)
}
puppies.count // => 실시간으로 1로 갱신됩니다.
// 다른 질의에서 개에 접근합니다
let puppy = realm.objects(Dog).filter("age == 1").first
try! realm.write {
puppy.age = 3
}
// 원래 개 객체는 자동 갱신됩니다.
myDog.age // => 3
puppies.count // => 0
Realm 데이터베이스 확인하기
Realm Studio 설치
- Realm 을 사용하고 있는 view controller 에서 경로를 확인
print(Realm.Configuration.defaultConfiguration.fileURL!)
file:///Users/neuli/Library/Developer/CoreSimulator/Devices/80B0AEB2-AC86-4172-8904-59B9236B269E/data/Containers/Data/Application/C5DD0570-587D-481B-925A-C64D72E616F9/Documents/default.realm
- Users ~ Documents 까지 복사
- Realm Studio 파일찾기
- Finder Shift + Command + G 주소 입력 후 이동
- .realm 파일을 studio 에 꺼내옵니다.
Realm 사용법 참고
https://jintaewoo.tistory.com/45
참고
[Swift] Realm의 특징과 사용법
Realm의 특징과 간단한 사용법에 대해 알아보겠습니다.
velog.io
https://www.mongodb.com/docs/realm/sdk/swift/
'iOS > STUDY' 카테고리의 다른 글
[iOS] UISegmentedControl (0) | 2022.03.26 |
---|---|
[iOS] UISwipeActionsConfiguration (0) | 2022.03.26 |
[cocoapods] M1 mac cocoapods 설치 오류 해결 (0) | 2022.03.16 |
[Swift] Int - quotientAndRemainder(dividingBy:) (0) | 2022.03.13 |
[iOS] Diffable Data Source (CollectionView, TableView) (0) | 2022.03.10 |