Realm Blog

Realm Objective-C & Swift 0.96

이번 버전(0.96) 에서 읽거나 쓴 Realm 파일은 이전 버전에서 열 수 없습니다. 기존 앱에 업데이트를 적용하실 경우에 특히 주의하시길 바랍니다.

Realm Objective-CRealm Swift 0.96.0을 출시했습니다. 이 버전에서는 NULL 속성을 지원하고, keypath collection 쿼리 (count/min/max/sum/avg), Swift에서 RealmCollectionType 프로토콜 도입, 오류 헨들링의 개선과 버그 수정이 포함되었습니다.

Null 지원

이번 버전은 모든 속성 유형에 대해 NULL 값을 저장할 수 있게 되었습니다.

Objective-C

NSString *, NSDate *, NSData * 은 기본적으로 nil 을 할당이 가능합니다. 만약 nil 할당을 하지 않는 경우에는 모델에서 +requiredProperties 클래스 메서드를 재정의하고 nil 할당을 하지 않는 속성의 이름을 반환합니다. 이전 버전에서 작성된 파일에 접근 할 때 +requiredProperties에서 지정한 속성 이외에는 자동으로 nil 사용 가능으로 변환됩니다.

Optional 숫자들은 숫자 타입인 NSNumber * 프로퍼티를 사용하여 저장이 가능합니다. NSNumber<RLMInt> *, NSNumber<RLMBool> *, NSNumber<RLMFloat> *, 그리고 NSNumber<RLMDouble> *도 사용 가능합니다.

(예시)

@interface OptionalTypes : RLMObject
@property NSString *optionalString;
@property NSString *requiredString;
@property NSData *optionalData;
@property NSDate *optionalDate;
@property NSNumber<RLMInt> *optionalInt;
@property NSNumber<RLMBool> *optionalBool;
@property NSNumber<RLMFloat> *optionalFloat;
@property NSNumber<RLMDouble> *optionalDouble;
@end
@implementation OptionalTypes
+ (NSArray *)requiredProperties {
    return @[@"requiredString"];
}
@end

Swift

