Realm Java 0.85 — 새로운 암호화 구현!
Realm Java 의 새 버전이 공개 되어 이 웹사이트와 Maven에서 다운 받으실 수 있습니다. 이 새 버전에서는 시그널 핸들러에 기반한 암호화 구현을 걷어내고 일반적인 방법으로 새로 구현하여 더 많은 디바이스에서 암호화가 안정적으로 동작하도록 하였습니다. 또한 새로운 API인 Realm.isEmpty()
가 추가되었습니다.
새로운 암호화 구현
“Realm의 Core DB 엔진” 라는 글에서 말한 바와같이 우리는 Realm의 암호화 구현을 위해 POSIX 시그널 핸들러 를 사용하고 있엇습니다. 이 방법은 SW관점에서 매우 간단하고 훌륭한 구현 방법입니다. 하지만 현실의 안드로이드 세상에 적용했을 때에는 시그널 핸들러가 일부 이상한 크래시를 일으키는 원인이 됩니다.
- 안드로이드 5.0 롤리팝 부터, 안드로이드는 플레이스토어를 통해 설치와 업데이트를 할 수 있는 Chromium WebView를 포함시켰습니다. 하지만 WebView v40에 버그가 있어서, 암호화된 Realm과 같이 사용되면 크래시가 발생하는 경우가 있었습니다. 더 자세한 사항은 여기에서 확인하실 수 있습니다.
- 일부 오래된 기기들 (예를 들어, HTC One X 등)에서는 시그널 핸들러가 정상적으로 구현되어있지 않습니다. HTC One X에서 발생하는 문제는 Firefox for Android 에서도 발견이 되었습니다. 자세한 사항은 이 Bugzilla 페이지를 확인해 보십시오
암호화를 다양한 기기에서 동작할 수 있도록 다양한 시도를 했음에도 불구하고, HTC One X 등과 같이 API가 망가진 기기에서 시그널 핸들러를 사용한다는 것은 불가능한 일이었습니다. 그래서 이 버전에서는 우리의 암호화 구현을 완전히 새로 작성하였습니다. 이 버전(v0.85.0) 부터는 Realm의 암호화가 모든 안드로이드 기기에서 동작합니다!
이제 RealmEncryptionNotSupportedException
을 catch 하는 부분을 제거하고 Realm이 모든 안드로이드 기기에서 동작하게 하시면 됩니다.
새로 추가된 API - Realm.isEmpty()
Realm.isEmpty()
를 사용하여 Realm이 비어있는지 아닌지 확인하실 수 있습니다.
호환성 주의사항
RealmEncryptionNotSupportedException
는 더이상 필요하지 않기 때문에 제거되었습니다. 🎉
Realm.executeTransaction()
은 RealmException
으로 감싸서 exception을 던지던 것이 이제 RuntimeException
을 직접 던져 줍니다. 만약 Realm.executeTransaction()
을 사용한 트랜잭션 블럭에서 무슨 문제가 있다면, 원래의 exception이 던져지게 되어 더 쉽게 디버깅 할 수 있게 됩니다. 예전과 같이 exception이 발생하면 트랜잭션은 rollback 되게 됩니다.
필드명이 관계가 있는 필드이고 마지막 element 가 링크라면, RealmQuery.isNull()
과 RealmQuery.isNotNull()
은 이제 RealmError
대신에 IllegalArgumentException
을 던지게 됩니다.