Realm Blog

Realm의 .NET Core 지원을 소개합니다!

by /

Realm이 .NET Core를 지원하게 된 사실을 알려드립니다. 이제 클라이언트와 서버 사이드 모두에서 C#을 사용해서 Realm 모바일 플랫폼으로 앱을 만들고 온전한 C# 개발자 경험을 Realm과 함께 만끽할 수 있습니다.

.NET Core란?

.NET Core란 .NET 플랫폼의 차세대 기술로 최신 서버 사이드 개발 방식에 꼭 맞습니다. .NET 개발자는 .NET Core를 사용해서 다음과 같은 요구 사항을 만족하는 서버 사이드 애플리케이션을 만들 수 있습니다.

  • Linux, MacOS, Windows의 크로스 플랫폼
  • .NET Core가 Linux에서 실행되는 결과로서 Docker 컨테이너 지원
  • 마이크로 서비스 아키텍처
  • 고성능 및 확장 가능 시스템
  • 다른 .NET 버전을 사용해서 같은 서버에서 앱 병행 실행
  • .NET Core는 .NET 프레임워크와 같은 .NET 플랫폼 컴포넌트를 많이 사용하므로 양측간에 코드 공유 가능

Realm .NET Core 지원

Realm .NET Core 지원으로 이제 Node.js 바인딩을 사용하는 대신 서버 백엔드에 Realm을 통합할 수 있습니다. 그동안 .NET 전문 분야의 Realm 고객은 .NET Core 지원에 많은 관심을 보여왔습니다. 이제 익숙한 프레임워크를 사용해서 모바일 앱을 위한 서버 사이드 구성 요소를 구축할 수 있게 됩니다. 예를 들어 .NET과 Realm을 사용해서 확장이 가능하고 Docker 컨테이너를 기반으로 한 마이크로서비스를 배포할 수 있습니다. 최신 개발 방식을 사용하는 데 관심이 있는 .NET 개발자 커뮤니티가 크게 발전하고 있으므로 이 새로운 프레임워크를 지원할 수 있게 되어 정말 기쁩니다.

Realm 모바일 플랫폼의 기존 기능에 .NET Core 지원을 추가되었으니 클라이언트 및 서버 사이드 개발을 모두 지원하는 전체 애플리케이션에서 C#을 사용하고 싶으신가요? Xamarin을 사용해서 iOS과 안드로이드를 모두 지원하는 크로스 플랫폼 앱을 만들고, .NET Core를 사용해서 서버 사이드에서 기존 백엔드 시스템을 Realm과 통합할 수 있습니다. Realm 모바일 플랫폼은 어느 플랫폼에서나 매끄럽게 클라이언트 기기 사이에서 데이터를 양방향으로 동기화하므로 실시간으로 애플리케이션의 공통 데이터 레이어를 만들 수 있습니다. Realm의 실시간 양방향 동기화 플랫폼을 사용하면 최신 반응형 앱을 쉽게 만들면서 차별화된 UX를 사용자에게 제공하는데 집중할 수 있습니다.

“우리는 Realm의 단순함과 .NET Core의 속도를 좋아합니다. Realm .NET Core 지원을 통해 백엔드 마이크로 서비스에 최고 성능을 제공할 수 있다는 것이 정말 기쁩니다.” - Cartasite LLC 시니어 소프트웨어 엔지니어 Laura Thompson

우리의 목표는 개발자가 가장 편하게 프로그래밍할 수 있는 언어로 작업하기 쉽게 하는 것이며, .NET Core 지원으로 온전한 엔드 투 엔드 C# 경험을 개발자에게 제공할 수 있게 되었습니다.

동기화 기능을 원하지 않는다면 Realm 모바일 데이터베이스와 .NET Core를 함께 사용하는 것도 강력합니다. 이제 .NET 개발자는 .NET Core와 크로스 플랫폼으로 동작하는 고성능이면서도 가벼운 객체 데이터베이스를 사용할 수 있습니다. Realm은 Windows, Linux, MacOS에서 실행되는 .NET Core로 만든 앱을 위한 독립 실행형 데이터 저장소로 쉽게 배포할 수 있습니다.

.NET Core로 작업할 때 Xamarin 앱을 빌드하는 것과 같으므로 쉽게 시작할 수 있습니다. Realm Xamarin 문서에서 자세한 내용을 확인하세요.

이번 소식을 알리게 돼서 정말 기쁘며, 앞으로 보여드릴 것이 더 많습니다. 앞으로 .NET Core를 위한 글로벌 알림과 데이터 어댑터를 출시할 예정으로, 이런 기능으로 이벤트 핸들링을 앱에 통합하고 레거시 데이터베이스 시스템과 내결함성을 지닌 데이터를 전송할 수 있도록 통합할 수 있습니다. Realm 모바일 플랫폼의 Windows의 양방향 데이터 동기화 기능 지원도 계획하고 있습니다. 2017년 말에 이런 기능을 선보일 예정입니다.

더 읽어보기

Realm ObjC & Swift 2.9: 사용자 이름 기반 권한 설정, 사용자 정보 검색 및 버그 픽스!

by /

사용자 이름으로 권한 설정하기

이제 Realm 오브젝트 서버에서 기본으로 제공하는 사용자 이름 인증 시스템을 사용해서 등록한 경우, 사용자의 이름으로 사용자 권한을 설정할 수 있게 됩니다.

let permission = SyncPermissionValue(realmPath: realmPath,
                                     username: "[email protected]",
                                     accessLevel: .write)
user.applyPermission(permission) { error in
  // ...
}

사용자 정보 검색하기

어드민 사용자는 Realm 오브젝트 서버상의 사용자 정보를 찾아볼 수 있게 됩니다. 어드민 사용자가 사용자 이름을 아는 경우, Realm 오브젝트 서버 ID를 조회할 수 있습니다. 이 ID를 사용해서 더 많은 관리 작업을 수행할 수 있습니다.

let targetUserIdentity = "[email protected]"
adminUser.retrieveInfo(forUser: targetUserIdentity, identityProvider: .usernamePassword) { (userInfo, error) in
  guard let userInfo = userInfo else {
    return
  }
  print("The user's ROS identity is \(userInfo.identity)")
}

동기 사용자 개선

다른 서버에 기반을 둔 경우, 여러 Realm 오브젝트 서버에 같은 ID로 여러 Realm 오브젝트 서버 사용자를 생성하고 로그인할 수 있게 됩니다. 같은 서버에 대한 다른 별칭의 URL인 경우라면 사용자는 여전히 별개로 취급됩니다. (예를 들어 사용자들이 각자 동기 Realm에 대한 사본을 가진 경우입니다.)

어드민 토큰을 사용해서 사용자를 생성한 경우라면, logIn() 메서드를 호출할 때 인증 서버 URL을 특정하는 것이 좋습니다. 향후의 릴리즈에서 이 서버 URL은 모든 사용자 타입에 필수 항목이 될 예정입니다.

다른 개선 사항

  • 하나 이상 List 속성을 포함하는 Swift 객체를 인스턴스화하는 성능을 개선했습니다.

버그 픽스

  • List.description가 이제 중첩 리스트의 올바른 타입을 알려줍니다.
  • 중첩된 속성 유형이 Object.shouldIncludeInDefaultSchema()에서 false를 반환하는 경우, 관리되지 않는 객체의 초기화가 올바르게 동작합니다.
  • RLMArray를 자체 할당해도 더는 지워지지 않습니다.

읽어 주셔서 감사합니다. Realm과 함께 멋진 앱을 만들어 보세요! Stack Overflow, GitHub, Facebook 그룹에서 언제든지 저희에게 연락할 수 있습니다!

더 읽어보기

모바일 개발자로서의 실력을 향상하는 길: Realm 아카데미를 소개합니다.

by /

Realm은 오늘날 개발자가 마주하는 가장 큰 과제가 빠르게 변화하는 개발 분야에서 자신의 기술을 갈고 닦는 것이라는 점을 잘 알고 있습니다. 새로운 언어와 프레임워크, 베스트 프랙티스와 기술, 아키텍처까지, 이 많은 분야에서 꾸준히 발전되면서 쏟아지는 새로운 소식을 어떻게 바쁜 프로 개발자가 따라갈 수 있을까요? 전문적인 학습과 영감을 유지하기 위해 컨퍼런스, 밋업 참석이나 웹 혹은 소셜 미디어상에서 컨텐츠 찾기와 같은 방법을 사용할 수 있지만, 이것만으로는 부족합니다. 기존의 방법은 시간과 비용 면에서 많은 투자가 필요하지만 개발자에게 필요한 깊이와 넓이의 컨텐츠를 제공하기에는 여전히 부족하죠.

