Realm이란? +사용법까지

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


Realm이란?

오픈소스로 모바일에 최적화된 데이터베이스 라이브러리

ORM이 아닌 데이터컨테이너 모델을 사용하고 데이터객체는 Realm에 객체로 저장된다.

컨테이너란 OS상에 논리적인 구획(컨테이너)을 만들고, 어플리케이션을 작동시키기 위해 필요한 라이브러리나 어플리케이션 등을 하나로 모아, 마치 별도의 서버인 것처럼 사용할 수 있게 만든 것
호스트 OS의 리소스를 논리적으로 분리시키고, 여러 개의 컨테이너가 공유하여 사용한다. 컨테이너는 오버헤드가 적기 때문에 가볍고 고속으로 작동하는 것이 특징입니다.

Realm의 핵심개념은 Realm이라는 가벼운 객체 컨테이너이다. 데이터베이스에서처럼 Realm의 데이터는 쿼리, 필터링, 상호 연결이 가능하고 저장이 된다. 반면 기존 데이터베이스와는 달리 Realm의 객체는 라이브 오브젝트이고 완전히 반응형이다. Realm은 기기와 어플리케이션 사이에서 매끄럽게 동기화되며 쓰레드에서 안전하게 접근이 가능하다.

이는 기존 쿼리문으로 테이블에 데이터를 읽어오던 DB와는 전혀 다른 방식인 것으로 기존에 쓰던 대부분의 데이터베이스는 가져온 데이터를 바로 애플리케이션에서 사용을 할 수 없고, 애플리케이션에서 사용이 가능하도록 가공을 하는 과정이 필요했는데, 이 가공을 하는 과정에서 잘못하면 코드가 굉장히 복잡해질 수도 있는 문제가 있었다. Realm은 객체 형태로 데이터를 읽어오고 객체 형태로써 바로 DB에 저장을 가능하게 함으로써 위와 같은 문제점을 해결한 솔루션이다.

Realm Install…

코코아팟을 통해 설치하고 podfile에 아래와 같이 추가한다.

pod ‘RealmSwift’

이후 pod install > 프로젝트에서 CocoaPods에 의해 만들어진 .xcworkspace 파일을 오픈한다.

Realm Object

Realm은 객체 컨테이너로 동작하기 때문에 object를 생성해주어야 한다. 생성 방법은 아래와 같다.

  1. class로 구성되며
  2. 각 변수 앞에 @objc dynamic을 적어준다.
import Foundation
import RealmSwift

class PersonData: Object {
  @objc dynamic var userName = ""
  @objc dynamic var userAge = 0
}

Realm 추가

Realm에 추가하는 방법은 간단하다.

  1. realm.write{ realm.add(Object) }
func addPersonData() {
  personData = PersonData()
  personData = inputDataToPersonData(db: personData!)

  try? realm?.write {
    realm?.add((personData)!)
  }
}

func inputDataToPersonData(db: PersonData) -> PersonData {
  if let name = txtUserName.text {
    db.userName = name
  }

  var age = 0
  if let getAge = txtUserAge.text {
    if getAge == "" {
      age = 0
    } else {
      age = Int(getAge)!
    }
  }
  db.userAge = age
}

Realm 삭제

  1. realm.write{ realm.delete(Object) }
do {
  try self.realm?.write {
    self.realm?.delete(self.personData![indexPath.row])
    self.tableView.reloadData()
  }
} catch {
  print("\(error)")
}

Realm 업데이트

Realm의 업데이트 시 Object 객체는 데이터를 바로 반영하고 자동 업데이트 하기 때문에 객체를 새로고침 할 필요가 없다. 한 객체의 속성을 고치면 동일 객체를 참조하는 다른 객체에도 즉각적으로 반영된다.

func upatePersonData() {
  try? realm?.write {
    personData = inputDataToPersonData(db: personData!)
  }
}

Realm 조회

Realm에 저장된 Object 형태로 저장되며 조회할 때도 저장된 Object의 값으로 불러올 수 있다. 정렬 및 필터를 이용해 데이터를 정리하여 호출 가능하다.

  • byKeyPath: 정렬 기준이 되는 key
  • ascending: 오름차순
func loadPersonData() {
  personData = realm?.objects(PersonData.self).sorted(byKeyPath: "userName", ascending: true)
}

Realm 브라우저로 데이터 확인하기

Realm은 실시간으로 데이터가 수정되는것을 UI로 확인이 가능하다.

  1. Mac의 앱스토어에 접속하여 Realm Browser를 검색 후 다운받는다.
  2. Realm을 구현한 소스에서 Realm데이터가 저장된 위치정보를 받는다. » print(Realm.Configuration.defaultConfiguration.fileURL!)
  3. 2에서 얻은 파일 주소로 이동 후 파일을 실행한다.
1) 터미널 실행
2) $cd FileURL로 FileURL의 상단 폴더까지 이동
3) open . 으로 해당 위치의 폴더을 창으로 이동
4) 저장된 Realm 파일을 오픈

실습해보기

# 프로젝트를 만들곳으로 들어가서
pod init
vi podFile  # pod 'RealmSwift' 추가
pod install

open RealmPractice.xcworkspace

Could not build Objective-C module ‘RealmSwift’ 에러가 뜬다면?
Product > Schema > New Schema > RealmSwift > OK 버튼 클릭