왕논의 연구실

[Swift] 모바일 저장소 - Realm 본문

iOS/Swift

[Swift] 모바일 저장소 - Realm

ywangnon 2022. 6. 8. 23:36

Realm은 모바일에 특화된 데이터베이스입니다. 렘, 렐름 등 읽는 방식이 사람마다 조금씩 다릅니다.

 

장점

사용하기 전에는

  • 다른 회사들이 많이 사용한다.
  • 최신 데이터베이스 중 하나로서 공부해 두면 좋을 것 같다.

이런 생각으로 선택했습니다. 사용해보고나서는 괜찮은 장점들이 있었습니다.

  • 코드가 직관적입니다.
  • DB에서 불러온 객체를 별도의 처리과정없이 바로 다룰 수 있습니다.
  • Realm 스튜디오를 통해 데이터베이스 데이터를 직접적으로 볼 수 있습니다.

제가 처음 사용할때는 필요한 데이터타입을 다루지 않는다든지, 옵셔널타입에 대해서 조금 불편하게 작성해야하는 사항이 있었는데, 지금은 업데이트되었습니다.

 

설치

Swift Package Manager

  1. File > Add Packages...
  2. 검색창에 주소 입력 https://github.com/realm/realm-swift.git

CocoaPods

  1. 팟파일에 pod 'RealmSwift', '~>10' 입력
  2. 해당 폴더의 커맨드 창에 pod install 입력

 

모델 정의

Realm 객체 모델은 RealmSwift 라이브러리의 Object에서 파생되어 Realm 데이터베이스에 저장됩니다. 그러므로 Object를 상속하는 class를 만들어줍니다. property는 앞에 @Persisted를 붙여줍니다.

class DogToy: Object {
    @Persisted var name = ""
}

class Dog: Object {
    @Persisted var name = ""
    @Persisted var age = 0
    @Persisted var color = ""
    @Persisted var currentCity = ""
    // 1:1관계
    @Persisted var favoriteToy: DogToy?
}

class Person: Object {
    @Persisted(primaryKey: true) var id = 0
    @Persisted var name = ""
    // 1:다 관계 - 사람은 많은 개를 가질 수 있음
    @Persisted var dogs: List<Dog>
    // 다:1 관계 - 사람은 많은 클럽에 가입되어 있을 수 있음
    @Persisted(originProperty: "members") var clubs: LinkingObjects<DogClub>
}

class DogClub: Object {
    @Persisted var name = ""
    @Persisted var members: List<Person>
}

 

CRUD

• Create

// 클래스를 인스턴스화합니다. 편의를 위해 적절한 키와 값을 사용하여 사전에서 개체를 초기화할 수 있습니다.
let dog = Dog(value: ["name": "Max", "age": 5])
let realm = try! Realm()

// thread-safe transaction 코드 안에서 작업해야함
try! realm.write {
    // realm DB에 저장
    realm.add(dog)
}

 

• Read

let realm = try! Realm()
// realm에 있는 모든 Dog 읽기
let dogs = realm.objects(Dog.self)

// age로 필터
let puppies = dogs.where {
    $0.age < 2
}

• Update

let realm = try! Realm()

try! realm.write {
    let person1 = Person(value: ["id": 1234, "name": "Jones"])
    // 영역에 새 사람을 추가합니다. ID가 1234인 사람이 아직 추가되지 않았으므로 인스턴스가 영역에 추가됩니다.
    realm.add(person1, update: .modified)
    
    let person2 = Person(value: ["id": 1234, "name": "Bowie"])
    // 아이디로 보면 동일인물이고 이름만 다를뿐입니다. 'update'의 property별 작동:
    // - .modified: 변경된 필드를 업데이트합니다.
    // - .all: 변경 여부에 관계없이 모든 필드를 바꿉니다.
    // - .error: 동일한 기본 키를 가진 키가 이미 존재하는 경우 예외를 throw합니다.
    realm.add(person2, update: .modified)
}

• Delete

 

let realm = try! Realm()

try! realm.write {
    // realm에서 해당 인스턴스 삭제
    realm.delete(dog)
}

try! realm.write {
    // 2살보다 어린 개
    let puppies = realm.objects(Dog.self).where {
        $0.age < 2
    }

    // 해당 collection을 realm에서 삭제
    realm.delete(puppies)
}

try! realm.write {
    // 모두 삭제
    realm.deleteAll()
}

 

 

'iOS > Swift' 카테고리의 다른 글

[Swift] 커스텀 폰트 적용  (0) 2022.06.27
[Swift] Struct vs Class  (0) 2022.06.18
[swift] 디자인 트렌드 적용  (0) 2022.05.25
[Swift]동적 아이콘 변경  (0) 2021.09.22
[Swift]삼항연산자(?), 옵셔널 기본처리(??)  (0) 2021.09.22