Docs Menu
Docs Home
/ /
Atlas Device SDK

빠른 시작 - Node.js SDK

이 페이지의 내용

  • Realm 가져오기
  • 객체 모델 정의
  • Realm 열기
  • 객체 찾기, 정렬 및 필터링
  • Realm 객체 생성, 수정 및 삭제
  • 컬렉션 보기
  • Realm 닫기
  • Device Sync 추가(선택 사항)
  • 전제 조건
  • 앱 초기화
  • 사용자 인증
  • 객체 모델 정의
  • 동기화된 Realm 열기

이 페이지에는 Realm을 앱에 빠르게 통합하기 위한 정보가 포함되어 있습니다.

아직 설치하지 않았다면 Realm Node.js SDK 를 설치하세요.

Realm 을 사용하려는 소스 파일 상단에 다음 줄을 추가하여 SDK와 BSON 라이브러리를 가져옵니다.

import Realm, { BSON } from "realm";

애플리케이션의 객체 모델 은 Realm 내에 저장할 수 있는 데이터를 정의합니다.

Realm 객체 유형을 정의하려면 해당 유형의 nameproperties 를 지정하는 스키마 객체를 만듭니다. 유형 이름은 영역의 객체 유형 간에 고유해야 합니다. 특정 속성을 정의하는 방법에 대한 자세한 내용은 객체 속성 정의를 참조하세요.

다음 코드는 Task 객체에 대한 객체 모델을 정의하는 방법을 보여줍니다. 이 예에서는 다음을 수행합니다.

  • primaryKeyint 유형의 _id 입니다. 프라이머리 키에 사용되는 또 다른 일반적인 유형은 ObjectId입니다.

  • name 필드는 필수입니다.

  • statusowner_id 필드는 선택 사항이며 데이터 유형 바로 뒤에 물음표로 표시됩니다.

export class QuickstartTask extends Realm.Object {
static schema = {
name: "Task",
properties: {
_id: "objectId",
name: "string",
status: "string?",
owner_id: "string?",
},
primaryKey: "_id",
};
}
export class QuickstartTask extends Realm.Object<Task> {
_id!: BSON.ObjectID;
name!: string;
status?: string;
owner_id?: string;
static schema: ObjectSchema = {
name: "Task",
properties: {
_id: "objectId",
name: "string",
status: "string?",
owner_id: "string?",
},
primaryKey: "_id",
};
}

Realm을 열려면 Realm .BaseConfiguration 영역 객체 Realm.open()에 전달합니다.

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

다음 코드는 방법을 보여줍니다.

  • "작업" 객체 유형의 모든 인스턴스를 쿼리합니다.

  • 쿼리를 필터링하여 "열린" 작업만 검색합니다.

  • 작업을 이름을 기준으로 오름차순으로 정렬합니다.

// Query for specific obect using primary key.
const specificTask = realm.objectForPrimaryKey(QuickstartTask, testId);
// Query realm for all instances of the "Task" type.
const tasks = realm.objects(QuickstartTask);
// Filter for all tasks with a status of "Open".
const openTasks = tasks.filtered("status = 'Open'");
// Sort tasks by name in ascending order.
const tasksByName = tasks.sorted("name");

Realm을 연 후에는 Realm에서 객체 를 생성, 수정 및 삭제할 수 있습니다. 모든 쓰기 작업은 쓰기 트랜잭션( write transaction) 내에서 발생해야 합니다.

const allTasks = realm.objects(QuickstartTask);
// Add a couple of Tasks in a single, atomic transaction.
realm.write(() => {
realm.create(QuickstartTask, {
_id: firstId,
name: "go grocery shopping",
status: "Open",
});
realm.create(QuickstartTask, {
_id: secondId,
name: "go exercise",
status: "Open",
});
});
const task1 = allTasks.find(
(task) => task._id.toString() == firstId.toString()
);
const task2 = allTasks.find(
(task) => task._id.toString() == secondId.toString()
);
realm.write(() => {
// Modify an object.
task1!.status = "InProgress";
// Delete an object.
realm.delete(task2!);
});

Realm.addListener() 메서드 에 이벤트 핸들러를 등록하여 Realm , 컬렉션 또는 객체의 변경 사항을 감시 할 수 있습니다. Object.addListener() Collection.addListener() 메서드.

중요

알림 순서의 중요성

컬렉션 알림 핸들러에서는 항상 삭제, 삽입, 수정의 순서로 변경 사항을 적용합니다. 삭제하기 전에 삽입을 처리하면 예기치 않은 동작이 발생할 수 있습니다.

다음 예제에서는 애플리케이션 개발자가 Task 컬렉션의 변경 사항을 감시합니다.

