Realm swift live coding cover

프알못의 Realm 사용기 + 라이브 코딩 데모

소개

저는 프알못, 프로그래밍을 잘 알지 못하는 사람입니다. 이번 강연의 목표는 프알못도 할 수 있으니 다른 분도 할 수 있다는 자신감을 드리는 겁니다. 제가 Realm을 사용한 경험을 공유하고 간단한 포토 앱을 같이 만드는 실습을 한 후 Realm을 사용하며 느낀 점과 궁금했던 점을 풀어나가 보겠습니다.

Realm을 어떻게 시작하고 사용했는가?

저는 여행을 좋아하는데 사진을 많이 찍어와도 언제 어디서 찍은 사진인지 기억이 나지 않아 아쉬웠습니다. 그래서 사진 안에 있는 위치와 시간 정보를 가지고 여행 내용을 정리해주는 앱을 만들기 시작했습니다. 개발을 시작하니 여행 시각, 장소 데이터와 사진 데이터를 저장해야 했지만, 서버를 구축할 인력과 운영비가 없었기 때문에 디바이스 내부에 DB를 만들기로 했습니다. 처음에는 Core Data를 사용하려고 했지만 Let’Swift 컨퍼런스의 Realm 세션을 보고 Realm 도입을 결정했고요. 사용해본 결과 빠르고 편리해서 계속해서 쓰고 있습니다.

모델


class Album: Object {
    dynamic var title: String = ""
    dynamic var createDate: Date = Date()
//    dynamic var uuid: String = UUID().uuidString
    let photos: List<Photo> = List<Photo>()

//    override class func primaryKey() -> String? {
//        return "uuid"
}

class Photo: Object {
    dynamic var createDate: Date = Date()
    dynamic var image: Data = Data()
}

이런 개발 뉴스를 더 만나보세요

실제 저희 프로젝트의 1/10 정도밖에 안되는 일부분이긴 하지만 데모 포토 앱을 위한 데이터 모델을 위와 같이 만들었습니다.

사용 기술

쓰기 트랜잭션, 정렬과 필터링, 알림, 마이그레이션, 기본 키, Realm 데이터를 백업하고 복원하는 기능까지 실제 프로젝트에서 Realm이 큰 부분을 차지하고 있고 모든 화면에서 보입니다. 실제로 사용해보니 정말 빠르고 편리합니다.

데모

realm-demo-beginner-app

위 화면과 같은 앱을 간단하게 만들어보겠습니다. 구현할 기능은 앨범 생성 및 삭제, 앨범명 수정, 앨범 내 이미지 추가 및 삭제, 앨범 대표 이미지 설정, 앨범 명으로 검색 등입니다. 간단한 내용이므로 숙련된 분들은 금방 만들 수 있을 정도의 기능입니다. 이 모든 기능을 오로지 Realm을 이용해서 구현할 수 있습니다.

모델

Realm을 사용하려면 Model을 만들어야 합니다. 앞서 보여드린 코드처럼 앨범의 제목을 스트링으로, 생성 날짜를 Date로 선언했습니다. 사진 모델도 마찬가지로 생성 날짜를 Date로, 이미지를 Data로 선언했습니다. 이런 사진 모델을 앨범 안에 List<Photo> 형식으로 들어가도록 했습니다.

Realm 인스턴스

모델을 만들었으므로 Realm 인스턴스를 불러서 default Realm instance를 가져옵니다.


let realm = try! Realm()

// 특정 configuration (조건) 이용
let realm = try! Realm(configuration: realmConfig)

// 존재하는 Realm 파일 URL 이용
let realm = try! Realm(fileURL: realmURL)

맨 위 코드처럼 불러오면 default 설정의 Realm을 불러올 수 있으며, 다른 설정을 부여하려면 아래 두 예제처럼 사용하면 됩니다.

쓰기 트랜잭션


try! realm.write {
  // Do something
}

추가, 수정, 삭제 등 모든 Realm 객체 변경은 쓰기 트랜잭션 내부에서 실행해야 합니다. 디스크 I/O 작업이므로 호출 수를 최소로 줄여주는 것이 좋습니다.


do {
  try realm.write {
    realm.add(object)
    realm.delete(object)
  }
} catch {
  print("\(error)")
}

실습에서는 do catch 문으로 쓰기 트랜잭션을 감싸서 에러 핸들링을 하도록 하겠습니다.

실습

차근차근 간단한 포토 앱을 만들어가는 라이브 코딩을 동영상에서 볼 수 있습니다.

