본문 바로가기
Swift

[Swift] Realm이란? & Swift에 적용하기

by Odin_1204 2022. 8. 28.
렘? 렐름? 뤪? 뷁!
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

 

 

 

 

 

안녕하세요. 오딘(Odin)입니다

 

여러분! 혼자 앱 개발을 하다보면 데이터를 저장하고 활용하기 위해 UserDefault를 사용하는데
(String, Int) 같은 기본적인 데이터 형식만 사용이 가능하다보니 너무 한정적이고,

그렇다고 서버를 만들어서 작업하자니 너무 막막했었죠?? 

 

이 Realm을 활용하면 데이터의 저장, 활용이 쉬울 뿐더러

iOS, Android 모두 지원이 가능하여 기기를 변경하더라도 동일한 데이터 활용이 가능하답니다!! 🤩

 

자 이제 우리 같이 Realm을 활용해볼까요?!?

 

 

 

 

 


 

 

 

Realm 이란? 

Realm이란, 오픈 소스 데이터베이스 관리시스템(DBMS)으로, Swift, Objective-C, Java, Kotlin 등 다양한 SDK를 지원해 주며
모바일 환경을 주요 타깃으로 삼은 데이터베이스입니다.

iOS에서 Realm을 사용할 경우, UserDefaults와 CoreData를 대체해 Persistent data를 저장하고 관리할 수 있습니다.

 

  • Realm을 적용 중인 기업

 

Realm 장점

-> iOS에서 영구적으로 데이터를 저장하기 위해 사용할 수 있는 도구들은 USerDefaults, CoreData 등이 존재 하는데
'USerDefualts'는 간단한 단일 데이터를 저장하는데 적합하여 여러 데이터를 저장, 관리하기에는 적합하지 않으며,
'CoreData'는 XCode에서 제공하는 데이터 저장용 프레임워크로 iPhone이 아닌 Android 폰으로 기기를 변경하게 되면 저장 되어 있던 데이터의 사용이 어려워 집니다.

 

1. 빠르고 가벼움

 - Realm에서 데이터 카피가 필요 없고 자연 로딩되어 기기의 리소스를 소모하지 않고 데이터가 풍부한 앱을 빌드 할 수 있습니다.

 

2. 간편한 작업 방식
 - 객체지향 데이터 모델을 통해 개발자는 ORM이나 DAO가 필요 없이 기본 객체로 직접 작업할 수 있습니다.

     ORM(Object-Relational Mapping), DAO(Decentralized Autonomous Organization)

 

3. '내장형 모바일 -> 클라우드' 손쉬운 동기화
 - 실시간 모바일-클라우드 데이터 동기화를 통해 여러 장치, 사용자 및 백엔드에서 데이터를 최신 상태로 유지하는 대화형 기능을 쉽                게 구축할 수 있습니다

 

(단, Realm 모바일 플랫폼의 경우 상용 제품에 적용 시 일부 기능이 유료화되는 듀얼 라이선스라고 하네요.)

 

 

 

* Realm 모바일 플랫폼 구조도

 

 

Realm 사용법

1. 설치

https://realm.io/

Realm을 Swift 프로젝트에 설치할 때 SPM, CocoPods, Carthage 모두를 사용해 설치를 할 수 있습니다.

SPM

Realm Githib Link -> https://github.com/realm/realm-swift.git

'Up to Next Major Version'  ~> 'version Check'

 

 

2. Model 정의

Realm에 저장할 데이터 객체를 정의할 때는 일반적인 모델을 정의하는 것처럼
class를 만들고 필요한 property를 정의하면 됩니다.

이때 Realm에서 사용할 수 있는 형태로 만들어 주려면 class가 Object를 상속해야 하고,
Property를 정의할 때 앞에 @Persisted를 붙이기만 하면 됩니다.

Example

class Diary: Object {
	@Persisted(primaryKey: true) var _id: ObjectId   // primary key로 지정
	@Persisted var title: String
	@Persisted var favorite: Bool
	@Persisted var date: Date

     convenience init(content: String, favorite: Bool = false, checkBox: Bool = false, date: Date = Date() ) {
        self.init()
        self.content = content
        self.favorite = favorite
        self.checkBox = checkBox
        self.dateRegistered = date
    }
}

 

3. CRUD

Realm 데이터베이스에 접근하고, 원하는 작업을 하기 위해서는

let realm = try! Realm()

를 통해 local default Realm 객체를 열어 사용하면 됩니다.

 

Create

// 새로운 객체 생성
let data = Diary(content: "오늘의 일기")

// 데이터 생성 (처음에 데이터가 비어 있기 떄문에 데이터를 add해 주므로써 data 생성)
do {
   try realm.write({
        realm.add(data)
    })
} catch {
    print("data 생성에 error가 발생하였습니다..")
}

Read

// 객채 읽어오기
let diarys = realm.objects(Diary.self)

// 필터링 하기
let filterContent = diarys.sorted(byKeyPath: "content", ascending: true)	// content내용으로 오름차순
let filterContent2 = diarys.filter("content CONTAINS[c] '일기'")	// content에 '일기' 라는 text가 포함 된 것만
let filterFavort= diarys.where({ $0.favorite == true })	// favorite 데이터가 true인 것만
...

update

// 변경하고자 하는 데이터
func update(data: Diary) {
    do {
        try realm.write {
        data.content = "오늘의 일기"
        }
    } catch {
        print("data 생성에 error가 발생하였습니다..")
    }
}

delete

// 객채 읽어오기, 제거할 데이터 filter
let diarys = realm.objects(Diary.self)
let data = diarys.where({ $0.favorite == true })
 
do {
   try realm.write({
        realm.delete(data)	// 해당 data만 삭제
        realm.deleteAll()	// 전체 삭제
    })
} catch {
    print("메모를 제거하는데 error가 생겼습니다.")
}

 

참고
- https://www.mongodb.com/docs/realm/sdk/swift/
- https://realm.io/

 

'Swift' 카테고리의 다른 글

[Swift/SwiftUI] UIKit에서 Preview 사용하기  (0) 2023.01.30
[Swift] 국가별 언어 설정 (Localization)  (0) 2022.09.07
[Swift] Custom Font 추가하기  (0) 2022.07.29