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와 보조 메타 파일로 관리합니다.
주요 설정
| 설정 | 설명 |
|---|---|
ContractBasePath | function XML 계약 루트 목록입니다. |
NodeFunctionConfig | Node.js localStorage, 로그, timeout, 단일/멀티 프로세스, 파일 감시 설정입니다. |
CSharpFunctionConfig | C# 함수 로그와 파일 감시 설정입니다. |
PythonFunctionConfig | Python 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 거래 계약에서는 CommandType을 F로 둡니다.
{
"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 작업에서 병목이 될 수 있습니다.
- 작업 디렉터리에는 임시 파일과 실행 결과가 남을 수 있으므로 정리 정책을 둡니다.