Realm Blog

Realm Java 2.0 - 모바일 플랫폼 지원

오늘 우리는 Realm 모바일 플랫폼 지원이 추가되고 여러 작은 변경과 버그 수정이 된 2.0 버전의 Realm Java를 출시합니다.

Realm 모바일 플랫폼 확장

Realm 모바일 플랫폼 런칭 글을 읽지 않았다면 지금 읽고 안드로이드의 기술적인 부분을 살펴봅시다.

먼저 모바일 플랫폼 확장을 다음과 같이 앱의 build.gradle 파일을 수정하여 활성화합니다.

realm {
  syncEnabled = true
}  

동기화된 Realm의 설정에 대해 짧게 살펴봅시다.

// 로그인 합니다.
Credentials credentials = Credentials.usernamePassword(username, password, true);
User.loginAsync(credentials, "https://realm.example.com:9443), new User.Callback() {
  @Override
  public void onSuccess(User user) {
    // 동기화된 Realm을 엽니다.
    // 모든 변경은 Realm이 모든 장비에서 동기화합니다
    SyncConfiguration config = new SyncConfiguration.Builder(user, "realm://realm.example.com/~/userRealm").build();
    Realm realm = Realm.getInstance(config);
  }

  @Override
  public void onError(ObjectServerError error) {
    // Handle error
  }
});

이것입니다! 한번 Realm이 이렇게 열리면 어떤 변경이라도 자동으로 해당 사용자의 다른 모든 장비에 동기화됩니다.

기술적인 부분으로 돌아갑시다. Realm 모바일 플랫폼 지원에 따라 몇몇 새로운 클래스와 API가 추가되었습니다.

사용자와 증명

사용자는 Realm 동기화의 핵심적인 컨셉입니다. 모든 Realm은 사용자와 연결되어 있습니다. 사용자는 사용자 이름 / 비밀번호 증명이나 여러 추가적인 인증(Google, Facebook, iCloud 등)을 통해 Realm에 인증할 수 있습니다. 사용자에 대한 자세한 내용은 문서를 참고하세요.

동기화 설정

Realm 동기화를 설정하기 위해 사용자와 원격 Realm 주소(예: realm://realm.example.com:9080/~/userRealm)를 가지고 SyncConfiguration를 생성해야합니다. 자세한 내용은 우리 문서를 참고하세요.

동기화 관리자와 세션

SyncManager는 모든 동기화된 Realm을 관리하는 싱글턴입니다. 여러분은 이제 전역 에러 핸들러나 사용자를 어떻게 다루는지를 지시하기 위해 이것과 상호작용하게 됩니다.

동기화된 개별 Realm은 연관된 Session을 가지는데 상태에 대한 추가적인 정보를 제공합니다. 앞으로의 출시에 더 많은 정보를 추가하려 합니다.

플랫폼 확장은 베타입니다

최근 5년간 Realm의 동기화를 위한 아래단의 기술이 만들어지고 정제되고 안정화를 진행하고 있지만 이를 공개하기 전에 API가 올바른지 확인하고 싶습니다. 그래서 우리는 플랫폼 확장을 베타로 출시합니다. 이 API들은 이후 출시에서 변경될 수 있습니다. 가능한 최상의 제품으로 만들기 위함입니다.

만약 앱에 플랫폼 확장을 사용하지 않는다면 항상 사용했던 안정성을 믿을 수 있습니다. 플랫폼 확장은 Realm을 전적으로 지역적으로 사용하거나 동기화하여 사용할 때 명확하게 다르도록 설계하였습니다. 그래서 앱이 어떤 베타 요소를 사용하는 것을 확인하는 것은 쉽습니다.

모든 베타 API는 코드와 자바독에 @Beta 어노테이션과 태그가 각자 지정되어있습니다.

다른 2.0의 변경 사항

이 출시에 포함된 새로운 기능과 능력의 규모에 따라 큰 버전을 올립니다. 동시에 우리는 Realm Java를 Realm Swfit와 Realm Objective-C에 따라 몇가지 조정을 함으로서 몇몇 부분들이 간소화되었습니다.

Realm Java가 성능 향상과 몇가지 버그 수정을 하기 위해 새로운 파일 포맷을 소개하는 것을 주의하세요. Realm 2.0에서 작성된 파일들은 1.x과 그 이전 버전에서 읽을 수 없습니다. 예전 파일들은 여전히 읽을 수 있습니다.

전역 초기화

Context 레퍼런스는 불필요한 마찰을 줄이기 위해 점차 우리 API 속으로 감추어졌습니다.

우리는 한 걸음 물러나 전역 초기화 함수를 제공합니다.

Realm.init(context)`

이는 API의 여러 부분에서 다음과 같이 컨텍스트를 제거할 수 있게 합니다.

  • RealmConfiguration.Builder() 생성할 때 더 이상 컨텍스트가 필요하지 않습니다.
  • RealmConfiguration.Builder.assetFile()는 더이상 컨텍스트를 요구하지 않습니다.
  • Realm.getDefaultInstance()는 이제 디폴트를 먼저 생성하지 않아도 동작합니다.
  • 네이티브 코드의 읽기가 더 실패에 안전해졌습니다.

이 메서드를 호출하기 자연스러운 곳은 Application의 자식 클래스입니다.

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Realm.init(this);
        // 다른 초기화 루틴
    }
}

기본 값

Realm Java 2.0부터 객체를 생성할 때 기본값을 지원합니다. 이는 필드에 값을 설정하거나 기본 생성자를 통해 기본 값을 지정할 수 있다는 것입니다.

public class Person extends RealmObject {
  private String name = "John";
  private int age;
  
  public Person() {
    this.age = 42;
  }
}

Person p = realm.createObject(Person.class);
p.getName(); // John
p.getAge(); // 42

기본값은 JSON 데이터로 부터 객체들을 생성할 때도 적용합니다. 반면 다이나믹 API를 통해 객체를 생성할 때는 적용되지 않습니다.

RealmLog

공개 API에 새로운 클래스 RealmLog가 추가되었습니다. 이는 Realm이 얼마나 어떻게 로깅을 할지 개인화할 수 있게 합니다. 모바일 플랫폼의 모든 이벤트는 이 클래스를 통합니다.

RealmLog.clear(); // 모든 로거를 제거합니다
RealmLog.add(new AndroidLogger(Log.DEBUG)); // 커스텀 로그를 설정합니다

기본 키들과 객체

여러 단말의 객체를 통합하기 위해 객체의 기본 키에 대한 새로운 두가지 제약이 추가되었습니다.

1) 기본 키는 객체를 생성할 때 제공되어야 합니다. 2) 한번 설정된 기본 키는 바꿀 수 없습니다.

첫번째 제약은 realm.createObject(Class)로 객체를 생성할 때만 보입니다. 이런 경우에 realm.createObject(Class, Object)를 호출하여 기본 키를 정의하는 것이 요구됩니다.

realm.copyToRealm()realm.createObjectFromJson()는 계속 이전처럼 작동합니다.

어떤 이유로 기본 키를 바꾸어야 한다면 새로운 객체를 만들고 기존의 값을 복사해야 합니다. 이는 copyFromRealm()/copyToRealm()를 통해 하십시요.

버그 수정과 기타 변경

전체 변경과 버그 수정은 변경 내역에서 보세요.


읽어주셔서 감사합니다. Realm과 함꼐 위대한 앱을 만들어 앞으로 나아갑시다. 우리는 언제나 Stack Overflow, GitHub, Twitter에 있습니다.


Realm Team

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

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

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