Workshop에서 Python 함수 사용
게시한 Python 함수는 Workshop의 Variables 탭에서 검색하여 변수나 객체 표의 계산 열에 연결할 수 있습니다. 온톨로지 객체를 사용하는 함수는 생성 SDK가 필요합니다.
실행 모드와 가용 상태
서버리스 함수와 배포형 함수가 모두 선택기에 나타납니다. 서버리스는 수동 배포 없이 원하는 버전을 실행할 수 있습니다. 배포형은 함수와 버전에 다음 상태를 표시합니다.
| 상태 | 의미 |
|---|---|
| Running | 현재 요청을 처리할 수 있습니다. |
| Stopped | 요청을 처리하지 않습니다. 정보 아이콘에 마우스를 올리고 Configure > Create and start deployment로 배포를 시작합니다. |
| Upgrading | 업그레이드 중이며 아직 요청을 처리할 수 없습니다. |
배포형 함수의 새 릴리스
배포형은 저장소의 한 버전만 호스팅합니다. 중단을 줄이려면 새 버전에 기존 function_v0와 수정한 function_v1을 함께 포함하여 태그를 게시할 수 있습니다. 이는 서로 다른 저장소 버전을 동시에 배포하는 방식이 아니라 한 새 버전 안에 두 메서드를 두는 방식입니다.
게시 함수의 Tags and releases에서 Open in Ontology Manager를 선택하고 사용할 저장소 버전을 고른 뒤 Upgrade를 선택합니다.
기존 배포 버전은 더 이상 실행되지 않으므로 하위 앱이 사용하는 버전을 새 배포로 바꿔야 합니다. 이 전환 중 짧은 중단이 발생할 수 있습니다. 새 버전에 이전 함수도 포함하면 앱의 버전을 먼저 바꾸고 함수 자체는 나중에 바꿀 수 있습니다. 이전 함수의 모든 사용이 끝난 뒤 제거합니다.
실행 오류 확인
계산 결과가 잘못되면 기반 코드 저장소의 로직을 확인합니다. 응답이 없거나 실행 오류가 나면 먼저 선택한 버전의 상태를 확인합니다.
배포가 없거나 Upgrading이면 정보 아이콘의 Configure로 Ontology Manager를 열어 상태를 확인하고 필요한 배포를 시작합니다. 이미 진행 중인 업그레이드가 끝나기 전에는 새 버전이 요청을 처리할 수 없습니다.
Running인데도 문제가 있으면 Ontology Manager의 Deployment에서 상세 로그를 확인합니다. View live로 SLS 라이브 로그를 볼 수 있습니다.
서버리스 함수에는 수동 배포 시작 절차를 적용하지 않습니다. 실행 모드별 운영은 배포 설정을 따릅니다.
함수 기반 객체 표 열
객체 표에 전달할 함수는 다음 계약을 따릅니다.
- 입력에 ontology_sdk.ontology.object_sets의 객체 집합 타입을 포함합니다. 필요하면 다른 입력도 추가합니다. list[ObjectType]도 가능하지만 객체를 먼저 로드하므로 집합 입력이 권장됩니다.
- 한 열은 dict[ObjectType, ColumnType], 여러 열은 dict[ObjectType, CustomType]으로 반환합니다.
게시 후 Object Table의 함수 기반 속성 열 설정에서 함수를 선택합니다. 반환 맵의 키가 각 표 객체를 가리킵니다.
한 열 계산
가상의 MyObjectType에 Integer quantity와 Double unit_price가 있다고 가정합니다. 각 객체의 수량과 단가로 총액을 계산합니다.
from functions.api import Double, UserFacingError, function
from ontology_sdk.ontology.object_sets import MyObjectTypeObjectSet
from ontology_sdk.ontology.objects import MyObjectType
@function
def function_backed_column_single_col(selected_objects: MyObjectTypeObjectSet) -> dict[MyObjectType, Double]:
result: dict[MyObjectType, Double] = {}
for obj in selected_objects:
if obj.quantity is None or obj.unit_price is None:
raise UserFacingError("수량과 단가가 필요합니다.")
result[obj] = obj.quantity * obj.unit_price
return result
여러 열 계산
같은 객체에서 수량, 총액과 표시 통화를 함께 반환합니다. currency는 실제 계산이나 환율 변환을 수행하지 않는 통화 표기 입력입니다.
from dataclasses import dataclass
from functions.api import Double, Integer, String, UserFacingError, function
from ontology_sdk.ontology.object_sets import MyObjectTypeObjectSet
from ontology_sdk.ontology.objects import MyObjectType
@dataclass
class CostColumns:
quantity: Integer
total: Double
currency: String
@function
def function_backed_column_multiple_cols(
selected_objects: MyObjectTypeObjectSet,
currency: String,
) -> dict[MyObjectType, CostColumns]:
result: dict[MyObjectType, CostColumns] = {}
for obj in selected_objects:
if obj.quantity is None or obj.unit_price is None:
raise UserFacingError("수량과 단가가 필요합니다.")
result[obj] = CostColumns(
quantity=obj.quantity,
total=obj.quantity * obj.unit_price,
currency=currency,
)
return result
두 예제는 계산 결과를 반환하며 원래 객체 속성을 수정하지 않습니다.