Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

앱에 Device Sync 추가 - Kotlin SDK

이 페이지의 내용

  • Device Sync
  • 데이터 모델
  • 구독
  • 사용자 권한
  • 전제 조건
  • 해당 페이지의 예시에 대한 정보
  • App Services 에서 Device Sync 활성화
  • 클라이언트 앱에 동기화 추가
  • Kotlin SDK의 동기화 배포 설치
  • Atlas App Services 백엔드에 연결
  • 사용자 인증
  • 동기화 구성 정의
  • 동기화된 Realm 열기
  • Realm 사용
  • 다음 단계

이 페이지에는 Device Sync와 그 기본 개념, Realm Kotlin SDK를 사용하여 클라이언트 앱에 동기화를 추가하는 방법에 대한 정보가 포함되어 있습니다. 앱에 동기화를 추가한 후에는 클라이언트에서 동기화된 Realm에 액세스할 수 있습니다.

Device Sync 에 대해 이미 알고 계신가요? 시작하려면 App Services 에서 Device Sync 활성화 섹션으로 건너뛰세요.

Device Sync 는 클라이언트 기기와 Atlas 간에 데이터를 동기화합니다. 데이터는 오프라인 상태에서도 기기에 유지됩니다. 기기가 네트워크에 연결되어 있으면 Device Sync 는 배경 에서 데이터를 업로드 및 다운로드하고 충돌 해결 을 관리합니다.

클라이언트 앱 과 Atlas 간에 동기화되는 데이터는 적격 데이터에 액세스 할 수 있는 사용자 권한에 따라 결정됩니다. 적격 데이터는 다음의 교집합입니다.

  • 데이터 모델: 데이터 유형 정보

  • 구독 쿼리: 저장 데이터를 정의하는 조건

  • 권한: 지정된 조건을 충족하는 데이터와 상호 작용 하는 데 필요한 역할 기반 권한

Device Sync 에 대한 자세한 설명은 Atlas App Services 문서에서 Atlas Device Sync 시작하기를 참조하세요.

Device Sync 데이터 모델은 동기화할 수 있는 객체 유형을 정의합니다. 여기에는 클라이언트 사이드 및 서버 사이드 스키마가 포함되어 있습니다.

  • Realm 스키마: 코틀린 (Kotlin) 에서 데이터를 정의하는 클라이언트 앱 의 객체 모델 입니다.

  • Atlas App Services 스키마: 에서 Atlas App Services 데이터를 정의하는 BSON 의 스키마입니다.

데이터를 동기화 하려면 두 스키마가 서로 일관적인 해야 합니다.

Device Sync 데이터 모델 은 클라이언트 앱 에서 먼저 정의하거나 Atlas 에서 먼저 정의할 수 있습니다.

  • 클라이언트 앱 을 통해 데이터 모델 을 정의하려면 먼저 클라이언트 앱 코드에서 직접 객체 모델 을 정의합니다 . 그런 다음 개발 모드 를 사용하여 일치하는 App Services 스키마 를 자동으로 생성할 수 있습니다. 개발 모드는 클라이언트에서 데이터를 동기화 할 때 Device Sync 가 클라이언트 클라이언트 사이드 데이터 모델을 기반으로 스키마를 추론하고 업데이트 할 수 있도록 하는 구성 설정입니다. App Services 에서 Device Sync 활성화 섹션에서는 클라이언트 앱 에서 개발 모드로 Device Sync 를 활성화 하는 방법을 설명합니다.

  • Atlas 에 이미 데이터가 있고 먼저 Atlas 를 통해 데이터 모델 을 정의하려는 경우, App Services 문서에서 클라이언트 애플리케이션과 Atlas 의 데이터 동기화 를 참조하세요.

참고

App Services 의 데이터 모델 매핑

클라이언트 와 Atlas 간의 데이터 매핑 방법에 학습 보려면 Device Sync 를 사용한 데이터 모델링 코틀린 SDK (Kotlin SDK) 를 참조하세요.