이런 문제를 해결하기 위해, 우리는 모바일 분야 최고의 전문가들이 제공하는 수백가지 개발 컨텐츠를 결합하는 새로운 공간인 Realm 아카데미를 시작합니다. 여기에서 최고의 컨퍼런스, 최고의 작가와 자신이 배운 바를 공유하고자 하는 커뮤니티 리더들로부터 실용적인 비디오, 글과 튜토리얼을 만날 수 있습니다. Realm 아카데미는 고품질로 이런 자원들을 생성하고 발전시키며, 관리와 사용이 쉽고 간단하게 공유할 수 있도록 엄선해서 구성합니다. 이런 컬렉션은 매주 새로운 컨텐츠가 발행됨에 따라 지속해서 증가하고 있으며, 현재 출시되는 기능은 단지 시작에 불과합니다.

자, 혹시 안드로이드 개발에서 가장 인기 높은 Kotlin에 대해 바로 알고 싶으신가요? 새로운 Kotlin 학습 경로 에서는 Kotlin의 시작부터 내부 구조까지 차근차근 살펴볼 수 있는 7개의 글을 단계별로 볼 수 있습니다. iOS 프로그래밍 패러다임을 좀 더 살펴보고 싶으신 분이라면 POP에서 유명한 Natasha the Robot의 실무에서 활용하는 프로토콜 중심 프로그래밍과, Rob Napier의 Swift와 함수형 프로그래밍의 역사를 포함한 학습 경로를 따라가 보세요. 그리고 Droid Knights Korea와 같은 컨퍼런스의 강연이나, MVVM과 관련된 글을 쉽게 볼 수도 있습니다.

Realm 아카데미 활용하기

홈페이지는 Realm 아카데미를 시작하는 출발 지점이자 새로운 업데이트를 확인하는 곳입니다. 페이지 상단에는 Android, Apple, JavaScript, Xamarin, Realm 등 주요 플랫폼과 Architecture와 같은 분야 등의 주요 카테고리를 중심으로 구성된 각 섹션으로 연결되는 링크가 있습니다. 스크롤을 내리면 토픽과 학습 경로를 엄선한 컨텐츠 큐레이션을 볼 수 있습니다. 토픽은 관련된 컨텐츠를 묶어서 검색할 수 있게 디자인됐으며, 질문에 대한 심층적인 답변도 찾을 수 있는 동시에 기존에 모르던 새로운 베스트 프렉티스도 발견할 수 있는 곳입니다. 학습 경로는 좀 더 집약적으로 특정 주제와 목표를 위해 학습할 수 있도록 모은 컬렉션입니다. 또한 DroidCon BostonTrySwift Tokyo처럼 이벤트 단위로 묶은 컨텐츠를 볼 수도 있습니다.

우리는 많은 신규 컨텐츠 생성을 계속 진행 중이며, 새로운 Realm 아카데미의 기능을 향상하기 위한 계획도 있으므로 자주 방문해서 확인해 주세요.

Realm 커뮤니티에 합류하세요.

Realm 아카데미 컨텐츠는 최고의 개발자와 전 세계의 유명 개발 컨퍼런스와 함께 하며, Realm 커뮤니티의 최고의 멤버에 의한 공헌, 그리고 Realm 전문가의 노력으로 이뤄집니다. 여러분의 컨텐츠 역시 싣고 싶습니다. 컨텐츠 기고안 제안이나 다른 아이디어가 있다면 Realm Korea Team으로 보내주세요!

더 읽어보기

Realm + ZeroKit으로 쉽게 종단 간 암호화하기

by /

Realm은 데이터를 쉽게 다루면서 앱에 생명을 불어넣을 수 있는 기능을 제공함으로써 훌륭한 앱을 만드는 데 도움이 되고자 노력하고 있습니다. 에러가 나기 쉬운 네트워크와 시리얼라이제이션 코드를 작성하고 유지하지 않고도, Realm 모바일 플랫폼을 사용하면 자동으로 실시간 데이터 동기화와 공유, 서버사이드 데이터 기능 등을 쉽게 적용할 수 있습니다. 또한 사용 중일 때는 HTTPS/TLS, 사용 중이 아닐 때는 AES-256 암호화를 제공하며 유연한 접근 제어 기능을 제공하므로 보안을 적용할 수 있습니다. 따라서 정말 사용자에게 유용한 기능을 개발하는 데 집중할 수 있습니다.

하지만 앱이나 유스 케이스에 따라서 더 높은 레벨의 데이터 보안이 필요한 경우도 있습니다. 이런 요구를 위해 Tresorit의 Realm 모바일 플랫폼과 통합한 새로운 ZeroKit SDK을 사용한 종단 간 암호화 기능을 소개합니다. 이제 헬스케어, 정부 기관, 금용 기관 등에서 요구하는 매우 민감한 데이터를 처리할 수 있는 레벨의 실시간 리액티브 앱을 쉽게 구축할 수 있습니다.

종단 간(엔드 투 엔드) 암호화의 이해

종단 간 암호화는 기기 간에 전송되는 데이터를 보호하기 위한 방법입니다. 전송 전에 원본 기기의 데이터를 암호화하면 중간 공격자는 전송 경로 자체가 암호화되지 않은 상황에서 이를 가로채더라도 데이터를 디코딩할 수 없습니다. 오직 암호 키를 공유하는 클라이언트만 정보에 접근할 수 있죠. 인터넷 서비스 제공 업체를 포함해서 잠재적으로 트래픽을 가로챌 수 있는 다른 소스 누구라도 해당 데이터에 포함된 정보를 볼 수 없습니다. 이는 Signal, Threema, iMessage, FaceTime 등 암호화된 채팅 애플리케이션이 표준으로 사용하는 방식입니다.

문제는 종단 간 암호화를 하려면 매우 광범위한 프로세스 집합을 구현해야 하므로 개발 시간이 많이 필요하다는 점입니다. 또한, 제대로 구현해서 테스트하지 않으면 공격자가 악용할 수 있는 결함을 남길 수도 있습니다. 종단 간 암호화를 해도 해독이 아예 불가능한 것은 아니며 단지 어려울 뿐이므로, 올바르게 종단 간 암호화를 처리해야 합니다.

Tresorit + Realm으로 쉽게 해결하기

Tresorit은 Realm 모바일 플랫폼을 위한 ZeroKit SDK 통합으로 정말 단순하고 안전하며 확장 가능한 방식으로 Realm과 통합했습니다. 클라우드 보안 서비스 구축에 대한 깊이 있는 지식을 바탕으로 ZeroKit은 모든 개발팀이 종단 간 암호화에 접근할 수 있도록 합니다.

종단 간 암호화 기능을 갖춘 안전한 사용자 인증 서비스를 제공하는 SDK가 ZeroKit의 핵심입니다. 이를 사용해서 단일 사용자 계정과 접근 권한을 받은 다른 계정을 사용해서 기기 간에 암호화된 데이터를 공유할 수 있습니다.

ZeroKit은 사용자 계정 시스템을 사용해서 클라이언트 기기 간에 암호화 키를 공유하는 원리로 동작합니다. 새 사용자가 다른 사용자의 암호화된 데이터를 볼 수 있도록 초대받으면 데이터 해독을 위한 암호화 키가 공유됩니다. 필요하다면 데이터에 다시 접근할 수 없도록 키를 취소할 수도 있습니다.

처음부터 백엔드를 다시 작성하지 않아도 Realm에 ZeroKit을 문제없이 통합할 수 있습니다. Tresorit은 양 측의 장점을 모두 모아서 ZeroKit으로 Realm 모바일 플랫폼의 동기화 기능과 함께 종단 간 암호화를 수행하는 방법을 설정하고 데이터를 실시간으로 종단 간 암호화합니다.

동작 방식

사실 동작 방식은 상당히 간단합니다. ZeroKit은 서드 파티 서비스가 동기화 세션을 인증할 수 있는 Realm 모바일 플랫폼의 기능을 사용해서 Realm과 통합됩니다. 사용자가 Realm에 로그인하면 ZeroKit 자격 증명을 통해 Realm 모바일 플랫폼의 고유한 사용자로 식별됩니다. 로그인하면 해당 기기의 사용자 로그인 세션 전체에서 해당 계정의 암호화 키를 사용할 수 있습니다.

더 읽어보기

Arccos의 Realm 모바일 플랫폼 적용 경험

by /

온라인과 오프라인에서 모두 반응형이며 빠른 앱 경험 제공

골프 게임은 플레이어가 모든 샷에서 좋은 결정을 하는 것에 달려 있습니다. 실시간으로 골프 데이터를 수집하고 분석하면 플레이어가 게임 중에 기술을 향상하고 코스 전체에서 더 나은 의사 결정을 내리도록 도울 수 있습니다. 연관 스포츠 분야가 주목받으면서 Arccos Golf는 가장 혁신적이고 최신의 IoT와 모바일 기술을 활용해서 세계에서 가장 오래된 게임을 최첨단으로 끌어 올렸습니다.

 