String, NSDate, NSData 속성들은 마찬가지로 optional 또는 non-optional 중 하나를 지정할 수 있습니다. 유감스럽게도 optional 숫자 타입을 직접적으로 지원하지는 않습니다.(참고. #2147) 따라서 수치 형을 nil처리를 하려면, RealmOptional으로 감싸야 할 것입니다.

(예시)

class OptionalTypes: Object {
    dynamic var string: String? = "B"
    dynamic var data: NSData? = "C".dataUsingEncoding(NSUTF8StringEncoding)
    dynamic var date: NSDate? = NSDate(timeIntervalSince1970: 10)
    let int = RealmOptional<Int>(1)
    let float = RealmOptional<Float>(2.2)
    let double = RealmOptional<Double>(3.3)
    let bool = RealmOptional<Bool>(true)
    let boolWithNilDefault = RealmOptional<Bool>(nil)
}

List 속성과 마찬가지로 RealmOptional 속성은 let으로 선언해야하며, dynamic으로는 안됩니다. RealmOptional 으로 감싼 실제 값을 읽거나 쓰려면 value 속성을 사용해야합니다.

파일 포맷 자동 변환

Realm 파일을 이번 버전에서 열면, 읽기 트렌젝션에 접근을 할 때 자동으로 새로운 파일 형식으로 변환이 됩니다. 이 자동 변환 작업은 다음과 같이 수행합니다.

  1. 모든 인데스가 다시 만들어집니다. (Int와 String 타입에만 적용이 됩니다.)
  2. 모든 NSString, NSDate, NSData 타입의 속성은 +requiredProperties 을 지정하지 않으면 NULL 사용이 가능으로 변환됩니다.
  3. 새로운 포맷의 버전 번호가 파일에 기록이 됩니다.

이 변환은 파일 쓰기를 필요로 하기 때문에 이전 버전의 Realm에서 작성된 파일은 새 버전에서 로드 할 수는 없습니다. 만약에 앱에서 Realm 파일을 묶는다면, 새로운 파일 포맷으로 업데이트 하여 교체해야합니다.

주의 : 이 파일 포맷 변환은 취소 할 수 없습니다.

Keypath Collection Queries

@count, @min, @max, @sum, @avg을 사용하는 Keypath Collection 쿼리는 RLMArray/List 속성들을 이제 지원합니다. 자세한 사용법은 Realm 웹 사이트에서 공개하고 있는 NSPredicate Cheatsheet를 참고하세요.

RealmCollectionType

Realm Objective-C는 오랫동안 공통 프로토콜 (RLMCollection)을 사용하는 RLMArrayRLMResults을 사용할 수 있었습니다. 이번 버전에서는 Swift에서도 같은 기능을 사용할 수 있도록 확장되었습니다.

ListResults 클래스는 모두 RealmCollectionType 프로토콜을 준수하도록 선언되어 있습니다. type-erased wrapper가 제공되고 있기 때문에 Swift에도 다른 레이아웃의 것을 같은 컬렉션에 포함 할 수 있습니다.

(예시)

class ViewController: UIViewController {
    var collection: AnyRealmCollection

    init(collection: RealmCollectionType) {
        super.init()
        self.collection = AnyRealmCollection(collection)
    }
}

오류 처리 (Error Handling) 개선

현재 Realm 버전에서는 트랜잭션을 커밋할 때 디스크 잔여 용량이 부족한 경우 크래쉬가 발생할 수 있습니다. 다행하게도 Realm 크래쉬는 기존 데이터가 손상되는 것을 막았지만, 틀림없이 견고한 UX는 아니었습니다.

이제는 commitWrite / commitWriteTransaction and write / transactionWithBlock은 디스크 공간이 부족한 경우에는 오류를 반환합니다.

작은 개선 (Minor Enhancements)

  • RLMRealm/Realm에 하나의 객체가 저장되어 있는지 확인하는 isEmpty 속성을 추가했습니다.

버그 수정

  • 8MB 이상 16MB 이하의 크기의 NSData를 저장했을 때 실패하는 것을 수정했습니다.
  • RLMArray/List 또는 관계 객체가 제거된 마이그레이션을 롤백할 때 실패하는 것을 수정했습니다.
  • 파일 열기에 실패했을 때 오류 객체에 경로 정보를 포함하도록 했습니다.
  • 클래스의 subset을 사용하는 첫 번째 Realm을 열은 후 Realm이 열리지 않는 버그를 수정했습니다.
  • Object(value: ...)Object 서브 클래스 속성의 디폴트 값을 초기화 할 때 발생하는 버그를 수정했습니다.
  • 클래스의 하위 클래스의 부분 집합의 일부가 아닌 배열이나 객체 속성들을 가지는 경우 예외를 발생시킵니다.
  • 여러 스레드에서 단시간에 여러번 같은 Realm 파일을 열 때 충돌이 발생하는 것을 수정했습니다.
  • 몇 가지 오류 메시지에서 잘못된 함수 이름을 표시하던 문제를 수정했습니다.

읽어 주셔서 감사합니다. 지금 당장 Realm으로 놀라운 앱을 만들어보세요! 항상 우리는 주변인 StackOverflow, GitHub, 또는 Facebook Realm 사용자 그룹에 있습니다.


Realm Team

Realm의 미션은 더 나은 앱을 빠르게 개발할 수 있도록 돕는 것입니다. 이를 위해 저희는 개발자들이 실시간 협업, 가상 현실, 라이브 데이터 동기화, 오프라인 경험, 메시징 등 정교하고 강력한 기능을 쉽게 개발할 수 있도록 하는 개발 도구와 플랫폼을 제공하고 있습니다.

저희는 모바일 인터넷이 수많은 사용자와 보다 많은 디바이스가 속한 개방형 네트워크와 이들 간의 실시간 상호 작용으로 진화할 것이라고 믿으며, 개발자가 이같은 방향으로 발전할 수 있도록 돕기 위해 저희 제품들을 개발하고 있습니다.

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