구독 은 데이터 모델의 객체에 대한 클라이언트 사이드 쿼리입니다. Atlas App Services는 쿼리와 일치하는 객체만 동기화합니다. 클라이언트 앱에서 여러 쿼리를 정의할 수 있습니다. 데이터 모델의 각 객체 유형에 대해 하나 이상의 쿼리를 정의해야 합니다.

Atlas App Services는 쿼리 가능 필드 를 통해 클라이언트 사이드 쿼리가 Atlas App Services 스키마와 일치하는지 확인합니다. 다음은 구독 쿼리에 사용할 수 있는 데이터 모델의 필드입니다. 쿼리 가능 필드에 없는 필드를 사용하여 구독을 정의할 수 없습니다.

개발 모드가 활성화되면 Atlas App Services는 클라이언트 쿼리에 나타나는 필드를 쿼리 가능 필드로 자동으로 추가합니다. Atlas App Services UI를 통해 쿼리 가능 필드를 수동으로 추가하고 제거할 수도 있습니다. 자세한 내용은 Atlas App Services 문서에서 쿼리 가능 필드 를 참조하세요.

App Services 는 역할 기반 권한 을 사용하여 사용자가 읽고 쓰기 (write) 수 있는 데이터를 제어합니다.

  • 사용자에게 읽기 권한이 있는 경우 Device Sync는 구독 쿼리와 일치하는 데이터를 클라이언트에 다운로드합니다.

  • 사용자에게 쓰기 (write) 권한이 있는 경우 Atlas 는 동기화된 데이터에 대한 쓰기를 허용하고 로컬로 작성된 데이터를 백엔드 에 업로드합니다.

Atlas App Services UI에서 역할을 정의하고 관리할 수 있습니다. 동기화를 활성화하면 기본 역할을 선택하게 되며, 이 역할은 나중에 수정할 수 있습니다. 자세한 내용은 Atlas App Services 문서에서 역할 기반 권한 을 참조하세요.

앱 및 데이터 상태에 따라 여러 가지 방법으로 Device Sync를 앱에 추가할 수 있습니다. 이 가이드에서는 개발 모드를 사용하여 기존 클라이언트 앱에 동기화를 추가하는 방법을 설명합니다. 이 가이드에서는 앱이 Realm Kotlin SDK를 사용하고 클라이언트 코드에 데이터 모델을 이미 정의했다고 가정합니다.

Device Sync 는 Atlas App Atlas App Services 앱을 통해 클라이언트 앱을 Atlas App Services 백엔드에 연결하므로 시작하기 전에 다음을 수행해야 합니다.

  1. 인증이 활성화된 Atlas App Services App. 방법을 알아보려면 App Services 설명서에서 App Services 앱 생성을 참조하세요.

  2. 앱이 Atlas App Services 백엔드에 연결할 수 있는지 확인합니다. 방법을 알아보려면 Atlas App Services에 연결 - Kotlin SDK를 참조하세요.

이 페이지의 예제는 Item 객체 목록이 포함된 List 객체를 포함하는 데이터 모델이 이미 정의된 Kotlin Todo 앱의 예시를 참조합니다.

ToDo 앱 데이터 모델 예시
class List : RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId()
var name: String = ""
var ownerId: String = ""
var items: RealmList<Item> = realmListOf()
}
class Item : RealmObject {
@PrimaryKey
var _id: ObjectId = ObjectId()
var name: String = ""
var complete: Boolean = false
}

클라이언트 앱에 동기화를 추가하려면 먼저 Atlas App Services 앱에서 Device Sync를 활성화해야 합니다.

앱에서 Device Sync 를 활성화하려면 Atlas App Services 문서의 Atlas Device Sync구성 및 활성화 절차에 설명된 단계를 완료하세요.