Arccos의 혁신적인 샷 추적 시스템은 초경량 소형 골프 클럽 센서와 모바일 앱 및 분석 플랫폼으로 이뤄집니다. Arccos는 GPS와 블루투스를 사용해서 모든 샷의 데이터를 자동으로 기록해서 플레이어의 강점, 약점과 추세를 분석하고 모바일 앱을 통해 실시간으로 피드백을 제공합니다. 이렇게 데이터로 축적된 인사이트는 플레이어가 모든 홀에서 올바른 결정을 내릴 수 있는 능력을 크게 향상해줍니다.

Arccos는 회사의 비전을 실현하기 위해 플레이어의 골프 루틴을 방해하지 않으면서도 빠르고 원활한 사용자 경험을 제공해야 했습니다. 또한, 시스템은 자세한 코스 맵 및 유려한 UI를 렌더링하는 동시에 센서 데이터 수집 및 분석 프로세스 등 방대한 데이터를 처리해야 했습니다. 게다가 사용자는 어디에서나 앱이 기능할 것으로 기대하므로 Arccos의 모바일 애플리케이션은 인터넷 연결이 원활하지 않은 골프 코스 안에서도 동작해야 했습니다.

데이터 처리를 위한 세 가지 모델

처음에는 일반적인 형태의 Android 앱 개발을 아웃소싱했습니다. 해당 앱은 RxJava와 OrmLite, SQLite를 사용했었죠. 하지만 이 모델의 성능이 몹시 낮았기 때문에 Arccos 개발팀은 우회책으로 JSON 덩어리를 저장했습니다. 그 결과 모델 간에 데이터를 변환하고 동기화를 유지하기 위해 개발팀은 엄청난 양의 코드를 작성해야 했습니다. 디버깅과 유지 관리에도 많은 시간이 들 수 밖에 없었죠. 또한, Arccos 사용자들은 너무나도 느린 앱 성능으로 고통받으며 앱의 기능을 제대로 활용할 수 없었습니다. 따라서 Arccos는 시스템을 더욱 효율적이고 지속할 수 있게 만들려면 재설계가 필요하다고 판단했습니다.

Realm의 통합 데이터 모델

Arccos는 Realm을 사용해서 데이터 솔루션을 간결하게 만들기로 결정하고, 이런 새 접근 방식을 평가하기 위한 개념을 증명하기 시작했습니다. Realm을 접한 개발팀은 간결한 기반 코드와 간단한 설정 방식으로 Realm을 빠르게 설정하고 실행할 수 있다는 것에 감탄했습니다. 더 중요한 것은 Realm으로 변환하면서 트랜잭션 속도가 상당히 빨라졌다는 점입니다.

“Realm을 통해 에셋 클래스의 로딩 시간이 크게 개선됐습니다. 6초가 걸리던 것이 20밀리 초로 빨라졌죠. 속도가 정말 인상적이었습니다.”
- Muhammad Arafat, Arccos Golf 안드로이드 팀 리드

arccos-still02

Arccos는 Realm의 반응형 아키텍처가 네트워크 연결과 관계없이 신속하고 반응이 빠른 사용자 경험을 가능하게 한다는 것을 발견했습니다. 골프 코스 환경에서는 오프라인 사용이 중요하므로 개발팀은 Realm의 오프라인 우선 유스 케이스 지원에 특히 만족했습니다. Realm은 데이터를 기기 로컬 상에 저장하므로 사용자가 오프라인 상태에서도 전체 앱 데이터에 접근할 수 있습니다.

“Realm의 빠른 로컬 저장소 덕분에 우리는 온라인과 오프라인 모두에서 매우 빠르게 반응하는 애플리케이션 경험을 제공할 수 있습니다.”
- Colin Phillips, Arccos Golf 소프트웨어 부사장

Realm의 단일 데이터 모델을 사용해서 Arccos는 시스템 아키텍처와 애플리케이션 코드를 간소화하고 안정성을 쉽게 향상할 수 있었습니다. 앱 데이터가 객체로 저장되므로 데이터베이스가 앱의 흐름에 방해가 되지 않으며 개발팀이 지루한 데이터 변환 작업으로 고통받지 않을 수 있었고, 애플리케이션에서 잘 동작하는 순수 객체 모델을 훨씬 쉽게 구현할 수 있었습니다. 게다가 Realm은 실제로 사용하는 시점에 필요한 객체 부분만 메모리에 올리므로 트랜잭션 시간이 효과적으로 분산되어 사용자가 매끄럽게 앱을 사용할 수 있습니다.

“Realm을 사용해서 애플리케이션을 다시 설계한 결과 코드 베이스가 35% 감소했고 디버깅과 유지 관리가 훨씬 쉬워졌습니다.”
- Colin Phillips, Arccos Golf 소프트웨어 부사장

arccos-still01

Arccos 팀은 Realm 브라우저와 같은 플랫폼 도구를 사용해서 버그를 훨씬 빠르게 발견하고 해결할 수 있었습니다. 즉, 객체가 올바르게 구성됐는지와 메모리와 데이터베이스의 객체 전반에 일대일 매핑을 확인하고 문제를 신속하게 탐지할 수 있었습니다.

궁극적으로 Realm으로 마이그레이션한 것은 Arccos에 큰 발전을 가져온 결정이었습니다. 이제 플레이어는 골프 코스에서 잘 반응하는 리액티브 앱을 경험할 수 있습니다. 또한, 개발팀은 개발 시간을 단축하면서 플레이어가 더 훌륭한 게임을 할 수 있도록 돕는 데 더 많은 시간을 할애할 수 있습니다.

더 읽어보기

RealmContent - Realm 기반의 오픈 소스 CMS 컴포넌트

by /

 

소개

Realm 모바일 플랫폼으로 만든 RealmContent를 사용하면 Realm 브라우저 앱으로 직접 데이터를 추가해서 새로운 컨텐츠를 iOS 앱에 빠르게 보여줄 수 있습니다.

RealmContent는 Realm 객체를 애플리케이션의 자체 스키마에 자동으로 추가해서 개발자가 미리 구성된 여러 개의 뷰 컨트롤러로 사용 가능한 컨텐츠를 리스팅하고 각 컨텐츠 “페이지”를 렌더링할 수 있습니다.

컴포넌트는 대부분 자동으로 동작하며, 커스터마이제이션도 가능합니다. 따라서 개발자의 시간과 노력을 기울이지 않고도 기본 요소를 구현할 수 있고 인앱 컨텐츠를 변경하기 위해 새로운 버전의 앱을 따로 출시하지 않아도 됩니다.

RealmContent 라이브러리를 사용하면 가장 쉽고 빠른 방법으로 전체 사용자에게 실시간으로 컨텐츠를 보여줄 수 있습니다.

동작 방법 기술 특강

다음과 같은 다섯 가지의 간단한 단계를 거치면 RealmContent로 다이내믹 컨텐츠 관리 시스템을 iOS 앱에 적용할 수 있습니다.

1) Import RealmContent

CocoaPods로 RealmContent 를 추가하거나 프로젝트에 소스 파일을 직접 추가합니다. 그다음 뷰 컨트롤러에 RealmSwiftRealmContent를 추가하세요.

import RealmSwift
import RealmContent

앱에는 일반적으로 Realm 오브젝트 서버에서 동기화하는 객체 목록이 있습니다. RealmContent를 추가하면 Realm이 기본 스키마에 두 개의 새로운 모델인 ContentPageContentElement를 포함합니다.

여러 개의 Realm 파일을 사용하는 경우라면 ContentPageContentElement를 원하는 객체 스키마에 추가하세요.

2) 컨텐츠 리스트 데이터 소스 생성

RealmContent가 제공하는 ContentListDataSource 클래스를 사용해서 컨텐츠를 앱에 표시할 수 있습니다.

let items = ContentListDataSource(style: .sectionsByTag)

일반 리스트에는 .plain을 사용하고 tag 속성으로 페이지가 분리되는 섹션 리스트에는 .sectionsByTag를 사용하세요.

3) 데이터 소스 초기화

loadContent(from:)를 호출해서 컨텐츠 소스로 사용할 Realm 파일을 설정합니다.

items.loadContent(from: try! Realm())

Realm 오브젝트 서버로부터 변경 사항이 들어오는 경우 데이터 소스가 자동으로 테이블 뷰나 컬렉션 뷰에서 데이터를 다시 로드하도록 설정할 수 있습니다. (가장 권장하는 옵션입니다)

items.updating(view: tableView)

