온톨로지FunctionsFunctions called through the API gateway쿼리

본 번역은 검증되지 않았습니다. AIP를 통해 영문원문으로부터 번역되었습니다.

쿼리

쿼리는 선택적으로 API 게이트웨이를 통해 노출될 수 있는 Function의 읽기 전용 하위 집합입니다. 온톨로지를 수정하거나 외부 시스템을 변경하는 것과 같은 부작용을 가질 수 없습니다. API 게이트웨이를 통한 추가 편집 기능이 필요한 경우 액션을 사용해야 합니다.

쿼리 데코레이터

Query 데코레이터를 사용하려면 @foundry/functions-api 패키지에서 가져옵니다.

Copied!
1 2 // "@foundry/functions-api"로부터 Query를 가져옵니다. import { Query } from "@foundry/functions-api";

데코레이터는 선택적 파라미터인 apiName을 받아들이며, 이는 스트링 유형입니다. 이를 사용하여 API 이름을 정의할 수 있습니다.

예시: 간단한 쿼리

이 간단한 쿼리의 예시는 특정 시간 이후에 출발하는 항공기의 수를 반환합니다. 여기서 API 이름은 정의되지 않았습니다. 간단한 쿼리는 기존의 @Function 데코레이터로 태그된 Functions와 유사하게 동작합니다.

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 // "@foundry/functions-api"에서 Query, Double을 import 합니다. import { Query, Double } from "@foundry/functions-api"; // "@foundry/ontology-api"에서 Objects, Aircraft를 import 합니다. import { Objects, Aircraft } from "@foundry/ontology-api"; // PublishedQueries라는 클래스를 export합니다. export class PublishedQueries { // Query 데코레이터가 달린 countAircraftTakingOffAfter라는 비동기 함수를 정의합니다. // 이 함수는 minimumTimeInMinutes라는 Double 타입의 매개변수를 받아서 Double 타입의 프로미스를 반환합니다. @Query() public async countAircraftTakingOffAfter(minimumTimeInMinutes: Double): Promise<Double> { // Objects.search().aircraft()를 통해 항공기를 검색하고, // 그 중에서 timeUntilNextFlight가 minimumTimeInMinutes보다 큰 항공기를 필터링하여 그 수를 aircaftCount에 저장합니다. const aircaftCount = await Objects.search().aircraft() .filter(aircraft => aircraft.timeUntilNextFlight.range().gt(minimumTimeInMinutes)) .count(); // aircaftCount를 반환합니다. return aircaftCount!; } }

예제: API 이름이 지정된 쿼리

Foundry의 API를 통해 쿼리에 접근할 수 있도록 하기 위해, 우리는 Query 데코레이터에서 apiName이라는 선택적 파라미터를 제공합니다. 아래의 예제는 이전 쿼리를 API 게이트웨이를 통해 공개하는 방법을 보여줍니다:

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 // 필요한 라이브러리들을 import 합니다. import { Query, Double } from "@foundry/functions-api"; import { Objects, Aircraft } from "@foundry/ontology-api"; // PublishedQueries라는 클래스를 선언합니다. export class PublishedQueries { // getReschedulableAircraftCount라는 이름으로 Query를 선언하고 있습니다. @Query({ apiName: "getReschedulableAircraftCount" }) // 최소 시간 이후에 이륙하는 비행기의 수를 계산하는 함수를 선언합니다. public async countAircraftTakingOffAfter(minimumTimeInMinutes: Double): Promise<Double> { // 쿼리를 이용하여, 이륙 시간이 설정된 최소 시간 이후인 비행기들의 총 수를 계산합니다. const aircaftCount = await Objects.search().aircraft() .filter(aircraft => aircraft.timeUntilNextFlight.range().gt(minimumTimeInMinutes)) .count(); // 계산된 비행기의 수를 반환합니다. return aircaftCount!; } }

API 이름 유효성 검사

쿼리의 apiName은 다음 요구 사항을 충족하는 문자열이어야 합니다:

  • lowerCamelCase에 있어야 합니다.
  • 100자 이하여야 합니다.
  • 처음에 숫자가 포함되지 않아야 합니다.
  • 저장소에 가져온 모든 온톨로지 중에서 고유해야 합니다.
    • apiName이 고유하지 않으면 태깅 프로세스가 실패하여 이름을 변경해야 합니다.

또한 API-named 쿼리가 포함된 저장소는 적어도 하나의 온톨로지에서 엔티티를 가져와야 합니다.

버전 및 업데이트 API-named 쿼리

API-named 쿼리는 항상 게시된 쿼리의 최신 태그 버전을 사용하며 Foundry Functions의 다른 의미론적 버전 관리 패러다임을 따르지 않습니다.

API 게이트웨이에서 API 이름과 쿼리를 분리하고 해제하려면 Query 데코레이터에서 API 이름을 제거하고 저장소에서 새 태그를 릴리스해야 합니다.

데코레이터에서 API 이름을 변경하고 새 태그를 게시하면 소비자가 중단됩니다. 쿼리의 최신 게시된 버전만 지원됩니다.

소비자가 중단 없이 편리하게 업그레이드할 수 있도록 하려면 동일한 API 이름의 여러 버전을 지원할 수도 있습니다. 이렇게 하려면 저장소에서 쿼리 코드를 복사하고 다른 API 이름을 지정해야 합니다(예: getReschedulableAircraftCountV2).

검색 및 보기 쿼리

다른 Functions와 마찬가지로 Ontology Manager에서 쿼리를 검색하고 관리할 수 있습니다. 쿼리 이름이나 API 이름으로 검색할 수 있습니다.

아래 예에서 쿼리는 각각 API 이름인 getReschedulableAircraftCount와 쿼리 이름인 countAircraftTakingOffAfter입니다.

Ontology Manager에서 쿼리 검색

저장소의 functions.json 파일을 업데이트하여 enableQueries 속성을 true로 설정함으로써 쿼리를 활성화할 수 있습니다:

Copied!
1 2 3 { "enableQueries": true // 쿼리 활성화 }