Skip to content

스크립트 개발 / 함수 작성 및 호출

본 문서는 DataFlux Func에서 스크립트를 개발하기 위한 가장 기본적인 문서이며, 읽고 나면 DataFlux Func에서 가장 기본적인 개발 및 사용 작업을 수행할 수 있습니다.

1. 읽기 전 안내

DataFlux Func 사용 중에는,

여러 명이 같은 계정으로 로그인하지 말고, 여러 명이 동시에 같은 코드를 편집하지 마십시오.

코드가 서로 덮어쓰여 분실되는 문제를 방지하기 위함입니다.

2. 첫 번째 함수 작성 및 호출

DataFlux Func에서 코드를 작성하는 것은 일반적인 Python 코드 작성과 크게 다르지 않습니다. API로 노출해야 하는 함수에는 내장된 @DFF.API(...) 데코레이터를 추가하기만 하면 됩니다.

함수의 반환값이 곧 인터페이스의 반환값이며, 반환값이 dict, list인 경우 시스템은 자동으로 JSON으로 반환합니다.

전형적인 함수의 예는 다음과 같습니다.

Python
1
2
3
4
5
6
@DFF.API('Hello, world')
def hello_world(message=None):
    ret = {
        'message': message
    }
    return ret

DataFlux Func 플랫폼은 DFF.API(...) 데코레이터가 적용된 함수를 호출하는 여러 가지 방법을 제공합니다:

실행 기능 특징 적용 시나리오
동기 실행 함수 API 동기 HTTP API를 생성합니다. 호출 후 처리 결과를 직접 반환합니다 처리 시간이 짧고 클라이언트가 즉시 결과를 얻어야 하는 경우
비동기 실행 함수 API 비동기 HTTP API를 생성합니다. 호출 후 즉시 응답하지만 처리 결과는 반환하지 않습니다 처리 시간이 길고 인터페이스 호출이 시작 신호로만 사용되는 시나리오
예약 작업 Crontab 문법을 기반으로 자동 실행 정기 동기화 / 캐시 데이터, 예약 작업 등의 경우

자세한 내용은 스크립트 개발 / 기본 개념을 참조하세요.

여기에서 이 함수를 위한 함수 API를 생성하면, 공인망에서 HTTP를 통해 이 함수를 호출할 수 있습니다.

이 함수를 위해 생성한 함수 API ID가 func-api-xxxxx라고 가정하면, 이 함수를 호출하는 가장 간단한 방법은 다음과 같습니다.

Text Only
1
GET /api/v1/al/func-api-xxxxx/s?message=Hello

응답은 다음과 같습니다(일부 내용 생략).

Text Only
1
2
3
4
HTTP/1.1 200 OK
Content-Type: application/json

{"message":"Hello"}

3. 파일 업로드를 지원하는 함수 작성

DataFlux Func는 함수 API를 통한 파일 업로드도 지원합니다.

업로드된 파일을 처리해야 하는 경우 함수에 files 매개변수를 추가하여 업로드된 파일 정보를 받을 수 있습니다. 파일이 업로드되면 DataFlux Func는 자동으로 파일을 임시 업로드 디렉터리에 저장하여 스크립트가 후속 처리를 할 수 있게 합니다.

예시
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# Excel 파일을 받아 Sheet1 내용을 반환합니다
from openpyxl import load_workbook

@DFF.API('Excel 읽기')
def read_excel(files=None):
    excel_data = []
    if files:
        workbook = load_workbook(filename=files[0]['filePath'])
        for row in workbook['Sheet1'].iter_rows(min_row=1, values_only=True):
            excel_data.append(row)

    return excel_data

files 매개변수는 DataFlux Func 시스템에 의해 자동으로 채워지며 내용은 다음과 같습니다.

JSON
1
2
3
4
5
6
7
8
9
[
    {
        "filePath"    : "<파일 임시 저장 경로>",
        "originalname": "<파일 원본 파일명>",
        "encoding"    : "<인코딩>",
        "mimetype"    : "<MIME 유형>",
        "size"        : "<파일 크기>"
    }
]

파일 업로드 예시 명령은 스크립트 개발 / 기본 개념 / 함수 API / POST 간편 전달을 참조하세요.

4. JSON, Form이 아닌 데이터 수신

1.6.9 버전에서 추가됨

어떤 경우에는 요청이 제3자 시스템이나 애플리케이션에 의해 고유한 형식으로 전송될 수 있으며, 요청 본문이 JSON 또는 Form 형식이 아닌 경우 **data를 입력 매개변수로 사용하고 POST 간편 형식으로 호출할 수 있습니다.

시스템은 텍스트 또는 파싱할 수 없는 데이터를 수신하면 자동으로 { "text": "<텍스트>" } 또는 { "base64": "<Base64 형식의 이진 데이터>"}로 패킹하여 함수에 전달합니다.

예시 코드는 다음과 같습니다.

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import json
import binascii

@DFF.API('임의 형식 Body를 수신하는 함수')
def tiger_balm(**data):
    if 'text' in data:
        # 요청 본문이 텍스트인 경우(예: Content-Type: text/plain)
        # `data` 매개변수에는 항상 별도의 `text` 필드가 포함되어 내용을 저장합니다
        return f"텍스트: {data['text']}"

    elif 'base64' in data:
        # 요청 본문이 파싱할 수 없는 형식(Content-Type: application/xxx)인 경우
        # `data` 매개변수에는 항상 별도의 `base64` 필드가 포함되어 요청 본문의 Base64 문자열을 저장합니다
        # Base64 문자열은 `binascii.a2b_base64(...)`를 사용하여 Python 이진 데이터로 변환할 수 있습니다
        b = binascii.a2b_base64(data['base64'])
        return f"Base64: {data['base64']} -> {b}"

요청 본문이 텍스트인 경우

요청은 다음과 같습니다.

Bash
1
curl -X POST -H "Content-Type: text/plain" -d 'hello, world!' http://localhost:8089/api/v1/al/auln-unknown-body/s

출력은 다음과 같습니다.

Text Only
1
텍스트: hello, world!

요청 본문이 알 수 없는 형식인 경우

요청은 다음과 같습니다.

Bash
1
curl -X POST -H "Content-Type: unknown/type" -d 'hello, world!' http://localhost:8089/api/v1/al/auln-unknown-body/s

출력은 다음과 같습니다.

Text Only
1
Base64: aGVsbG8sIHdvcmxkIQ== -> b'hello, world!'