Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

객체 모델 변경 - Node.js SDK

이 페이지의 내용

  • 스키마 버전
  • 마이그레이션
  • 속성 추가
  • 속성 삭제
  • 속성 이름 바꾸기
  • 속성 유형 수정

스키마 버전은 특정 시점의 영역 스키마 상태를 식별합니다. Realm은 각 영역의 스키마 버전을 추적하고 이를 사용하여 각 영역의 객체를 올바른 스키마에 매핑합니다.

스키마 버전은 영역을 열 때 영역 구성에 선택적으로 포함할 수 있는 오름차순 정수입니다. 클라이언트 애플리케이션이 영역을 열 때 버전 번호를 지정하지 않으면 영역은 버전에 기본값인 0을 사용합니다.

중요

단조적 버전 증가

마이그레이션은 realm을 더 높은 스키마 버전으로 업데이트해야 합니다. 클라이언트 애플리케이션이 영역의 현재 버전보다 낮은 스키마 버전의 realm을 열거나 지정된 스키마 버전이 realm의 현재 버전과 동일하지만 다른 객체 스키마를 포함하는 경우 realm에서 오류가 발생합니다.

마이그레이션 은 Realm과 Realm에 포함된 모든 객체를 한 스키마 버전에서 최신 버전으로 업데이트하는 기능입니다. 마이그레이션을 사용하면 새로운 기능과 리팩터링을 수용하기 위해 시간이 지남에 따라 객체 스키마를 유연하게 변경할 수 있습니다.

개발 중 마이그레이션 우회

애플리케이션을 개발하거나 디버깅할 때 Realm을 마이그레이션하는 대신 삭제하는 것이 나을 수 있습니다. 스키마 불일치로 인해 마이그레이션이 필요한 경우 deleteRealmIfMigrationNeeded 플래그를 사용하여 데이터베이스를 자동으로 삭제합니다.

이 플래그를 true로 설정한 상태에서는 앱을 프로덕션에 배포하지 마세요.

Realm의 현재 버전보다 큰 스키마 버전을 가진 기존 Realm을 열 때마다 Realm은 사용자가 정의한 마이그레이션 함수를 실행합니다. 이 함수는 Realm의 버전 번호에 액세스할 수 있으며 새 스키마에 맞게 Realm의 객체를 점진적으로 업데이트합니다.

Realm은 새 속성 및 삭제된 속성과 같은 특정 변경 사항을 자동으로 마이그레이션하지만 업데이트된 객체 스키마에서 기본값을 지정하지 않는 한 새 속성에 대한 값을 자동으로 설정하지 않습니다. 마이그레이션 기능에서 추가 논리를 정의하여 속성 값을 추가로 사용자 정의할 수 있습니다.

참고

동기화된 Realm의 스키마 속성 수정

다음 페이지에서는 로컬 영역 의 스키마 속성을 수정하는 방법을 설명합니다. 동기화된 영역 의 스키마 속성을 수정하는 방법을 알아보세요.

스키마에 속성을 추가하려면 객체의 클래스에 새 속성을 추가하고 Realm 구성 객체의 schemaVersion설정합니다.

예시

스키마 버전 1 을 사용하는 영역 에는 firstNamelastName 속성 이 있는 Person 객체 유형이 있습니다. 개발자 는 Person 클래스에 age 속성 을 추가하기로 결정합니다.

업데이트된 Person 스키마를 준수하도록 Realm을 마이그레이션하려면 개발자는 Realm의 스키마 버전2 로 설정합니다.

const Person = {
name: 'Person',
properties: {
firstName: 'string',
lastName: 'string',
age: 'int'
}
}
const realm = await Realm.open({
schema: [Person],
schemaVersion: 2
});

스키마에서 속성을 삭제하려면 객체의 클래스에서 속성을 제거하고 Realm 구성 객체의 schemaVersion 를 설정합니다. 속성을 삭제해도 기존 객체에는 영향을 주지 않습니다.

예시

스키마 버전 1을 사용하는 영역에 weight 속성을 가진 Dog 객체 유형이 있습니다. 개발자는 스키마에서 속성을 제거하기로 결정합니다.

업데이트된 Dog 스키마를 준수하도록 Realm을 마이그레이션하려면 개발자는 Realm의 스키마 버전2 로 설정합니다.

