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;
}
}
이 예제는 입력으로 받은 점수와 객체의 연결을 반환합니다. 객체의 속성을 수정하거나 점수를 영구 저장하지는 않습니다.