4) 일반적인 방법으로 테이블 뷰나 컬렉션 뷰 데이터 소스 메서드를 구현하되, 데이터를 컨텐츠 데이터 소스에서 가져옵니다. 이 클래스는 numberOfSections, numberOfItemsIn(section:), titleForSection(section:), itemAt(indexPath:)와 같은 메서드들을 제공합니다.

이 방법으로 테이블 뷰 또는 컬렉션 뷰 데이터 소스 메서드를 구현하고 필요한 UI나 로직 설정을 할 수 있습니다. (더 자세한 내용은 RealmContent 저장소의 샘플 코드를 참조하세요.)

5) 컨텐츠 “페이지” 표시

ContentViewController 인스턴스를 표시해서 컨텐츠를 보여줄 수 있습니다. 테이블 뷰나 컬렉션 뷰의 탭 델리게이트 메서드나 prepareForSegue(_:) 메서드, 혹은 다른 코드를 사용합니다.

다음 코드에서 테이블 셀을 탭 한 이후의 동작 방법을 볼 수 있습니다.

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  tableView.deselectRow(at: indexPath, animated: true)

  let item = items.itemAt(indexPath: indexPath)
  let vc = ContentViewController(page: item)

  navigationController!.pushViewController(vc, animated: true)
}

표시된 뷰 컨트롤러는 테이블 뷰를 사용해서 ContentPage 요소의 컨텐츠를 동적으로 보여줍니다. 컨텐츠를 원격으로 변경하면 변경 사항이 화면에 실시간으로 반영됩니다.

동적으로 컨텐츠를 추가, 편집, 삭제하기

RealmContent의 가장 큰 장점은 언제든지 표시된 내용을 수정할 수 있다는 것입니다. 모든 변경 사항은 모든 연결된 사용자에게 실시간으로 동기화됩니다. (인터넷에 연결되지 않은 사용자는 연결이 되는 순간 동기화됩니다)

Realm 브라우저 앱으로 새로운 페이지를 추가, 삭제하거나 컨텐츠 블럭을 추가, 재배치, 수정하는 등의 여러 작업을 쉽게 할 수 있습니다. 제목과 링크의 강조 색상을 변경할 수도 있습니다.

Editing contentn via Realm Browser

지금 바로 RealmContent를 사용해 보세요!

오픈 소스인 RealmContent의 소스 코드와 데모 앱을 다음 링크에서 볼 수 있습니다. https://github.com/realm-demos/RealmContent

RealmContent를 앱에 설정하는 가장 빠른 방법은 CocoaPods입니다. Podfile에 pod 'RealmContent'를 추가하세요.

기능에 대한 아이디어나 버그 리포팅, 피드백을 주시려면 Twitter로 연락하거나 GitHub에 이슈를 만들어 주세요.

앞으로 이 컴포넌트로 얼마나 멋진 다이내믹 앱이 만들어질지 정말 기대가 됩니다!

더 읽어보기

Thread Learning사의 경험 공유: Realm과 함께 하는 디지털 교육 서비스

by /
Thread Learning: 실시간 데이터 동기화 및 오프라인 우선 기능으로 자폐아 교육을 제공하는 기업

특수 교육 교사는 매일 학생의 진도와 관련된 수많은 데이터를 직접 추적해야 합니다. 하루가 끝나면 자를 가지고 데이터 그래프를 그리고 결과를 분석해야 하죠. 이 과정은 매우 번거롭고 시간이 오래 걸리는 데다가 종이 기반 데이터를 활용하는 데에는 많은 한계가 있습니다.

 

Thread Learning은 교사, 부모 및 치료 전문가가 특정 요구나 자폐증을 가진 아이들을 교육하는 방식을 발전시키는 회사입니다. Thread Learning의 행동 데이터 수집 플랫폼을 사용하면 담당자가 iPad로 학생의 데이터를 기록할 수 있습니다. 그 다음 플랫폼은 자동으로 그래프를 그리고 데이터를 분석하며, 해당 결과를 학부모를 포함한 아동 케어팀 모두에게 공유합니다.

이렇게 제공되는 디지털 데이터를 활용해서 학생의 요구에 걸맞도록 아동 케어팀 전체 구성원들이 더욱 효율적으로 협력할 수 있습니다. 예를 들어 어떤 아동은 방과 후 3명의 교사, 언어 치료사 및 행동 분석가와 함께 말하기를 학습할 수도 있습니다. Thread Learning은 모든 팀원의 기기에 데이터를 실시간으로 동기화해줍니다. 담당자가 더 많은 정보를 제공할수록 더 나은 교육과 개선된 결과를 얻을 수 있습니다.

협력 케어 플랫폼 구축

협력 케어라는 비전을 실현하기 위해 Thread Learning은 케어팀이 실시간으로 협력할 수 있는 데이터 핸들링 솔루션이 필요했습니다. 그러다 한 공동 창립자가 대학원의 컴퓨터 공학 수업에서 Realm에 대해 알게 됐습니다. 그는 Realm을 사용하면 초기 스타트업이 구현하기 어려운 고급 기능을 활용할 수 있다는 점에 주목했습니다.

“Realm은 개발 일정을 앞당기는 데 정말 큰 도움이 됐습니다. 몇 달이 걸릴 수 있는 개발 기간이 몇 주 만에 실행 단계까지 완성됐죠.”
- Sam Raudabaugh, Thread Learning 사의 공동 창립자이자 CTO

처음부터 Thread Learning 팀은 Realm 모바일 데이터베이스를 사용해서 앱을 개발했습니다. 이를 통해 MySQL과 ORM의 일반적인 문제점뿐만 아니라 비 객체 지향 데이터 솔루션에 따르는 자원 부채를 우회할 수 있었습니다.

Realm 모바일 플랫폼이 출시되자, Thread Learning 팀은 RMP의 견고한 데이터 핸들링과 실시간 동기화 기능에 주목했습니다. 원래는 REST API로 데이터 흐름을 제어했지만, Realm의 데이터 동기화 기능은 더 나은 솔루션을 제공했습니다. 또한, 양방향 데이터 동기화 기능으로는 케어팀이 같은 데이터들을 실시간으로 처리할 수 있었습니다.

“기존에 사용하던 REST API와 비교해서 Realm을 테스트한 결과는 놀라웠습니다.”
- Sam Raudabaugh, Thread Learning 사의 공동 창립자이자 CTO

오프라인 우선 기능과 간결성

학교의 WiFi 네트워크는 불안정할 수 있으므로 담당자들이 인터넷 연결과 관계없이 데이터를 입력하거나 볼 수 있으려면 Thread Learning에는 강력한 오프라인 기능 역시 필요했습니다. 사실 한 공동 창립자의 멘토는 이런 오프라인 기능의 구현이 너무 어렵고 복잡하므로 이를 전적으로 배제하는 것이 좋을 것이라고 조언했습니다. 하지만 Thread Learning은 Realm 모바일 플랫폼을 통해 REST API가 가지는 일반적인 문제를 고민하지 않고도 데이터 업데이트와 충돌 해결처럼 복잡한 네트워크 작업을 쉽게 처리할 수 있었습니다.

종이 기반 작업에서는 데이터 손실이 항상 큰 문제였으므로 Thread Learning은 특히 Realm이 오프라인 우선 유스 케이스를 기본으로 지원하는 것을 높게 평가했습니다. 모든 앱 데이터는 Realm의 클라이언트 측 데이터베이스로 기기에 저장되므로 오프라인일 경우에도 온전히 사용할 수 있을 뿐만 아니라 자동으로 Realm 오브젝트 서버와 모든 케어팀의 기기에 동기화됩니다. Realm의 충돌 해결 기능은 데이터가 항상 최신 상태를 유지할 수 있도록 보장합니다.

“Realm을 사용하므로 언제 기기가 오프라인이 되고 어디에서 데이터 충돌이 발생할지 전혀 걱정할 필요가 없습니다.”
- Gregory Brill, Thread Learning 사의 공동 창립자이자 CEO

또한, Realm은 새 기능 개발을 투명하게 공개하므로 Thread Learning 팀은 이를 참고해서 플랫폼을 발전시키면서 자체 기능 로드맵을 계획할 수 있습니다. 이는 향후 5년 이내에 백만 명 이상의 미국 자폐증 아동에게 봉사하겠다는 Thread Learning의 미션을 지원하고 성장을 관리하는 데 도움이 됩니다.

“Realm으로 시장 경쟁에 바로 뛰어들 수 있었습니다.”
- Gregory Brill, Thread Learning 사의 공동 창립자이자 CEO

더 읽어보기

Realm의 서버리스 로직: Realm Functions를 소개합니다.

by /

