Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

TypeScript v1 객체 식별

온톨로지 객체는 JavaScript 인스턴스와 별개의 업무상 식별자를 가집니다. TSv1에서 같은 온톨로지 객체를 서로 다른 조회로 얻으면 JavaScript 참조가 다를 수 있으므로 식별 필드로 비교해야 합니다.

RID와 기본 키

리소스 식별자(Resource identifier, RID)는 객체가 기반 데이터셋에서 인덱싱되거나 액션으로 생성될 때 부여합니다. TSv1 객체의 rid 타입은 string | undefined입니다. 기존 객체에는 RID가 있지만 함수에서 새로 만든 객체는 실제 적용 전 rid가 undefined입니다.

객체 유형과 기본 키로도 객체를 식별할 수 있습니다. 기본 키는 지정된 속성의 ID와 값으로 정하며, 예를 들어 Employee의 String employeeId가 될 수 있습니다. 새 객체를 만들 때도 기본 키가 필요하므로 typeId와 primaryKey는 항상 존재합니다.

기본 키의 고유성은 유형 안에서만 성립합니다. 다른 유형에서 같은 키 값을 쓰는 객체를 구분하려면 typeId도 필요합니다.

동일 객체 비교

객체를 입력으로 받고 같은 객체를 Objects.search로 다시 로드해도 a === b 또는 a == b가 참이라는 보장은 없습니다. 두 연산은 JavaScript 인스턴스 참조를 비교합니다.

RID만 비교하면 아직 생성 중인 두 객체의 rid가 모두 undefined인 경우를 구분하지 못합니다. 공통 OntologyObject에 대한 비교 helper는 다음과 같습니다.

import { OntologyObject } from "@foundry/functions-api";

export function isEqual(o1: OntologyObject, o2: OntologyObject): boolean {
    return o1.typeId === o2.typeId &&
        JSON.stringify(o1.primaryKey) === JSON.stringify(o2.primaryKey);
}

업무의 String 키를 별도 함수 입력이나 문자열 맵에 사용할 때는 스키마에 정의한 employeeId 같은 속성을 사용합니다. 공통 primaryKey 필드가 언제나 그 문자열 자체라고 가정해서는 안 됩니다.

객체를 키로 저장

JavaScript Map은 객체 키를 참조로 구분하므로, 다른 조회에서 얻은 같은 업무 객체로 다시 조회하면 값을 찾지 못할 수 있습니다. TSv1 FunctionsMap은 온톨로지 객체를 키로 사용하는 매핑을 지원합니다.

import { Function, FunctionsMap, Integer } from "@foundry/functions-api";
import { Employee } from "@foundry/ontology-api";

export class ObjectMappingFunctions {
    @Function()
    public attachScore(employee: Employee, score: Integer): FunctionsMap<Employee, Integer> {
        const result = new FunctionsMap<Employee, Integer>();
        result.set(employee, score);
        return result;
    }
}

이 예제는 입력으로 받은 점수와 객체의 연결을 반환합니다. 객체의 속성을 수정하거나 점수를 영구 저장하지는 않습니다.