// Define the collection notification listener.
const listener = (tasks, changes) => {
// Update UI in response to deleted objects.
changes.deletions.forEach((index) => {
// Deleted objects cannot be accessed directly,
// but we can update a UI list, etc. knowing the index.
console.log(`A task was deleted at the ${index} index.`);
// ...
});
// Update UI in response to inserted objects.
changes.insertions.forEach((index) => {
const insertedTasks = tasks[index];
console.log(`insertedTasks: ${JSON.stringify(insertedTasks, null, 2)}`);
// ...
});
// Update UI in response to modified objects.
// `newModifications` contains an index to the modified object's position
// in the collection after all deletions and insertions have been applied.
changes.newModifications.forEach((index) => {
const modifiedTask = tasks[index];
console.log(`modifiedTask: ${JSON.stringify(modifiedTask, null, 2)}`);
// ...
});
};
// Observe collection notifications.
tasks.addListener(listener);
// Define the collection notification listener.
//@ts-expect-error TYPEBUG: OrderedCollection is incorrectly implemented
const listener: Realm.CollectionChangeCallback = (
tasks: Realm.OrderedCollection<QuickstartTask>,
changes: Realm.CollectionChangeSet
) => {
// Update UI in response to deleted objects.
changes.deletions.forEach((index) => {
// Deleted objects cannot be accessed directly,
// but we can update a UI list, etc. knowing the index.
console.log(`A task was deleted at the ${index} index.`);
// ...
});
// Update UI in response to inserted objects.
changes.insertions.forEach((index) => {
const insertedTasks = tasks[index];
console.log(`insertedTasks: ${JSON.stringify(insertedTasks, null, 2)}`);
// ...
});
// Update UI in response to modified objects.
// `newModifications` contains an index to the modified object's position
// in the collection after all deletions and insertions have been applied.
changes.newModifications.forEach((index) => {
const modifiedTask = tasks[index];
console.log(`modifiedTask: ${JSON.stringify(modifiedTask, null, 2)}`);
// ...
});
};
// Observe collection notifications.
//@ts-expect-error TYPEBUG: OrderedCollection is incorrectly implemented
tasks.addListener(listener);

realm.close() 메서드를 호출하여 메모리 누수를 방지합니다.

// Close the realm.
realm.close();

이 섹션에서는 익명 사용자로 인증하고 Flexible Sync Realm을 열어 기기 간에 데이터를 동기화하는 방법을 설명합니다.

인증 및 동기화와 같은 Atlas App Services 기능을 사용하려면 먼저 앱 를 사용하여 에 액세스해야 App Services App ID합니다. Atlas App Services UI에서 앱 ID를 찾을 수 있습니다.

// Initialize your App.
const app = new Realm.App({
id: "<yourAppId>",
});

사용자를 인증하고 로그인하려면 App.logIn() 을 호출합니다. 익명 인증 이 활성화되면 사용자는 식별 정보를 제공하지 않고도 앱에 즉시 로그인할 수 있습니다.

// Initialize your App.
const app = new Realm.App({
id: "<yourAppId>",
});
// Authenticate an anonymous user.
const anonymousUser = await app.logIn(Realm.Credentials.anonymous());

동기화 영역의 객체 모델은 로컬 전용 Realms 와 동일한 방식으로 작동합니다. 로컬 전용 Realm에서와 마찬가지로 객체 모델을 정의하세요.

export class QuickstartTask extends Realm.Object {
static schema = {
name: "Task",
properties: {
_id: "objectId",
name: "string",
status: "string?",
owner_id: "string?",
},
primaryKey: "_id",
};
}
export class QuickstartTask extends Realm.Object<Task> {
_id!: BSON.ObjectID;
name!: string;
status?: string;
owner_id?: string;
static schema: ObjectSchema = {
name: "Task",
properties: {
_id: "objectId",
name: "string",
status: "string?",
owner_id: "string?",
},
primaryKey: "_id",
};
}

앱을 초기화하고, 사용자를 인증하고, 객체 모델을 정의한 후에는 SyncConfiguration을 만들 수 있습니다.

Flexible Sync Realm을 열려면 Realm.open() 을 호출합니다. SyncConfiguration 객체를 정의하는 sync 속성을 포함해야 하는 BaseConfiguration 객체를 전달합니다. Flexible Sync를 사용하려면 SyncConfiguration에 userflexible: true 를 포함해야 합니다.

또한 영역에서 읽거나 영역에 쓰기를 하려면 먼저 구독이 하나 이상 필요합니다. Configuration.sync.initialSubscriptions 를 사용하여 Realm 파일을 처음 열 때 설정한 초기 구독을 정의합니다.

// Initialize your App.
const app = new Realm.App({
id: "<yourAppId>",
});
// Authenticate an anonymous user.
const anonymousUser = await app.logIn(Realm.Credentials.anonymous());
// Create a `SyncConfiguration` object.
const config = {
schema: [QuickstartTask],
sync: {
// Use the previously-authenticated anonymous user.
user: anonymousUser,
// Set flexible sync to true to enable sync.
flexible: true,
// Define initial subscriptions to start syncing data as soon as the
// realm is opened.
initialSubscriptions: {
update: (subs, realm) => {
subs.add(
// Get objects that match your object model, then filter them by
// the `owner_id` queryable field
realm
.objects(QuickstartTask)
.filtered(`owner_id == "${anonymousUser.id}"`)
);
},
},
},
};
const realm = await Realm.open(config);
// Initialize your App.
const app = new Realm.App({
id: "<yourAppId>",
});
// Authenticate an anonymous user.
const anonymousUser = await app.logIn(Realm.Credentials.anonymous());
// Create a `SyncConfiguration` object.
const config: Realm.Configuration = {
schema: [QuickstartTask],
sync: {
// Use the previously-authenticated anonymous user.
user: anonymousUser,
// Set flexible sync to true to enable sync.
flexible: true,
// Define initial subscriptions to start syncing data as soon as the
// realm is opened.
initialSubscriptions: {
update: (subs, realm) => {
subs.add(
// Get objects that match your object model, then filter them by
// the `owner_id` queryable field
realm
.objects(QuickstartTask)
.filtered(`owner_id == "${anonymousUser.id}"`)
);
},
},
},
};
const realm = await Realm.open(config);

동기화된 영역에서 변경 사항을 읽고, 쓰고, 보는 구문은 위의 동기화되지 않은 영역의 구문과 동일합니다. 로컬 데이터로 작업하는 동안 백그라운드 스레드는 변경 세트를 효율적으로 통합, 업로드 및 다운로드합니다.

다음

Atlas Device SDK Docs에 오신 것을 환영합니다