Realm Functions를 소개합니다. Realm Functions는 모바일 개발자가 서버 측 기능을 훨씬 쉽게 구축할 수 있게 하는 Realm의 새로운 기능입니다. 이제 백엔드 개발자 없이도 서버 측 기능을 만들 수 있으며, Realm 모바일 플랫폼을 기반으로 구축하는 모든 이점을 누릴 수 있습니다. 서버에 백엔드 포인트를 추가할 필요 없이 웹 대시보드에서 Realm Function을 작성해서 코드가 데이터 스트림에 반응하는지 확인하면 됩니다. Realm Functions 베타 버전은 소규모 프로젝트부터 엔터프라이즈 규모의 팀까지 누구나 사용할 수 있습니다.

데이터 저장과 실시간 데이터 동기화는 훌륭한 앱을 개발하는 데 중요한 요소로, 사용자 정의 논리를 서버에 추가하면 무궁무진한 가능성을 실현할 수 있습니다. 다른 곳에서 변경할 수 없는 기능을 작성하거나 수많은 API를 호출하고 조정하거나 앱에서 집계한 데이터를 가지고 머신 러닝 시스템을 구축할 수도 있습니다. 하지만 정교한 서버 측 기능은 구축하기 어렵고 모바일 앱에 통합하기 힘듭니다. 스트리밍 API를 간단히 구축하려고 해도 앱과 서버 사이에 사용자가 필요로 하는 데이터를 통신하기 위해서는 백엔드 개발자가 많은 서버 코드 작업을 해야 하며, 유지 관리에도 많은 노력이 필요합니다.

코드를 작성하는 노력을 줄여줍니다.

Realm은 개발자가 훌륭한 앱을 만드는 데 장애가 되는 요소를 없애기 위해 노력하고 있으며, 지금까지 많은 작업이 데이터를 중심으로 진행됐습니다. 앱에서 작업하는 데이터는 저장하기 쉽고, 동기화도 쉬우며, 변경된 곳이나 변경된 사람에 관계없이 변화에 쉽게 반응할 수 있어야 합니다. Realm Functions를 사용하면 쉽게 앱의 개발 로직을 만들 수 있으므로 보다 구현이 어렵고 중요한 기능에 더욱 집중할 수 있습니다.

웹 개발 환경에서 필요한 기능을 수행하는 JavaScript 코드를 간단히 작성하자마자 데이터가 들어오는 대로 코드가 원하는 방향으로 반응하는지 결과를 볼 수 있습니다. 더 많은 기능을 넣더라도 앱의 견고성을 해치거나 유지 관리를 복잡하게 만들지 않아 안심하고 개발할 수 있습니다. 데이터를 받아오고 클라이언트와 연결하는 모든 작업은 Realm 모바일 플랫폼에서 관리하므로 Realm Function이 동작하도록 더 많은 시리얼라이제이션이나 네트워크 코드를 넣지 않아도 됩니다.

Realm Functions를 사용해 보세요.

얼마나 쉬운지 보여드리기 위해 Realm Tasks 앱에 새로운 기능을 추가했습니다. 제목에 시간이나 날짜가 들어가는 태스크를 만들면 자연어 처리 API를 사용해서 작업 만료 날짜로 변환합니다. 이 기능은 알림을 표시하는 몇 줄의 앱 코드와 NLP API를 호출하고 Task 객체를 업데이트하는 JavaScript 몇 줄을 추가하는 것으로 간단히 구현했습니다. 데모 비디오를 확인하고 아래 링크를 통해 바로 시작해 보세요!

 

예제 앱을 실행하고 싶다면 Realm Tasks 저장소에서 다운로드하고 설명에 따라 Realm 모바일 플랫폼과 Realm Functions를 시작해 보세요. 혹은 Realm Functions 문서를 참고하세요.

Realm Functions로 쉬운 웹 인터페이스를 통해 앱에 서버 측 로직을 도입할 수 있습니다. 모든 Realm 모바일 플랫폼 사용자는 Realm Functions 베타를 바로 오늘부터 사용할 수 있습니다. 오늘 릴리즈되는 베타 버전으로 개발자 에디션 사용자는 최대 세 개의 Function을 동시에 실행할 수 있습니다. 프로페셔널과 엔터프라이즈 에디션 사용자는 Function를 무제한으로 구현해서 사용할 수 있습니다. Realm Functions로 어떤 앱이 구현될지 벌써 기대됩니다!

더 읽어보기

유니버설 Windows 플랫폼(UWP)용 Realm 출시

by /

이제 .NET community에서 가장 많이 요청해주신 기능, 유니버설 Windows 플랫폼(UWP)용 Realm 모바일 데이터베이스를 사용할 수 있습니다. UWP 지원은 Realm이 Microsoft를 온전히 지원하기 위한 핵심 기능입니다. 저희는 Xamarin를 전폭적으로 지원하고 있으며, 몇 달 전에는 Win32 지원을 추가했고, 몇 주 전에는 단 몇 번의 클릭만으로 누구나 Realm 플랫폼을 사용할 수 있도록 Azure Marketplace에 진출했습니다. 이렇게 지원 범위를 넓혀가면서 .NET은 지난 반년 동안 가장 빠르게 성장한 Realm 개발자 커뮤니티로 자리 잡았습니다.

UWP에서 Realm이 지원됨에 따라 이제 Realm의 최상급 오브젝트 데이터베이스를 사용해서 4억 대에 육박하는 모바일, PC, Xbox 디바이스용 애플리케이션을 구축할 수 있습니다. 이제 Surface 계열 디바이스를 포함한 대부분의 최신 Windows 플랫폼에서 Realm을 사용할 수 있습니다. Xamarin 개발자의 경우 UWP의 지원으로 Android, iOS, 그리고 이제 UWP까지, Xamarin.Forms을 사용하는 모든 플랫폼에 Realm을 사용할 수 있습니다. Realm과 Xamarin.Forms를 사용해서 하나의 코드 베이스로 모든 주요 모바일 플랫폼용 애플리케이션을 만들 수 있습니다.

UWP의 지원이 추가되면서 Realm은 이제 iOS, Android, Windows 10과 같이 모든 메이저 모바일 플랫폼에서 .NET 개발자를 지원하므로 이들 플랫폼 간에 단일 영속성 및 ViewModel 레이어를 사용할 수 있습니다. Microsoft가 제공하는 모바일 혁신과 함께 Realm .NET 커뮤니티가 빠르게 발전해가고 있으므로 저희는 앞으로도 .NET의 제품을 지속적으로 개발하고자 합니다. .NET 개발자 커뮤니티에 이 새롭고 멋진 도구를 공유할 수 있어 정말 기쁘고 Realm으로 얼마나 훌륭한 제품들이 나올지 벌써 기대됩니다. 쉽게 시작할 수 있는 문서를 통해 지금 바로 도전해보세요!

더 읽어보기

Realm ObjC & Swift 2.7: 권한 API, 빠른 재접속, 비밀번호 변경 및 버그 픽스!

by /

Realm Objective‑CRealm Swift 2.7 릴리즈를 알려드립니다. 이번 릴리즈에서는 권한 API와 재접속 성능이 향상되고 비밀번호 변경 기능이 추가되며, 여러 버그를 수정하여 보다 안정적으로 앱을 실행할 수 있습니다.

권한 API 향상

동기 Realm에 대한 권한 변경 및 검색을 위한 새로운 API가 도입됩니다.

이 API는 2.0.42.4.4에서 소개된 기존 Realm 오브젝트 기반의 권한 시스템을 대체합니다.

예를 들어 이전 버전에서 권한을 부여하거나 취소하려면 사용자의 managementRealm()에서 {RLM}SyncPermissionChange 객체를 만들었습니다.

그다음 서버가 처리한 후 통지할 “change” 객체를 관찰하고, 작업이 성공했는지 확인하는 방법을 사용했습니다.

let permissionChange = SyncPermissionChange(realmURL: realmURL,    // 변경할 원격 Realm URL
                                            userID: anotherUserID, // 권한 변경할 사용자 ID 
                                            mayRead: true,         // 읽기 접근 권한
                                            mayWrite: true,        // 쓰기 접근 권한
                                            mayManage: false)      // 관리 접근 권한

let managementRealm = try! user.managementRealm()
try! managementRealm.write {
  managementRealm.add(permissionChange)
}
// 서버 응답 대기
token = permissionChange.addNotificationBlock { _ in
  switch permissionChange.status {
  case .notProcessed: break // handle case
  case .success: break // handle case
  case .error: break // handle case
  }
  print(permissionChange.statusMessage) // contains error or informational message
}

사용 권한 검색은 별도의 Realm (SyncUser.permissionRealm())과 별도의 모델 타입 (SyncPermission)을 사용했습니다.

