워크플로우로 업무 자동화
워크플로우로 업무 자동화 — 트리거 · 조건 · 액션을 조합해 비즈니스 프로세스를 자동화합니다
트리거 · 조건 · 액션을 조합해 비즈니스 프로세스를 자동화합니다
이 튜토리얼에서 배울 내용
워크플로우 자동화
Connect Base 워크플로우로 비즈니스 프로세스를 자동화합니다.
워크플로우란?
워크플로우는 여러 작업을 순차적/조건적으로 연결하여 자동 실행하는 기능입니다.
- 트리거: 워크플로우를 시작하는 이벤트
- 스텝: 실행할 개별 작업 (함수 호출, 조건 분기, 병렬 실행 등)
- 지연: 특정 시간만큼 대기 후 다음 스텝 실행
사용 가능한 트리거
| 트리거 | 설명 | 예시 |
|---|---|---|
| 데이터 이벤트 | 테이블 데이터 변경 시 | users.created, orders.updated |
| 스케줄 | 정해진 시간에 실행 | 매일 9시, 매주 월요일 |
| HTTP 웹훅 | 외부에서 API 호출 시 | 결제 완료 알림 |
| 수동 실행 | 콘솔에서 직접 실행 | 테스트, 일회성 작업 |
스텝 유형
빌트인 스텝 유형은 정확히 6종입니다 (function / builtin / condition / parallel / merge / delay).
| 스텝 | 타입 | 설명 |
|---|---|---|
| 함수 호출 | function | 서버리스 함수 실행 |
| 빌트인 | builtin | 내장 함수 실행 |
| 조건 분기 | condition | if/else 로직 |
| 병렬 실행 | parallel | 여러 스텝 동시 실행 |
| 병합 | merge | 병렬 실행 결과 합치기 |
| 지연 | delay | 대기 (초/분/시간/일) |
💡
HTTP 요청이나반복(loop)은 빌트인 스텝이 아닙니다. 외부 API 호출은function스텝의 코드 안에서fetch()로 직접 처리하세요.
예제 1: 신규 회원 온보딩
시나리오
회원가입 → 환영 이메일 → 1일 후 프로필 확인 → 리마인드 또는 쿠폰 발송
워크플로우 설계
[트리거: users.created]
|
v
[함수: send-welcome-email]
|
v
[지연: 1일]
|
v
[함수: check-profile-completed]
|
v
[조건: isCompleted == true?]
| |
v v
Yes No
| |
v v
[send-coupon] [send-reminder]
| |
v v
[종료] [지연: 3일]
|
v
[check-profile]
|
v
[조건 분기]
|
Yes ----+---- No
| |
v v
[coupon] [종료]1. 콘솔에서 워크플로우 생성
- 콘솔 > 워크플로우 > 새 워크플로우
- 이름:
user-onboarding - 트리거: 데이터 이벤트 >
users테이블 >created
2. 이메일 발송 함수 만들기
send-email.js:
// 환경 변수: RESEND_API_KEY (이메일 서비스 API 키)
export default async function handler(payload, context) {
const { to, subject, template, data } = payload
// 템플릿 렌더링
const templates = {
welcome: (d) => `
<h1>환영합니다, ${d.name}님!</h1>
<p>Connect Base에 가입해주셔서 감사합니다.</p>
<a href="https://myapp.com/profile">프로필 완성하기</a>
`,
reminder: (d) => `
<h1>${d.name}님, 프로필을 완성해주세요!</h1>
<p>프로필을 완성하면 10% 할인 쿠폰을 드립니다.</p>
`,
coupon: (d) => `
<h1>축하합니다, ${d.name}님!</h1>
<p>첫 구매 10% 할인 쿠폰: <strong>WELCOME10</strong></p>
`
}
const html = templates[template](data)
// Resend API로 이메일 발송
const response = await fetch('https://api.resend.com/emails', {
method: 'POST',
headers: {
'Authorization': `Bearer ${context.env.RESEND_API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({ from: '[email protected]', to, subject, html })
})
return { success: response.ok }
}3. 프로필 확인 함수 만들기
check-profile.js:
export default async function handler(payload, context) {
const { userId } = payload
const db = context.database
const user = await db.table('users').doc(userId).get()
const requiredFields = ['name', 'phone', 'address']
const isCompleted = requiredFields.every(field => user[field])
return {
isCompleted,
userId,
name: user.name,
email: user.email
}
}4. 워크플로우 스텝 구성
| 순서 | 스텝 | 설정 |
|---|---|---|
| 1 | 함수 호출 | send-email (template: welcome) |
| 2 | 지연 | 1일 |
| 3 | 함수 호출 | check-profile |
| 4 | 조건 분기 | previous.isCompleted == true |
| 4-Yes | 함수 호출 | send-email (template: coupon) |
| 4-No | 함수 호출 | send-email (template: reminder) |
| 5 | 지연 | 3일 (No 분기 이후) |
| 6 | 함수 호출 | check-profile |
| 7 | 조건 분기 | 최종 체크 |
예제 2: 주문 처리 자동화
시나리오
주문 생성 → 재고 확인 → 결제 처리 → 배송 시작
[트리거: orders.created]
|
v
[함수: check-inventory]
|
v
[조건: 재고 있음?]
| |
No Yes
| |
v v
[알림] [process-payment]
| |
v v
[종료] [조건: 결제 성공?]
| |
No Yes
| |
v v
[알림] [병렬 실행]
|
+-----------+-----------+
| | |
v v v
[재고 차감] [확인 메일] [배송 생성]예제 3: 일일 리포트 생성
스케줄 트리거 설정
Cron: 0 9 * * * (매일 오전 9시)
데이터 집계 함수
aggregate-daily-data.js:
export default async function handler(payload, context) {
const db = context.database
const yesterday = new Date()
yesterday.setDate(yesterday.getDate() - 1)
const startOfDay = new Date(yesterday.setHours(0, 0, 0, 0))
const endOfDay = new Date(yesterday.setHours(23, 59, 59, 999))
// 주문 통계
const orders = await db.table('orders').find({
where: { createdAt: { $gte: startOfDay, $lte: endOfDay } }
})
const totalRevenue = orders.reduce((sum, o) => sum + o.amount, 0)
// 신규 가입자
const newUsers = await db.table('users').find({
where: { createdAt: { $gte: startOfDay, $lte: endOfDay } }
})
return {
date: startOfDay.toISOString().split('T')[0],
metrics: {
totalRevenue,
orderCount: orders.length,
newUserCount: newUsers.length
}
}
}변수 사용법
워크플로우 변수는 중괄호 없는 점경로(dot-path) 문법을 씁니다 ({{...}} 템플릿은 지원하지 않습니다).
스텝 입력 매핑
스텝의 입력 매핑에서는 previous.<필드> (직전 스텝 출력) 와 initial.<필드> (워크플로우 초기 입력) 접두사를 사용합니다.
previous.userId // 직전 스텝 출력의 userId
previous.email // 직전 스텝 출력의 email
initial.orderId // 워크플로우 시작 시 받은 초기 입력의 orderId조건식 예시
조건식에서는 input.* (초기 입력), previous.* (직전 출력), results.<stepId>.* (특정 스텝 결과) 를 참조합니다.
previous.success == true
previous.amount > 10000
previous.status == "success"
results.check-profile.isCompleted == true실행 모니터링
콘솔 > 워크플로우 > 실행 이력:
- 실행 상태: 진행 중 / 완료 / 실패
- 각 스텝 결과: 입력/출력 데이터
- 소요 시간: 전체 및 스텝별
- 에러 로그: 실패 원인 상세
재시도 설정
| 설정 | 설명 |
|---|---|
| 재시도 횟수 | 최대 3회 |
| 재시도 간격 | 지수 백오프 (1분, 5분, 15분) |
| 재시도 조건 | 5xx 에러, 타임아웃 |
워크플로우 실행
📌
connectbase-clientSDK 에는 워크플로우 실행/조회 메서드가 포함되어 있지 않습니다. 워크플로우는 다음 방법으로 트리거합니다:
- 콘솔에서 직접 "수동 실행" 버튼 클릭
- 스케줄 트리거 — 콘솔에서 cron 스케줄 등록 (자동 실행)
- 데이터 이벤트 트리거 — 특정 테이블의 row 변경 시 자동 실행
- 외부 webhook URL 트리거 — 콘솔의 워크플로우 트리거 설정에서 발급된 webhook URL 을 외부 서비스에 등록
콘솔 사용자 JWT 가 있다면
POST /v1/apps/:appID/workflows/:workflowID/execute엔드포인트로 직접 실행할 수도 있지만, SDK 의 Public Key 인증으로는 호출할 수 없습니다.
// 데이터 이벤트로 워크플로우 트리거 (가장 흔한 패턴)
// 예: tbl_orders 에 row 가 생성되면 자동으로 워크플로우 실행
await cb.database.createData('tbl_orders', {
data: { user_id: 'member_xxx', amount: 50000 }
})
// → 콘솔에서 "tbl_orders.created" 이벤트로 등록된 워크플로우들이 자동 실행됨실행 상태와 결과는 콘솔의 워크플로우 → 실행 이력 에서 확인하세요.
이 튜토리얼이 도움이 됐나요?