이 프로세스 중에 개발 모드 활성화 여부와 앱 사용자의 기본값 역할 을 선택할 수 있습니다. 사용 가능한 설정에 대한 자세한 내용은 App Services 문서에서 동기화 설정 을 참조하세요.

동기화를 처음 활성화할 때 개발 모드를 활성화한 다음 앱이 프로덕션 환경에 들어가기 전에 비활성화하는 것이 좋습니다. 자세한 내용은 Atlas App Services 문서에서 개발 모드 를 참조하세요.

예시 앱 에서는 개발 모드로 Device Sync 를 활성화 한 다음 기본값 "사용자는 모든 데이터를 읽고 쓰기 (write) 수 있음" 기본값 역할 을 추가합니다. 즉, 네트워크에 연결되어 있는 권한이 부여된 사용자의 경우 Device Sync 가 적격 데이터를 클라이언트 에 다운로드 하고 Atlas 가 클라이언트 에 대한 쓰기를 허용한 다음 백엔드 를 동기화합니다. 권한이 부여된 사용자가 네트워크에 연결되어 있지 않을 때 어떻게 되는지 학습 보려면 쓰기 보상하기를 참조하세요.

Atlas App Services에서 동기화를 구성하고 활성화한 후 클라이언트 앱에 동기화를 추가할 수 있습니다.

1

Realm 코틀린 SDK (Kotlin SDK) 의 동기화 배포를 포함하도록 종속성을 업데이트합니다 .

2

앱 ID를 App 클라이언트에 전달하여 앱을 초기화합니다. Atlas App Services UI에서 앱 ID 를 가져오려면 Atlas App Services 문서에서 앱 ID찾기 를 참조하세요.

예시 앱 에서는 앱 ID 를 전달하여 기본값 구성 값으로 App 를 초기화합니다.

// Replace `YOUR_APP_ID` with your Atlas App ID
val app = App.create(YOUR_APP_ID)

앱 클라이언트 액세스 및 구성에 대한 자세한 내용은 앱 클라이언트 초기화를 참조하세요.

3

활성화한 인증 제공자를 사용하여 클라이언트 앱에서 사용자를 인증합니다.

예시 앱 에서는 익명 인증 을 사용하여 사용자를 로그인 합니다.

// Authenticate the Atlas App Services user
val myAuthenticatedUser = app.login(Credentials.anonymous())

앱 에서 사용자를 인증하는 방법에 대한 자세한 내용은 사용자 생성 및 인증 - 코틀린 SDK (Kotlin SDK) 를 참조하세요.

4

Device Sync 에서 동기화된 영역 을 열려면 SyncConfiguration 객체 가 필요합니다. 이는 동기화되지 않은 영역 을 여는 데 사용되는 RealmConfiguration 객체 와는 다릅니다.

SyncConfiguration 객체 에는 다음이 필요합니다.

  • 사용자: 인증된 사용자 객체입니다.

  • 스키마: 이 영역에 포함하려는 모든 객체 유형입니다.

  • 초기 구독: 동기화된 영역 이 처음 열릴 때 동기화 할 데이터를 지정하는 구독 쿼리 입니다. 영역 이 열린 후에 구독을 업데이트 할 수 있습니다. 자세한 내용은 동기화 구독 관리 - 코틀린 SDK (Kotlin SDK) 를 참조하세요.

추가 구성 매개변수 는 동기화된 Realm - 코틀린 SDK (Kotlin SDK) 구성 및 열기를 참조하세요.

예시 앱 의 경우 다음과 같이 구성을 정의합니다.

  • ListItem 객체를 포함하는 스키마

  • 사용자가 소유한 모든 List 객체와 불완전한 모든 Item 객체를 쿼리하는 초기 구독