let permissionRealm = try! user.permissionRealm()
let permissions = permissionRealm.objects(SyncPermission.self)
token = permissions.addNotificationBlock { _ in
  // 권한 업데이트
}

이번 릴리즈에서 간단한 권한 API를 내부 전송 메커니즘이 구현되는 방법에 대한 지식이 필요하지 않도록 간단하게 개선했으므로 위 API들은 더는 사용되지 않습니다.

단일 {RLM}SyncPermissionValue 유형으로 이제 권한을 적용, 취소, 검색할 수 있습니다.

// 권한 적용
let permission = SyncPermissionValue(realmPath: realmPath,
                                     userID: anotherUserID,
                                     accessLevel: .write)
user.applyPermission(permission) { error in
  if let error = error {
    // 에러 처리
    return
  }
  // 성공
}
// 권한 검색
user.retrievePermissions { permissions, error in
  if let error = error {
    // 에러 처리
    return
  }
  // 성공, 권한 접근
}

Realm 권한 API를 사용하기 위한 자세한 설명서는 접근 제어 섹션에서 볼 수 있습니다.

이 API는 Realm 오브젝트 서버 1.1.0 버전 이상이 필요합니다.

빠른 재접속

이번 릴리즈부터 Reachability 프레임워크를 통해 연결 상태의 변경 사항을 감지하여 연결이 지속되지 않는 경우 즉시 오브젝트 서버와 재연결을 시도합니다.

이전에는 저희 지수적 백오프 재연결 알고리즘을 사용해서 재연결이 발생했으므로 연결이 끊어지기까지의 시간에 의존적이었습니다.

비밀번호 변경

Realm의 ‘password’ 인증 공급자를 이용하는 사용자는 -[RLMSyncUser changePassword:completion:] API를 사용해서 암호를 변경할 수 있습니다. 이 API를 사용하려면 Realm 오브젝트 서버 1.4.0 버전 이상이 필요합니다.

다른 개선사항

  • {RLM}SyncConfiguration은 서버별로 SSL 유효성 검사를 지정할 수 있도록 enableSSLValidation 속성과 Swift 이니셜라이저의 기본 매개 변수를 갖습니다.
  • 이제 16MB가 넘는 동기 Realm과 Realm 오브젝트 서버 간 트랜잭션이 가능합니다.

버그 픽스

  • Objective-C 이름을 오버라이드해서 Swift에서 재정의된 Realm 모델 클래스를 지원합니다. (예. @objc(Foo) class SwiftFoo: Object {}).
  • newObject를 삭제한 후 클래스 이름을 순회할 때 -[RLMMigration enumerateObjects:block:]이 잘못된 oldObject 객체를 반환하던 현상을 수정했습니다.
  • 사용자가 읽기 권한만 가진 동기 Realm을 열 때 Realm.asyncOpen(...) 이 작동하지 않던 현상을 수정했습니다.
  • KVC를 사용해서 List 속성을 nil로 설정하면 이제는 RLMArray 속성의 동작과 일치하도록 리스트를 비웁니다.
  • 동기 Realm을 사용할 때 !m_awaiting_pong assertion 실패로 인한 크래시를 수정했습니다.
  • 숫자나 마침표처럼 대소문자의 차이가 없는 여러 문자가 포함된 인덱스된 문자열 속성에서 대소문자를 구별하지 않는 쿼리를 수행할 때 성능이 저하되거나 멈추는 현상을 수정했습니다.

iOS 7 지원

최소 타깃 iOS 버전을 7.0으로 가능한 한 오래 지원할 예정이지만, 향후 릴리즈에서는 최소 타깃 iOS 버전이 8.0으로 변경될 수 있음을 알려드립니다.


읽어 주셔서 감사합니다. Realm과 함께 멋진 앱을 만들어 보세요! Stack Overflow, GitHub, Facebook 그룹에서 언제든지 저희에게 연락할 수 있습니다!

더 읽어보기

Azure의 Realm 플랫폼: Realm을 클라우드에 배포하는 가장 쉽고 빠른 방법

by /

이제 Microsoft의 Azure Marketplace에 Realm 모바일 플랫폼 개발자 에디션을 사용할 수 있다는 점을 안내 드립니다.

Realm 플랫폼은 이전에도 Linux, Mac, AWS public AMI, Digital Ocean (설치 설명서)에서 쉽게 배포할 수 있었습니다. 하지만 Azure 계정이 있다면 더욱 쉽게 시작할 수 있게 됩니다. Marketplace에서 찾아서 아래 설명처럼 클릭 몇 번만 하면 무료로 거의 모든 기능을 사용할 수 있습니다. 물론 Azure 비용은 별도입니다.

이는 단지 시작일 뿐입니다. 저희는 현재 Microsoft의 공식 파트너로 다른 Realm 플랫폼 에디션을 Azure에서 사용할 수 있도록 작업하고 있습니다. 또한 다른 유명 클라우드 플랫폼과도 작업을 진행하고 있으므로 앞으로를 기대해 주세요.

Azure에서 시작하기

기존 Azure 계정에 로그인하거나 새로 만든 다음, 좌측의 초록색 (+) 버튼을 클릭해서 Marketplace로 갑니다. 검색 상자에 Realm를 입력하고 결과를 선택합니다. 다음으로 Azure의 빠르고 명료한 다섯 단계를 통해 서버를 설정합니다. Realm이 사용하는 포트는 9080과 22로 미리 설정돼 있습니다. 이름 짓기와 SSH 설정 외에는 모든 기본값을 거의 그대로 사용할 수 있습니다.

realm-de-azure-1

5단계를 모두 거치면 배포를 위해 1~2분 정도 소요된 다음 IP 주소를 포함해서 새 서버의 세부 정보를 볼 수 있습니다. 새 탭을 열고 주소 표시줄에 주소를 복사한 다음 맨 뒤에 :9080를 추가한 후 엔터를 누르세요. 이제 Azure에서 동작하는 새 Realm 오브젝트 서버 인스턴스를 위한 어드민 사용자 생성 패널을 볼 수 있습니다. 모든 준비는 끝났습니다! 플랫폼에 대해 더 알아보고 싶다면 Realm Pop (실시간 게임), Realm Draw (실시간 협업), Realm Tasks (실시간 할일 관리)와 같은 데모 앱을 확인해 보세요.

realm-de-azure-2

더 읽어보기

Realm Java 3.1: 객체 알림, 백업 복구, 역 관계

by /

이 버전에서 읽고 작성된 Realm 파일은 이전 버전의 Realm에서 열리지 않습니다. 기존의 파일은 열릴 때 자동으로 업그레이드됩니다. 기존 앱에 업데이트를 배포할 때 주의하세요!

4월 5일 3.1 버전의 Realm Java를 출시하였습니다. 이 버전은 동기화된 Realm에 대한 향상된 백업 복구, 모든 객체에 대한 정밀한 알림, 역 관계에 대한 초기 지원을 포함합니다. 자세한 내용을 읽어보세요.

정밀한 객체 알림

Realm Java 3.0에서 정밀한 컬렉션 알림을 소개했습니다. 3.1에서는 단일 객체 알림을 RealmObjectChangeListener 인터페이스와 ObjectChangeSet 클래스를 사용하여 확장합니다.

Person p = realm.where(Person.class).findFirst();
p.addChangeListener(new RealmObjectChangeListener<Person>() {
   @Override
   public void onChange(Person person, ObjectChangeSet changeSet) {
       if (changeSet.isDeleted()) {
           hide(); // Object was deleted
       } else {
           // Use information about which fields changed to only update part of the UI
           if (changeSet.isFieldChanged("name")) {
               updateName(person.getName());
           }
       }
   }
});

이전 배포에서 단일 객체 알림은 많은 경우 잘못된 알림이었습니다. 심지어 어떤 데이터도 변경되지 않았을 때도 호출되었죠. 이런 문제는 3.1 버전에서 수정되었고 이제 단일 객체 알림을 사용할 때는 정밀한 알림이든 아니든 객체가 수정되었을 때만 호출됩니다.

백업 복구 향상

서버가 다운되었을 때를 대비해서 복구 계획이 필요합니다. 이런 이유로 Realm 모바일 플랫폼이 데이터 백업 기능을 몇 달 전부터 제공했습니다. 정상적인 상황에서 Realm의 동기화 엔진은 어떤 명령을 받아 동작하며 Realm 오브젝트 서버가 새로운 명령들을 받으면 사용자의 로컬 로그가 지워집니다. 이런 방식이 사용자 앱의 디스크 사용량을 적게 하고 Realm을 번개⚡️같이 빠르게 합니다.

게다가 Realm은 오프라인 우선 데이터베이스이기 때문에 Realm 오브젝트 서버가 어떤 이유로 동작하지 않아도 로컬 데이터는 사용 가능합니다.

