티스토리 뷰

반응형

Realm 플랫폼의 핵심 개념은 Realm 이라는 가벼운 객체 컨테이너입니다. 데이터베이스에서처럼 Realm의 데이터는 쿼리, 필터링, 상호 연결이 가능하고 저장이 됩니다. 반면 기존 데이터베이스와는 달리 Realm의 객체는 라이브 오브젝트이고 완전히 반응형입니다. 또한, Realm은 기기와 애플리케이션 사이에서 매끄럽게 동기화되며 스레드에서 안전하게 접근할 수 있습니다. 이번 시간 Realm 에 대해서 간단한 샘플 프로젝트를 공유 하려고 합니다. 

    

Realm 설치


Realm을 사용한 프로젝트에서 사용한 기능은 조회, 추가, 삭제, 수정으로 Realm을 사용하는데 필요한 기능을 구현하였습니다. 


1. CocoaPods 0.39.9 버전 또는 그 상위버전을 설치 합니다.

2. CocoaPods가 최신 Realm 버전을 인식할 수 있도록 pod repo update를 실행합니다.

3. Podfile에 use_frameworks! 로 추가합니다. 그리고 응용 프로그램과 테스트 대상에 pod ‘RealmSwift’ 추가합니다.

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'SampleRealm' do
   # Comment the next line if you're not using Swift and don't want to use dynam$
   use_frameworks!

pod 'RealmSwift'
  # Pods for SampleRealm

end


4. 1.1.0 이전 버전의 CocoaPods를 사용 한다면 Podfile 아래에 다음 코드를 붙여넣고, 필요한 경우 Swift 버전을 업데이트 하세요. 

[ 1.1.0 이전 버전 사용 시]

ruby post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['SWIFT_VERSION'] = '3.0' end end end


5.커맨드 라인에서 pod Install을 입력하세요.

6. 프로젝트에서 CocoaPods 의해 만들어진 .xcworkspace 파일을 엽니다.


Realm Object 


Realm 에 대해서 앞써 언급했듯이 객체 컨테이너로 동작하게 됩니다. 따라서 Object을 생성해야 합니다. 생성 방법은 Class로 구성되며, 각 변수 앞에 @objc dynamic 을 적어주면 됩니다.


import Foundation
import RealmSwift

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



Realm 추가


Realm에 추가하는 방법은 간단합니다. realm.write { realm. add(Object)} 형태로 적용하면 Realm에 추가 할 수 있습니다.

//MARK: Person Data 을 Realm에 추가합니다.
func addPersionData(){
    personData = PersonData()
    personData = inputDataToPersionData(db: personData!)
    //input Realm
    try? realm?.write {
        realm?.add((personData)!)
    }
}

func inputDataToPersionData(db : PersonData) -> PersonData{
    //Name
    if let name = txtUserName.text {
        db.userName = name
    }
        
    //Age
    var age = 0
    if let getAge = txtUserAge.text{
        if getAge == ""{
            age = 0
        }else{
            age = Int(getAge)!
        }
    }
    db.userAge = age
        
    //Email
    if let email = txtUserEmail.text{
       db.userEmail = email
    }
    return db
}



Realm 삭제


Realm에 삭제하는 방법은 간단합니다. realm.write { realm. delete(Object)} 형태로 적용하면 Realm에 삭제 할 수 있습니다.


//MARK: PersonData을 삭제합니다.
 do{
       try self.realm?.write{
             self.realm?.delete(self.personData![indexPath.row])
             self.tableView.reloadData()
            }
       } catch{
          print("\(error)")
 }


Realm 업데이트


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


//MARK: Person Data Update
 func updatePersionData(){
       try? realm?.write {
           // inputDataToPersionData(db: personData!) 은 Realm 추가 소스를 참고해주세요.
           personData = inputDataToPersionData(db: personData!)
      }
 }



Realm 조회


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

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


Realm Browser로 데이터 확인하기기


Realm 의 장점 중 하나가 실시간으로 데이터가 수정되는 것을 UI로 제공합니다. Realm Browser을 사용하여 데이터 확인하는 방법은 다음 순서로 적용됩니다. 


1. Mac 에 있는 AppStore 에 접속하여 "Realm Browser" 을 검색 후 다운 받습니다.


2. Realm 을 구현한 소스에서 Realm 데이터가 저장된 위치 정보를 얻습니다.


// Realm 저장 위치 보여줌print(Realm.Configuration.defaultConfiguration.fileURL!)


3. 2번에서 얻은 파일 주소로 이동 후 파일을 실행합니다.


   [이동하는 방법]
   1) "터미널" 을 실행합니다.
   2) $ cd FileURL 로 FileURL의 상단 폴더까지 이동합니다.
   3) open .  으로 해당 위치의 폴더을 창으로 이동합니다.

   4) 저장된 Realm 파일을 오픈합니다. 



정리


Realm을 통한 조회, 추가, 삭제, 수정은 간단하게 구현이 가능했습니다. Object 형태로 관리하며 자동 업데이트 기능이 다른 것을 사용할 때보다 편했습니다. 무엇보다 Realm의 장점은 저장된 데이터를 UI 형태로 제공될 것으로 보입니다. 실시간으로 데이터 삽입, 삭제, 수정을 확인할 수 있기에 테스트하며 개발하는데 도움이 될 것으로 보입니다.


자세한 샘플 소스는 여기 에서 확인 할 수 있습니다.




참고


https://realm.io/kr/docs/tutorials/realmtasks/

https://realm.io/kr/docs/



반응형
댓글