09. 데이터셋¶
워크플로우가 읽고 쓸 수 있는 표입니다. 사이드바 Datasets 화면에서 관리합니다.
워크플로우는 실행이 끝나면 아무것도 기억하지 않습니다. "이미 처리한 주문인지" 같은 걸 실행 사이에 기억해야 할 때 데이터셋을 씁니다.
이럴 때 씁니다¶
| 상황 | 쓰는 법 |
|---|---|
| 중복 처리 막기 | 처리한 주문번호를 저장해두고 다음 실행에서 대조 |
| 누적 기록 남기기 | 매일 매출을 한 행씩 쌓아 추이 보기 |
| 설정값 목록 관리 | 알림 보낼 대상 목록을 표로 관리 |
| 실행 로그 남기기 | 언제 무엇을 처리했는지 기록 |
값 하나짜리 설정이라면 변수가 더 적합합니다. 데이터셋은 행이 여러 개 쌓이는 것을 위한 기능입니다.
만들기¶
Datasets 화면에서 생성 버튼을 누르고 채웁니다.
| 항목 | 설명 |
|---|---|
| Title | 데이터셋 제목. 워크스페이스 안에서 고유해야 하며, 워크플로우에서 이 이름으로 참조합니다 |
| Description | 설명 (선택) |
| Columns | 컬럼 정의. 최소 하나 필요 |
컬럼마다 이름과 타입을 정합니다.
| 타입 | 담는 값 |
|---|---|
STRING |
문자열 |
NUMBER |
숫자 |
BOOLEAN |
참/거짓 |
DATETIME |
날짜·시각 |
컬럼 순서는 화살표 버튼으로 바꿀 수 있습니다.
예시 — "처리이력"¶
| 컬럼 | 타입 |
|---|---|
주문번호 |
STRING |
금액 |
NUMBER |
처리시각 |
DATETIME |
알림발송 |
BOOLEAN |
만들고 나면 목록에서 클릭해 행을 직접 보고 편집할 수 있습니다.
워크플로우에서 쓰기¶
dataset 통합을 씁니다. → 04. 통합 카탈로그
읽기 (QUERY)¶
- id: load-history
name: 처리이력 조회
type: CALL
integration: dataset
input:
datasetTitle: "처리이력"
operation: QUERY
limit: 100 # 기본 100, 최대 1000
offset: 0
출력은 { rows: [...] } 모양입니다.
${nodes.load-history.response.body.rows | raw} # 배열 전체 (| raw 필수)
${nodes.load-history.response.body.rows.0.주문번호} # 첫 행의 주문번호
각 행에는 시스템이 붙이는 id와 정의한 컬럼들이 들어 있습니다.
쓰기 (INSERT)¶
- id: save-history
name: 처리이력 저장
type: CALL
integration: dataset
input:
datasetTitle: "처리이력"
operation: INSERT
data:
주문번호: "${nodes.trigger.response.body.orderId}"
금액: "${nodes.trigger.response.body.amount}"
처리시각: "${nodes.trigger.response.body.windowEnd}"
알림발송: "true"
출력은 방금 저장된 행입니다: ${nodes.save-history.response.body.id}
컬럼에 없는 키는 조용히 버려집니다. 값이 안 들어갔다면 컬럼 이름 오타를 먼저 의심하세요.
수정 (UPDATE) / 삭제 (DELETE)¶
- id: mark-done
type: CALL
integration: dataset
input:
datasetTitle: "처리이력"
operation: UPDATE
rowId: "${nodes.find.response.body.rows.0.id}"
data:
알림발송: "true"
- id: cleanup
type: CALL
integration: dataset
input:
datasetTitle: "처리이력"
operation: DELETE
rowId: "${nodes.find.response.body.rows.0.id}"
DELETE 출력은 { deleted: true, id: ... } 입니다.
표현식으로 바로 꺼내기¶
간단한 조회는 dataset 노드 없이 표현식만으로 됩니다.
| 표현식 | 뜻 |
|---|---|
${datasets.처리이력.count} |
행 개수 |
${datasets.처리이력.latest} |
가장 최근 행 전체 (객체 — \| raw 필요) |
${datasets.처리이력.latest.주문번호} |
가장 최근 행의 특정 필드 |
노드를 하나 아끼는 편리한 방법입니다. 여러 행을 봐야 한다면 dataset 노드의 QUERY를 쓰세요.
활용 예 — 중복 처리 막기¶
# 1) 최근 처리 이력 조회
- id: load
type: CALL
integration: dataset
input:
datasetTitle: "처리이력"
operation: QUERY
limit: 200
# 2) 이번 주문번호가 이미 있는지 확인
- id: check
type: CALL
integration: transform_jmespath
input:
expression: "{이미처리: length(rows[?주문번호 == `${nodes.trigger.response.body.orderId}`]) > `0`}"
data: "${nodes.load.response.body | raw}"
# 3) 결과로 분기
- id: route
type: CONDITIONAL
execution-info:
conditions:
- label: skip
expression: "이미처리 == 'true'"
- label: process
otherwise: true
엣지에서 이미처리를 조건 노드로 넘겨주는 것을 잊지 마세요. → 06. 흐름 제어
주의할 점¶
- 워크스페이스마다 따로입니다.
datasetTitle은 제목 문자열로 찾습니다. 제목을 바꾸면 그 이름을 쓰던 워크플로우가 전부 실패합니다.- 한 번에 읽을 수 있는 최대 행 수는 1000입니다. 그보다 많으면
offset으로 나눠 읽으세요. - 대량 데이터 저장소가 아닙니다. 자동화가 기억해야 할 것을 담는 용도로 쓰세요.
다음 → 10. 실행과 모니터링