하지만 서버가 데이터를 백업받은 데이터로 복원한다면 클라이언트들은 세션 에러 핸들러를 통해 “client reset” (클라이언트 리셋) 에러를 받게 됩니다. 로컬 Realm을 일반적으로 사용하듯 계속 사용할 수 있지만, 이후의 변경이나 마지막 백업 이후의 변경들은 잃게 됩니다.

한번 “client reset” 에러를 받게 되면 사용자에게 이 상황을 알리고 Realm의 사용을 멈추게 하고 서버가 마지막으로 백업한 버전의 Realm을 다시 내려받을 수 있습니다. ClientResetRequiredError 클래스는 Realm의 이전 지역 버전으로 수동으로 정리할 수 있는지 정보와 방법을 담고 있습니다.

client reset 에러를 곧 처리하지 않는 것도 한 가지 선택입니다. 이런 경우 앱이 다음번에 수행될 때 이전의 지역 버전 Realm은 삭제되고 서버가 마지막으로 백업한 버전으로 첫 접근에 다시 내려받습니다.

final SyncConfiguration config = new SyncConfiguration.Builder(user , url)
       .errorHandler(new SyncSession.ErrorHandler() {
           @Override
           public void onError(SyncSession session, ObjectServerError error) {
               if (error.getErrorCode() == ErrorCode.CLIENT_RESET) {
                   ClientResetRequiredError err = (ClientResetRequiredError) error;
                   closeRealm();
                   err.executeClientReset(); // Manually do the reset
                   err.getBackupFile(); // Reference to backed up file
               } else {
                   // Handle other errors
               }
           }
       })
       .build();

역 관계 (베타)

Realm에서 객체 간의 관계는 양방향입니다. 이 말은 Person이 그의 Dog로 관계를 맺고 있다면 Realm은 자동으로 다른 방향의 관계를 만들어 유지한다는 것입니다.

이 역 관계는 일반적으로 모델 클래스에서는 숨겨져 있습니다. 하지만 우리는 @LinkingObjects 어노테이션을 제공하여 역 관계를 명시적으로 따라갈 수 있게 합니다.

역 관계를 만들기 위한 절차는 다음과 같습니다.

RealmResults 필드를 부모 객체의 일반 형으로 추가합니다. 필드는 파이널이어야 합니다. Realm은 관리되는(managed) 객체의 이 값을 자동으로 채웁니다. 관리되지 않는 (Un-managed) 객체에 역 관계를 지원하지 않습니다. 부모 객체에서 이 모델 클래스를 가리키는 필드의 이름을 넣은 @LinkingObjects 어노테이션을 추가하여 역 관계를 정의합니다.

다음에 예제가 있습니다.

public class Person extends RealmObject {
   public String name;
   public int age;
   public Dog dog;
}  

public class Dog extends RealmObject {
   public String name;

   @LinkingObjects("dog")
   public final RealmResults<Person> owners = null;
}

// 역 관계를 사용합니다
Dog dog = realm.where(Dog.class).findFirst();
dog.owners.size(); // 주인의 수를 가져옵니다
dog.owners.first(); // 강아지 첫번째 주인의 레퍼런스를 가져옵니다

다음 배포에 역 관계를 통해 질의가 가능해지면 역 관계는 진정한 힘을 얻게 될 것입니다.

질의 구현이 완료되지 않았기 때문에 @LinkingObjects 어노테이션에 @Beta를 붙여두었습니다. 이 기능에 대한 어떤 피드백도 환영합니다.

파일 포맷 향상

3.1에서 내부 Realm 파일 포맷을 변경합니다. 예전 Realm 파일은 열 때 자동으로 업그레이드됩니다. 이 작업이 완료되면 예전 버전의 Realm에서 더 읽을 수 없습니다.

변경 내역에서 전체 변경을 확인하세요.


읽어주셔서 감사합니다. 이제 Realm을 사용해서 멋진 앱을 만들어 보세요! 언제나 Stack Overflow, GitHub, Facebook page에서 우리를 만날 수 있습니다!

더 읽어보기

Realm ObjC & Swift 2.5: 쿼리 성능 향상, Swift 3.1 바이너리와 버그 픽스!

by /

이 버전에서 읽거나 쓴 Realm 파일은 이전 버전 Realm에서 열 수 없고 기존 파일은 열 때 자동으로 업그레이드됩니다. 예전 버전 파일은 자동으로 열 수 있으며 읽기 전용 모드로 연 파일은 수정되지 않습니다. 기존 앱 업데이트에 주의하세요!

Realm Objective‑CRealm Swift 2.5 버전 릴리즈를 알려드립니다. 이번 릴리즈에서는 중첩 객체를 NULL과 비교하는 기능을 추가해서 구별 부호를 구분하지 않는 문자열 검색을 지원하는 쿼리를 강화했으며 여러 버그를 수정하여 앱 실행을 강화했습니다.

현재 Swift 3.0, 3.0.1, 3.0.2, 3.1을 위한 Swift 바이너리도 제작하고 있습니다.

동기화 Realm을 사용한다면 Realm 오브젝트 서버는 1.3.0 이상 버전으로 실행해야 합니다.

구별 부호를 구분하지 않는 문자열 쿼리

이제 문자열 비교 연산자에 [d] 수정자를 사용해서 é, ñ, ş 등의 구별 부호를 구분하지 않는 비교를 할 수 있습니다. 또한, 이를 대문자를 구분하지 않는 [c] 수정자와 조합할 수도 있습니다.

이해를 돕기 위한 예시입니다.

  • ==[d] 'u'ü와 매칭됩니다.
  • BEGINSWITH[d] 'e'étoile와 매칭됩니다.
  • CONTAINS[d] 'n'Piñata와 매칭됩니다.
  • ENDSWITH[d] 's'diaçrïtičş와 매칭됩니다.
  • ENDSWITH[cd] 'É'café와 매칭됩니다.

이 쿼리는 LIKE 비교에 적용할 수 없습니다.

멀티 레벨 객체를 NULL과 동등 비교

멀티 레벨 객체가 NULL인지 동등 비교하는 쿼리를 수행할 수 있게 됩니다.

class CircleObject: Object {
  dynamic var data = ""
  dynamic var next: CircleObject?
}
let realm = try Realm()
realm.objects(CircleObject.self).filter("next.next != nil AND next.next.next = nil")

추가 개선 사항

  • [[RLMRealm alloc] init]을 사용할 수 없다고 명시적으로 표시합니다.
  • 잘못된 속성 타입이 기본 키로 표시되면 오류 메시지에 문제 클래스의 이름을 표시합니다.

버그 픽스

  • 스키마가 동기화에 의해 병합된 후 간혹 컬럼 타입 Assertion이 잘못 만들어지던 버그가 수정됩니다.
  • 동기화 Realm을 열 때 빈 쓰기 트랜잭션이 발생하던 현상을 없앴습니다.
  • Realm 설정의 encryptionKey 값을 통해 동기화 Realm의 암호화를 지원합니다.
  • {NS}Data 속성을 16MB에 가깝게 설정해도 크래시가 발생하지 않습니다.
  • {NS}Data 속성을 잘못 읽고 nil을 반환하던 현상을 없앴습니다.
  • 쓰기 트랜잭션을 시작하는 동안 Realm 버전이 고정된 경우 증가하던 파일 크기를 줄였습니다.
  • 동기화 Realm에서 유효하지 않은 체인지셋을 풀링할 때 BadTransactLog 예외가 잡히지 않던 현상을 수정합니다.
  • 관찰하던 RLMArray/List가 수정된 후 삭제된 경우 발생하던 assertion 실패가 수정됩니다.

Xcode 8.3 참고 사항