실습 코드는 GitHub에서 받을 수 있습니다. 기본적인 Realm 기능은 이용해 보는 실습을 해봤습니다. 하지만 마이그레이션 부분은 다루지 못했으니 추가로 설명하겠습니다.

마이그레이션

마이그레이션이란 Realm 데이터베이스 스키마에 변화가 생겼을 때 디스크에 쓰인 데이터와 새로운 스키마의 차이를 맞추는 작업입니다. 사실 아직 릴리즈 이전의 개발 중이라면 시간 절약상 굳이 사용하지 않고 앱을 지웠다가 다시 설치하는 것을 추천합니다. 단 이미 릴리즈돼서 설치된 앱의 스키마가 변경된다면 마이그레이션이 필요합니다. 스키마 변경을 한 단계 올리고 마이그레이션 내에서 어떤 작업을 할지 지정하면 됩니다.


Realm.Configuration(
  // schemaVersion 0이며, 이전 버전보다 높게 설정
  schemaVersion: 3,

  // schemaVerion이나, schema 자체에 변화가 생기면 호출됨
  migrationBlock: { { migration, oldSchemaVersion in
    if oldSchemaVersion < 1 {  
    }
    if oldSchemaVersion < 2 {
    }
    if oldSchemaVersion < 3 {
    }
  )
})

마이그레이션을 할 때는 선형으로 해야 함을 주의하세요. 버전이 4까지 올라갔다면 이전 버전에서 일어난 변화를 모두 커버해줘야 합니다. 또한 스키마 버전을 구분할 때 if else 문을 사용하면 이전의 if문을 통과해버릴 수 있으므로 각 버전에서 일어나는 내용을 모두 적용할 수 있도록 if 문으로 만들어 주세요. 마이그레이션 시점은 최초로 Realm 인스턴스를 호출하기 전에 일어나야 하므로 보통 AppDelegate 등이 적당합니다.


let migrationBlock: MigrationBlock = { migration, oldSchemaVersion in
  if oldSchemaVersion < 1 {
    migration.enumerateObjects(ofType: Album.className(), { (oldObject, newObject) in
      if oldSchemaVersion < 1 {
        let uuid = UUID().uuidString
        newObject?["uuid"] = uuid
      }
    })
    migration.enumerateObjects(ofType: Photo.className()) { oldObject, newObject in
      if oldSchemaVersion < 1 {
      }
    }
  }
}

마지막으로 기존에 없던 프로퍼티가 추가할 경우 초기값 설정이 반영되지 않으므로, 만약 uuid 속성을 새로 넣은 경우 기본값이 들어가지 않으므로 위 코드처럼 마이그레이션 블럭 안에서 처리해주세요.

기본 키


class Album: Object {
  dynamic var title: String = ""
  dynamic var createDate: Date = Date()
  dynamic var uuid: String = UUID().uuidString
  let photos: List<Photos> = List<Photos>()
  override class func primaryKey() -> String? {
    return "uuid"
  }
}

기본 키는 고유한 값으로 각 객체를 식별하는 역할을 하므로 자동 증가 Int를 활용하려면 위 예제와 같이 사용하세요.

정리

전체 소스코드는 GitHub에서 볼 수 있습니다. someinitial.com에서 Realm을 활용한 저희 프로젝트가 새로 서비스되기 시작했으니 많은 관심 가져 주세요.


Let us go는 iOS 개발자로 일하시는 분, 이제 막 시작한 분, 그리고 이제 시작하려 하는 분 모두가 모여 서로 가지고 있는 지식을 공유하며 소통하고 서로 어울려 친해질 수 있는 편한 자리입니다.

본 영상과 글은 Let us go의 비디오 스폰서인 Realm에서 제공합니다. 모바일 개발자가 더 나은 앱을 더 빠르게 만들도록 돕는 Realm 모바일 데이터베이스Realm 모바일 플랫폼을 통해 핵심 로직에 집중하고 개발 효율을 높여 보세요! 공식 문서에서 단 몇 분 만에 시작할 수 있습니다. 또한 Realm 홈페이지에서는 모바일 개발자를 위한 다양한 최신 기술 뉴스와 튜토리얼을 제공하고 있으니 즐겨찾기하고 자주 들러 주세요!

다음: Realm Obj-C와 Realm Swift의 새로운 기능을 소개합니다.

General link arrow white

컨텐츠에 대하여

이 컨텐츠는 저자의 허가 하에 이곳에서 공유합니다.

전미정

쓰고 싶은 여행 앱을 직접 만들기 위해 iOS 개발을 시작했습니다. 맥북과 함께 어디든 떠날 준비가 되어있는 개발할 수 있는 여행자입니다.

4 design patterns for a RESTless mobile integration »

close