본문으로 건너뛰기

function

function은 XML 함수 계약을 기준으로 C#, Node.js, Python 함수를 실행하는 모듈입니다. 업무 로직이 단순 SQL로 끝나지 않거나 외부 라이브러리, 파일, 계산 로직이 필요한 경우 transact에서 CommandType=F로 라우팅해 사용합니다.

책임 범위

  • 함수 계약을 로드하고 ApplicationID|ProjectID|TransactionID|FunctionID 기준으로 실행합니다.
  • C#, Node.js, Python 런타임별 실행 환경과 파일 감시 정책을 관리합니다.
  • FunctionSource의 데이터 원본과 작업 디렉터리를 함수 실행 컨텍스트에 제공합니다.
  • BeforeTransaction, AfterTransaction, FallbackTransaction 같은 계약 흐름을 처리합니다.
  • 실행 로그를 런타임별 파일 경로와 logger 모듈로 분리해 남깁니다.

주요 API

메서드경로용도
GET/function/api/execution/has함수 계약 존재 여부를 확인합니다.
GET/function/api/execution/refresh함수 계약 캐시를 갱신합니다.
GET/function/api/execution/retrieve함수 계약 원문 또는 상세 정보를 조회합니다.
GET/function/api/execution/meta입력/출력 메타 정보를 반환합니다.
POST/function/api/execution함수 계약을 실행합니다.

핵심 구현

  • Areas/function/Controllers/ExecutionController.cs: execution API 진입점입니다.
  • DataClient/FunctionClient.cs: 런타임 선택, 계약 실행, 결과 변환을 담당합니다.
  • Builder: C# 함수 동적 컴파일과 실행을 담당합니다.
  • Entity/ModuleConfigJson.cs: Node/C#/Python 런타임 설정과 FunctionSource 스키마입니다.
  • Contracts/function: 샘플 함수 계약과 featureMain.*, featureMeta.json 구조를 제공합니다.

계약과 식별자

계약은 기본적으로 다음 위치에 둡니다.

contracts/function/{ApplicationID}/{ProjectID}/{TransactionID}.xml

함수 ID는 다음 형식입니다.

ApplicationID|ProjectID|TransactionID|FunctionID

계약에는 EntryType, EntryMethod, FunctionSource, 입력/출력 모델, 전후 처리 거래가 포함됩니다. 실제 함수 코드는 계약이 가리키는 디렉터리의 featureMain.cs, featureMain.js, featureMain.py와 보조 메타 파일로 관리합니다.

주요 설정

설정설명
ContractBasePathfunction XML 계약 루트 목록입니다.
NodeFunctionConfigNode.js localStorage, 로그, timeout, 단일/멀티 프로세스, 파일 감시 설정입니다.
CSharpFunctionConfigC# 함수 로그와 파일 감시 설정입니다.
PythonFunctionConfigPython DLL 사용 여부, DLL 경로, 로그와 파일 감시 설정입니다.
FunctionSource함수에서 사용할 데이터 원본, 연결 문자열, 작업 디렉터리입니다.
IsContractFileWatching함수 계약 파일 변경 감시 여부입니다.

FunctionSource 예시는 다음과 같습니다.

{
"ApplicationID": "HDS",
"ProjectID": "*",
"DataSourceID": "FN01",
"DataProvider": "SQLite",
"ConnectionString": "URI=file:../sqlite/HDS/dbclient/HDS.db;Journal Mode=Off;BinaryGUID=False;DateTimeFormat=Ticks;Version=3;",
"IsEncryption": "N",
"WorkingDirectoryPath": "../tmp/HDS/function/HDS_FN01"
}

transact 연동

transact 거래 계약에서는 CommandTypeF로 둡니다.

{
"ServiceID": "FN010",
"CommandType": "F",
"ReturnType": "Json"
}

라우팅 예시는 다음과 같습니다.

{
"HDS|*|F|D": "http://localhost:8421/function/api/execution",
"HDS|*|F|P": "http://localhost:8421/function/api/execution",
"HDS|*|F|T": "http://localhost:8421/function/api/execution"
}

Python 런타임 메모

Python 함수는 PythonFunctionConfig.EnablePythonDLL=true일 때 지정된 Python DLL을 로드합니다. Windows에서는 python311.dll 또는 설치 버전에 맞는 DLL 경로를, Linux/macOS에서는 libpython 경로를 실제 환경에 맞춰 지정합니다.

{
"PythonFunctionConfig": {
"EnablePythonDLL": true,
"PythonDLLFilePath": "C:/anaconda3/envs/myenv/python311.dll"
}
}

운영 주의사항

  • 함수 코드는 서버에서 실행되므로 외부 패키지, 파일 접근, 네트워크 접근 권한을 배포 단위로 검토합니다.
  • EnableFileWatching은 개발 생산성에는 좋지만 운영 환경에서는 의도치 않은 reload를 막기 위해 신중히 사용합니다.
  • Node.js 단일 스레드 설정과 timeout은 장시간 작업 또는 CPU 작업에서 병목이 될 수 있습니다.
  • 작업 디렉터리에는 임시 파일과 실행 결과가 남을 수 있으므로 정리 정책을 둡니다.