가장 최신의 안정된 Xcode 버전을 사용해서 Objective‑C 바이너리를 생성하므로, 이번 주에는 Xcode 8.3이 사용돼야 합니다. 하지만 (rdar://31302382)에서 Xcode 8.3이 이전 Xcode보다 약 4배 큰 비트 코드 슬라이스로 바이너리를 생성하는 것을 알게 됐습니다. 이에 따라 iOS용 Realm Objective-C 프레임워크를 55MB에서 약 158MB로 가져옵니다. 따라서 Xcode 8.2를 사용해서 Objective-C 프레임워크를 계속 구축하기로 했습니다. 원하는 분은 Xcode 8.3을 사용한 Realm Objective-C 빌드를 선택할 수 있으며, App Store에서 애플리케이션이 제공되는 시점에는 비트 코드가 바이너리에서 제거되므로 최종 사용자에게 영향을 미치지는 않습니다.


읽어 주셔서 감사합니다. Realm과 함께 멋진 앱을 만들어 보세요! Stack Overflow, GitHub, Facebook 그룹에서 언제든지 저희에게 연락할 수 있습니다!

더 읽어보기

Realm ObjC & Swift 2.5: 쿼리 성능 향상, Swift 3.1 바이너리와 버그 픽스!

by /

이 버전에서 읽거나 쓴 Realm 파일은 이전 버전 Realm에서 열 수 없고 기존 파일은 열 때 자동으로 업그레이드됩니다. 예전 버전 파일은 자동으로 열 수 있으며 읽기 전용 모드로 연 파일은 수정되지 않습니다. 기존 앱 업데이트에 주의하세요!

Realm Objective‑CRealm Swift 2.5 버전 릴리즈를 알려드립니다. 이번 릴리즈에서는 중첩 객체를 NULL과 비교하는 기능을 추가해서 구별 부호를 구분하지 않는 문자열 검색을 지원하는 쿼리를 강화했으며 여러 버그를 수정하여 앱 실행을 강화했습니다.

현재 Swift 3.0, 3.0.1, 3.0.2, 3.1을 위한 Swift 바이너리도 제작하고 있습니다.

동기화 Realm을 사용한다면 Realm 오브젝트 서버는 1.3.0 이상 버전으로 실행해야 합니다.

구별 부호를 구분하지 않는 문자열 쿼리

이제 문자열 비교 연산자에 [d] 수정자를 사용해서 é, ñ, ş 등의 구별 부호를 구분하지 않는 비교를 할 수 있습니다. 또한, 이를 대문자를 구분하지 않는 [c] 수정자와 조합할 수도 있습니다.

이해를 돕기 위한 예시입니다.

  • ==[d] 'u'ü와 매칭됩니다.
  • BEGINSWITH[d] 'e'étoile와 매칭됩니다.
  • CONTAINS[d] 'n'Piñata와 매칭됩니다.
  • ENDSWITH[d] 's'diaçrïtičş와 매칭됩니다.
  • ENDSWITH[cd] 'É'café와 매칭됩니다.

이 쿼리는 LIKE 비교에 적용할 수 없습니다.

멀티 레벨 객체를 NULL과 동등 비교

멀티 레벨 객체가 NULL인지 동등 비교하는 쿼리를 수행할 수 있게 됩니다.

class CircleObject: Object {
  dynamic var data = ""
  dynamic var next: CircleObject?
}
let realm = try Realm()
realm.objects(CircleObject.self).filter("next.next != nil AND next.next.next = nil")

추가 개선 사항

  • [[RLMRealm alloc] init]을 사용할 수 없다고 명시적으로 표시합니다.
  • 잘못된 속성 타입이 기본 키로 표시되면 오류 메시지에 문제 클래스의 이름을 표시합니다.

버그 픽스

  • 스키마가 동기화에 의해 병합된 후 간혹 컬럼 타입 Assertion이 잘못 만들어지던 버그가 수정됩니다.
  • 동기화 Realm을 열 때 빈 쓰기 트랜잭션이 발생하던 현상을 없앴습니다.
  • Realm 설정의 encryptionKey 값을 통해 동기화 Realm의 암호화를 지원합니다.
  • {NS}Data 속성을 16MB에 가깝게 설정해도 크래시가 발생하지 않습니다.
  • {NS}Data 속성을 잘못 읽고 nil을 반환하던 현상을 없앴습니다.
  • 쓰기 트랜잭션을 시작하는 동안 Realm 버전이 고정된 경우 증가하던 파일 크기를 줄였습니다.
  • 동기화 Realm에서 유효하지 않은 체인지셋을 풀링할 때 BadTransactLog 예외가 잡히지 않던 현상을 수정합니다.
  • 관찰하던 RLMArray/List가 수정된 후 삭제된 경우 발생하던 assertion 실패가 수정됩니다.

Xcode 8.3 참고 사항

가장 최신의 안정된 Xcode 버전을 사용해서 Objective‑C 바이너리를 생성하므로, 이번 주에는 Xcode 8.3이 사용돼야 합니다. 하지만 (rdar://31302382)에서 Xcode 8.3이 이전 Xcode보다 약 4배 큰 비트 코드 슬라이스로 바이너리를 생성하는 것을 알게 됐습니다. 이에 따라 iOS용 Realm Objective-C 프레임워크를 55MB에서 약 158MB로 가져옵니다. 따라서 Xcode 8.2를 사용해서 Objective-C 프레임워크를 계속 구축하기로 했습니다. 원하는 분은 Xcode 8.3을 사용한 Realm Objective-C 빌드를 선택할 수 있으며, App Store에서 애플리케이션이 제공되는 시점에는 비트 코드가 바이너리에서 제거되므로 최종 사용자에게 영향을 미치지는 않습니다.


읽어 주셔서 감사합니다. Realm과 함께 멋진 앱을 만들어 보세요! Stack Overflow, GitHub, Facebook 그룹에서 언제든지 저희에게 연락할 수 있습니다!

더 읽어보기

PostgreSQL에 실시간 기능 도입하기

by /

PostgreSQL는 최근 널리 사용되는 강력하고 인기 있는 데이터베이스로, 많은 조직에서 기록 시스템으로 점점 더 많이 도입하고 있습니다. 이런 PostgreSQL가 많은 경우에 잘 맞긴 하지만, PostgreSQL 데이터베이스에 연결되는 최신 반응형 앱을 만드는 데는 어려움이 있습니다. Postgres가 빠르다는 장점이 있지만, 실시간 반응형 모바일 앱을 위해 설계되지는 않았기 때문이죠.

이런 요구를 위해 Realm에서 솔루션을 소개합니다. Realm의 새로운 PostgreSQL 데이터 커넥터입니다. 이 새로운 커넥터를 사용하면 Postgres와 Realm 모바일 플랫폼 사이에 간단한 양방향 연결을 만들어서 모바일 애플리케이션을 위해 동작하는 실시간이고 효과적인 Postgres로 거듭나게 합니다. Postgres와 Realm 플랫폼 사이에 데이터가 안정적으로 전달되며 무결점이 보장되므로 모바일 앱과의 실시간 동기화가 자동으로 처리될 수 있습니다. 즉, 모바일 클라이언트에서 변화된 내용이 자동으로 Postgres 데이터베이스에 실시간으로 반영되며, Postgres의 변화 역시 실시간으로 클라이언트 단 데이터베이스에 동기화됩니다. 이제 PostgreSQL과 Realm을 사용해서 완전히 반응형인 모바일 앱을 쉽게 만들 수 있습니다.

REST API 대신 사용할 수 있는 Realm 모바일 플랫폼

REST API를 사용하는 기존 방식 대신 Realm 모바일 플랫폼을 사용해서 모바일 컨텍스트에서 사용할 수 있도록 백엔드 시스템과 데이터를 주고 받을 수 있습니다. 자동 실시간 동기화 서비스를 통해 수동으로 데이터를 요청하거나 대역폭 호깅 폴링을 하지 않고도 데이터 모델에서 변경된 사항만 효율적으로 동기화해줍니다. 또한 Realm은 Realm 모바일 플랫폼의 서버 측 구성 요소인 Realm 오브젝트 서버와 클라이언트 사이에서 JSON 없이 네이티브 객체의 실시간 동기화를 자동으로 처리합니다. Realm 오브젝트 서버는 모바일 애플리케이션과 PostgreSQL 데이터베이스 간의 API 통합 포인트를 제공해서 네트워크 처리 걱정 없이 백엔드에서 통합적인 API 관리를 할 수 있습니다. 이런 구조 덕분에 각 기기가 수행할 API 호출 횟수를 줄이고, 신뢰할 수 없는 네트워크 연결을 처리하는 복잡한 멱등 API의 필요성을 낮춥니다.

PostgreSQL 데이터 커넥터 데모

다음 영상에서 Postgres와 Realm 모바일 플랫폼을 연결하는 방법을 볼 수 있습니다.

가상의 DVD 대여 회사에서 사용하는 샘플 데이터를 기반으로 모바일 앱에서 재고 수준을 조정하거나 변경 사항이 실시간으로 동기화되는 것을 볼 수 있습니다. Realm이 얼마나 간단하게 애플리케이션에 사용되는 Postgres에 실시간 기능을 추가할 수 있는지 확인해 보세요.

Realm이 모바일 앱과 Postgres를 자동으로 실시간 동기화되도록 연결해 줍니다.

사용하는 환경에 맞게 Realm을 적용할 수 있는 방법을 추가하고 개발 편의성을 증대시킬 s방법을 공유할 수 있어 기쁩니다. Github에서 Realm 모바일 플랫폼과 PostgreSQL을 연결하는 방법에 대한 전체 코드와 더 자세한 내용을 살펴보고, PostgreSQL의 데이터로 실시간 반응형 모바일 앱을 만들어보세요.

더 읽어보기