// Define the configuration for the synced realm
val config =
// Pass the authenticated user and the set of
// all objects types you want to be able to sync
SyncConfiguration.Builder(
user = myAuthenticatedUser,
schema = setOf(List::class, Item::class)
)
// Define an initial subscription with queries that include
// the user's lists with incomplete items
.initialSubscriptions{ realm ->
add(realm.query<List>("ownerId == $0", myAuthenticatedUser.id),
name = "user-lists"
)
add(realm.query<Item>("complete = false"),
name = "incomplete-items"
)
}
.build()

중요

스키마의 객체 유형

동기화 구성 스키마 에는 동기화된 영역 에서 작업하려는 모든 객체 유형이 포함 되어야 합니다 . 스키마 에 없는 객체 유형의 객체 를 참조하거나 쓰기 (write) 하려고 하면 Realm 에서 스키마 유효성 검사 오류를 반환합니다.

5

정의된 구성을 사용 하여 동기화된 Realm을 엽니다. Realm이 성공적으로 열리면 초기 구독 쿼리에 따라 클라이언트에 동기화할 데이터가 결정됩니다. 개발 모드가 활성화된 경우 Atlas App Services는 스키마에 정의된 쿼리를 기반으로 쿼리 가능 필드를 자동으로 추가합니다.

예제 앱에서는 config 객체를 realm.open() 에 전달하여 동기화된 Realm을 연 다음 구독이 백엔드와 동기화될 때까지 기다립니다.

// Open the synced realm with the defined configuration
val realm = Realm.open(config)
Log.v("Successfully opened synced realm: ${realm.configuration.name}")
// Wait for initial subscriptions to sync to Atlas
realm.subscriptions.waitForSynchronization()

개발 모드가 활성화되어 있으므로 App Services 는 초기 구독 을 기반으로 다음을 쿼리 가능 필드 로 자동으로 추가했습니다.

  • _id (항상 포함됨)

  • ownerId

  • complete

이제 구성된 동기화된 영역 을 열었으므로 영역 에서 데이터로 작업할 수 있습니다. 로컬 데이터로 작업하는 동안 배경 스레드는 변경 세트를 효율적으로 통합, 업로드 및 다운로드합니다.

읽기, 쓰기 (write)변경 사항 감시 구문은 동기화되지 않은 영역의 구문과 동일합니다. 그러나 동기화된 영역 에 데이터를 쓸 때는 추가 고려 사항이 있습니다. 자세한 내용 은 동기화된 Realm 에 데이터 쓰기 - 코틀린 SDK (Kotlin SDK) 를 참조하세요.

예시 앱 에서는 새 ListItem 객체 를 쓰기 (write) 다음 동기화된 영역 에 복사합니다.

// Write List and Item objects to the synced realm
// Objects that match the subscription query are synced to Atlas
realm.write {
val list = List().apply {
name = "My Todo List"
ownerId = myAuthenticatedUser.id
items.add(Item().apply {
name = "Check email"
complete = false
})
}
copyToRealm(list)
}
realm.syncSession.uploadAllLocalChanges(30.seconds)

객체가 디바이스에 성공적으로 기록된 후 다음과 같은 이유로 Atlas와 동기화됩니다.

  • 두 객체 모두 구독 쿼리 의 매개변수 내에 있습니다( List 은 사용자가 소유하고 있으며 Item 는 불완전합니다).

  • 현재 사용자는 백엔드 에 데이터를 쓰기 (write) 수 있는 권한이 있습니다(이 역할 통해 권한이 부여된 사용자는 모든 데이터를 읽고 쓰기 (write) 수 있음).

쓰기 (write) 작업이 쿼리 와 일치하지 않거나 현재 사용자에게 필요한 권한이 없는 경우 Realm 은 보상 쓰기 (write)라는 치명적이지 않은 오류 작업을 통해 쓰기 (write) 를 되돌립니다.

앱이 원하는 데이터를 Atlas에 성공적으로 동기화하면 Kotlin SDK와 동기화를 사용하는 방법에 대해 자세히 알아볼 수 있습니다.

돌아가기

디바이스 데이터 동기화