const realm = await Realm.open({
schema: [Dog],
schemaVersion: 2
});

객체 속성 의 이름을 변경하려면 객체 스키마 에서 속성 이름을 변경한 다음 증가된 스키마 버전 과 새 속성 이름을 사용하도록 기존 객체를 업데이트하는 마이그레이션 함수로 영역 을 엽니다.

마이그레이션을 통해 속성 의 이름을 직접 변경할 수는 없습니다. 대신 업데이트된 이름으로 새 속성 을 만들고 이전 속성의 값을 복사한 다음 이전 속성 을 삭제 수 속성.

예시

스키마 버전 1 을 사용하는 영역에 Person 객체 유형이 있습니다. 원래 스키마에는 firstNamelastName 필드가 있었습니다. 개발자는 나중에 Person 클래스가 결합된 fullName 필드를 사용해야 한다고 결정하고 별도의 firstNamelastName 필드를 제거합니다.

업데이트된 Person 스키마를 준수하도록 Realm을 마이그레이션하려면 개발자는 Realm의 스키마 버전2 로 설정하고 기존 firstNamelastName 속성을 기반으로 fullName 값을 설정하는 마이그레이션 함수를 정의합니다. .

Realm.open({
schema: [Person],
schemaVersion: 2,
onMigration: (oldRealm, newRealm) => {
// only apply this change if upgrading to schemaVersion 2
if (oldRealm.schemaVersion < 2) {
const oldObjects = oldRealm.objects('Person');
const newObjects = newRealm.objects('Person');
// loop through all objects and set the fullName property in the new schema
for (const objectIndex in oldObjects) {
const oldObject = oldObjects[objectIndex];
const newObject = newObjects[objectIndex];
newObject.fullName = `${oldObject.firstName} ${oldObject.lastName}`;
}
}
}
});

중요

동기화된 Realms

동기화된 영역은 이전 클라이언트가 최신 클라이언트와 동기화할 수 있도록 호환성을 깨뜨리지 않는(non-breaking) 변경 사항(추가 변경 고도 사항이라고)만 지원합니다. 전체 이름을 바꾸려면 이전 속성을 삭제해야 하므로 클라이언트 재설정 없이는 동기화된 속성의 이름을 바꿀 수 없습니다. 이전 속성을 삭제하지 않고 이름을 바꾼 속성을 추가하는 것이 좋습니다. 아니면 mapTo를 사용하면 기존의 내부 이름을 사용하여 데이터를 저장하되 코드에서 다른 이름을 사용하도록 할 수 있습니다.

속성 유형을 수정하려면 수정하려는 필드의 속성 유형을 새 데이터 유형으로 설정합니다. 그런 다음 Realm 구성 객체의 schemaVersionmigration 콜백 함수를 설정합니다.

참고

동기화된 Realm 은 이전 클라이언트가 최신 클라이언트와 동기화 할 수 있도록 호환성이 손상되지 않는 변경만 지원 합니다. 즉, 동기화된 Realm은 스키마 속성 유형 수정을 지원 하지 않습니다.

예시

스키마 버전 1 을 사용하는 영역 에 Dog 객체 유형이 있습니다. 원래 스키마 에는 속성 유형이 Object ID_id 이(가) 있었습니다. 개발자 나중에 Dog 클래스의 _id 필드 가 string 유형이어야 한다고 결정하고 스키마 를 업데이트합니다.

업데이트된 Dog 스키마를 준수하도록 Realm을 마이그레이션하기 위해 개발자는 Realm의 스키마 버전2 로 설정하고 Object ID 유형을 string 유형으로 변환하는 마이그레이션 함수를 정의합니다.

const realm = await Realm.open({
schema: [Dog],
schemaVersion: 2,
onMigration: (oldRealm, newRealm) => {
if(oldRealm.schemaVersion < 2){
const oldObjects = oldRealm.objects('Dog');
const newObjects = newRealm.objects('Dog');
// loop through all objects and set the _id property in the new schema
for (const objectIndex in oldObjects) {
const oldObject = oldObjects[objectIndex];
const newObject = newObjects[objectIndex];
newObject._id = oldObject._id.toHexString();
}
}
},
});

돌아가기

관계 & 내장된 객체