객체 모델 변경 - Node.js SDK
스키마 버전
스키마 버전은 특정 시점의 영역 스키마 상태를 식별합니다. Realm은 각 영역의 스키마 버전을 추적하고 이를 사용하여 각 영역의 객체를 올바른 스키마에 매핑합니다.
스키마 버전은 영역을 열 때 영역 구성에 선택적으로 포함할 수 있는 오름차순 정수입니다. 클라이언트 애플리케이션이 영역을 열 때 버전 번호를 지정하지 않으면 영역은 버전에 기본값인 0
을 사용합니다.
중요
단조적 버전 증가
마이그레이션은 realm을 더 높은 스키마 버전으로 업데이트해야 합니다. 클라이언트 애플리케이션이 영역의 현재 버전보다 낮은 스키마 버전의 realm을 열거나 지정된 스키마 버전이 realm의 현재 버전과 동일하지만 다른 객체 스키마를 포함하는 경우 realm에서 오류가 발생합니다.
마이그레이션
마이그레이션 은 Realm과 Realm에 포함된 모든 객체를 한 스키마 버전에서 최신 버전으로 업데이트하는 기능입니다. 마이그레이션을 사용하면 새로운 기능과 리팩터링을 수용하기 위해 시간이 지남에 따라 객체 스키마를 유연하게 변경할 수 있습니다.
팁
개발 중 마이그레이션 우회
애플리케이션을 개발하거나 디버깅할 때 Realm을 마이그레이션하는 대신 삭제하는 것이 나을 수 있습니다. 스키마 불일치로 인해 마이그레이션이 필요한 경우 deleteRealmIfMigrationNeeded
플래그를 사용하여 데이터베이스를 자동으로 삭제합니다.
이 플래그를 true
로 설정한 상태에서는 앱을 프로덕션에 배포하지 마세요.
Realm의 현재 버전보다 큰 스키마 버전을 가진 기존 Realm을 열 때마다 Realm은 사용자가 정의한 마이그레이션 함수를 실행합니다. 이 함수는 Realm의 버전 번호에 액세스할 수 있으며 새 스키마에 맞게 Realm의 객체를 점진적으로 업데이트합니다.
Realm은 새 속성 및 삭제된 속성과 같은 특정 변경 사항을 자동으로 마이그레이션하지만 업데이트된 객체 스키마에서 기본값을 지정하지 않는 한 새 속성에 대한 값을 자동으로 설정하지 않습니다. 마이그레이션 기능에서 추가 논리를 정의하여 속성 값을 추가로 사용자 정의할 수 있습니다.
속성 추가
스키마에 속성을 추가하려면 객체의 클래스에 새 속성을 추가하고 Realm 구성 객체의 schemaVersion
을 설정합니다.
예시
스키마 버전 1
을 사용하는 영역 에는 firstName
및 lastName
속성 이 있는 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
객체 유형이 있습니다. 원래 스키마에는 firstName
및 lastName
필드가 있었습니다. 개발자는 나중에 Person
클래스가 결합된 fullName
필드를 사용해야 한다고 결정하고 별도의 firstName
및 lastName
필드를 제거합니다.
업데이트된 Person
스키마를 준수하도록 Realm을 마이그레이션하려면 개발자는 Realm의 스키마 버전 을 2
로 설정하고 기존 firstName
및 lastName
속성을 기반으로 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}`; } } } });
속성 유형 수정
속성 유형을 수정하려면 수정하려는 필드의 속성 유형을 새 데이터 유형으로 설정합니다. 그런 다음 Realm 구성 객체의 schemaVersion
및 migration
콜백 함수를 설정합니다.
참고
동기화된 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(); } } }, });