iOS 개발 기록

SwiftUI - Realm 본문

SwiftUI

SwiftUI - Realm

택꽁이 2022. 4. 26. 16:06
728x90

Realm은 모바일 환경을 주요 타킷으로 하는 오픈소스 데이터베이스 관리 시스템이다. 모델 구조가 객체 컨테이너로 된 NoSQL 데이터베이스를 지향하며 조금 더 직관적인 사용이 가능하고 데이터 처리 속도가 향상된 장점이 있다. 찾아보니 SwiftUI와 Combine에도 적극적으로 지원하는데 정리된 자료가 많이 없는것 같아 개인적으로 공부하며 정리해본다. 

 

Realm 의 장점 

1. Swift 뿐만 아니라 JAVA, Objective-C, JavaScript, React Native 등을 지원해 크로스 플랫폼으로 DB를 공유할 수 있다. 
2. SQLite, FMDB, CoreDate 등 보다 빠르다. 

3. Real-Time data base sync가 가능해 Realm Studio 으로 실시간으로 데이터를 확인할 수 있고, 서버 - 모바일간 실시간 동기화가 가능하다. 

4. 공식 홈페이지를 따르면 개발자에게 직관적이라고 한다. 

 

 

 

 

 

 

사용법 

 

모델의 정의 

모델의 정의는 일반적인 Swift Class를 정의하는것과 같이 하면 된다. 다른점이라면 Object를 상속받아야 하고, 프로퍼티 앞에 @Persisted를 붙여줘야 한다. 해당 모델에서는 이름을 Primary Key로 사용한다.

class Beer: Object {
    @Persisted(PrimaryKey: true) var name: String 
    @Persisted var brewery: String
    @Persisted var isFavorite: Bool 
    
    convenience init(id: String, name: String, isFavorite: Bool) {
        self.init()
        self.id = id
        self.name = name
        self.isFavorite = isFavorite
    }
}

 

 

CRUD 

Realm 데이터베이스를 사용하기 위해서는 Local에 있는 Realm 객체를 정의하고 사용해야한다.

저장되는 데이터의 경로는 Realm.Configuration.defaultConfiguration.fileURL! 를 통해서 확인할 수 있다. 

 

 

Create 

 // Realm에 데이터를 추가하는 함수
func addBeer() {
    //log 출력
    print(#fileID, #function, #line, "경로: \(Realm.Configuration.defaultConfiguration.fileURL!)")
        
    // realm DB에 접근하기 위해서는 먼저 Realm()을 통해 객체를 만들어 접근해야한다.
    let realm = try! Realm()

    // 추가할 데이터 설정
    let favoriteBeer = Beer(name: "Westvleteren XII", brewery: "BEEREAU", isFavorite: true)
        
    // realm에 추가
    try! realm.write{
        realm.add(favoriteBeer)
    }
}

 

 

 

Read

// 조회
func readBeers() {
	let realm = try! Realm()
	
    // 모든 객체 
    let beers = realm.objects(Beer.self)
    
    // 조건을 가지고 필터링
    let favoriteBeers = realm.objects(Beer.self).filter{ $0.isFavorite == true }
    
    // PrimaryKey로 검색
    let favoriteBeer = realm.object(ofType: Beer.self, forPrimaryKey: "Westvleteren XII")
}

 

Update 

// 수정 
func toggleFavorite(beer: Beer) {
    let realm = try! Realm()
    
    // 업데이트할 데이터 조회 
    let updatBeer = realm.object(ofType: FavoriteCharacters.self, forPrimaryKey: "Life")!
    
    try! realm.write{
    	updateBeer.isFavorite = true
    }
}

 

Delete

// 삭제 
func deleteBeer() {
	let realm = try! Realm()
    
    let	deleteBeer = realm.object(ofType: Beer.self, forPrimaryKey: "TERRA")

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

 

 

 

 

 

 

 

MVVM 

 

SwiftUI에서는 데이터들이 변경될 때에 이를 감지할 수 있도록 @State, @EnvironmentObject와 같은 Property wrappers를 제공한다. Realm에서도 DB의 내용이 변경됐을 때에 자동으로 업데이트 해주는 기능을 제공한다. 공부하면서 써본 것들만 일단 정리해보고 다른 것들도 써볼 때 마다 업데이트 해야겠다. 

 

@ObservedRealmObject

구독한 Realm Object나 List가 변경될 때 마다 이를  뷰에 반영할 수 있도록 제공되는 Property wrappers. @ObservedResults을 통해 관찰한다. 해당 데이터는 ObjectKeyIdentifiable Protocol을 준수해야만 한다.

 

 

@ObservedResults 
 이는 Environment Value인 realmConfiguration을 따르므로 RealmDB 데이터에 변화가 있을 때에 이를 관찰할 수 있다. 변화가 관찰되었을 때에 realm의 쿼리 결과를 따라 화면을 다시 그려준다.  

 

 

// Beer에 ObjectKeyIdentifiable 프로토콜 추가
Extension Beer: ObjectKeyIdentifiable {}

// ViewModel의 Data를 관리하는 곳에서
@ObservedRealmObject var beers: Beer 


// View를 그리는 곳.
@ObservedResults(Beer.self) var favoriteBeer

var FavoriteBeers: some View {
    return List(favoriteBeer) { beer in
     	VStack {
             if beer.isFavorite == true {
	            Text("내가 좋아하는 \(beer.name)!! ")
                }
        }
   
    }
}

 

 

 

 

 

 

 

레퍼런스 링크

https://www.mongodb.com/docs/realm/sdk/swift/swiftui/#std-label-ios-swiftui-quick-start

 

Realm Database with SwiftUI QuickStart — MongoDB Realm

Docs Home → MongoDB RealmHave Xcode 12.4 or later (minimum Swift version 5.3.1).Create a new Xcode project using the SwiftUI "App" template with a minimum iOS target of 15.0.Install the Swift SDK. This SwiftUI app requires a minimum SDK version of 10.19.

www.mongodb.com

 

 

https://www.mongodb.com/docs/realm-sdks/swift/latest/index.html

 

RealmSwift Reference

RealmSwift Reference RealmSwift Reference

www.mongodb.com

 

'SwiftUI' 카테고리의 다른 글

[iOS] WidgetKit  (0) 2023.02.06
[iOS] swiftUI에서 UIKit 사용하기  (0) 2023.02.06
SwiftUI - View의 크기를 구하는 방법  (0) 2022.07.07
SwiftUI - 애니메이션  (0) 2022.04.21
SwiftUI의 4가지 원칙  (0) 2022.04.13