@workflow 데코레이터를 사용하면 이메일 발송, 데이터 처리, 정기 작업 등을 안정적으로 실행할 수 있습니다.
기본 개념
Workflow는 비동기 작업을 안전하게 실행하는 것이 목적입니다. API 요청과 달리 Workflow는:- 장시간 실행: 몇 분에서 몇 시간까지 실행 가능
- 재시도 가능: 실패 시 자동으로 재시도
- 모니터링: 실행 상태를 데이터베이스에 기록
- 스케줄링: Cron 표현식으로 정기 실행
기본 사용법
Workflow를 정의할 때는 이름과 실행 함수를 제공합니다. 실행 함수는input, step, logger 등의 파라미터를 받습니다.
name: Workflow 식별자 (고유해야 함)input: Workflow에 전달되는 입력 데이터step: Step 실행 객체 (작업을 나누어 관리)logger: 로깅 객체 (실행 상태 기록)
Workflow 실행
API에서 실행
API 엔드포인트에서 Workflow를 실행하면 즉시 응답을 반환하고 백그라운드에서 작업이 진행됩니다. 사용자는 긴 작업을 기다리지 않아도 됩니다.- API가
Sonamu.workflows.run()을 호출 - Workflow가 큐에 등록되고 즉시 리턴
- Worker가 큐에서 Workflow를 가져와 실행
- 실행 결과는 데이터베이스에 저장
직접 실행
스크립트나 다른 Workflow에서 직접 실행할 수도 있습니다.handle.result()를 사용하면 완료될 때까지 기다릴 수 있습니다.
handle.result()는 Workflow가 완료될 때까지 대기합니다. API 응답에서는 사용하지 마세요!스키마 검증
Zod 스키마를 사용하면 입력과 출력 데이터를 자동으로 검증할 수 있습니다. 잘못된 데이터로 인한 런타임 에러를 방지하고, TypeScript 타입 추론도 정확해집니다.- 타입 안전성: TypeScript가 input/output 타입을 정확히 추론
- 런타임 검증: 실행 전에 데이터 형식 확인
- 명확한 계약: Workflow의 인터페이스가 명확해짐
버전 관리
Workflow 로직을 변경해야 할 때, 버전을 지정하면 기존 실행 중인 작업은 이전 로직으로 완료되고 새로운 실행은 새 로직을 사용합니다.- 이메일 템플릿 변경
- 데이터 처리 로직 개선
- 외부 API 연동 방식 변경
스케줄링
Cron 표현식을 사용하면 Workflow를 정기적으로 자동 실행할 수 있습니다. 매일 리포트 생성, 주기적 데이터 백업 등에 활용합니다.여러 스케줄 등록
하나의 Workflow에 여러 스케줄을 등록할 수 있습니다. 각 스케줄은 다른 입력 데이터를 전달할 수 있어, 같은 로직으로 다른 작업을 수행할 수 있습니다.- 증분 백업: 매 시간 변경된 데이터만
- 전체 백업: 매일 전체 데이터
- 다른 타임존: 지역별로 다른 시간에 실행
실전 예제
1. 대량 이메일 발송
수천 명의 사용자에게 이메일을 보낼 때, Workflow를 사용하면 API 요청 타임아웃 없이 안전하게 처리할 수 있습니다.- 사용자 조회와 이메일 발송을 별도 Step으로 분리
- 각 이메일마다 Step을 생성하여 개별 재시도 가능
- 진행 상황을 DB에 기록하여 모니터링 가능
2. 데이터 파이프라인
외부 API에서 데이터를 가져와 변환하고 저장하는 파이프라인을 구성할 수 있습니다.- 각 단계가 실패해도 처음부터 다시 시작하지 않음
- 각 단계의 실행 시간을 측정하여 병목 구간 파악
- 변환 로직 변경 시 수집 단계는 스킵 가능
3. 정기 정리 작업
오래된 데이터를 자동으로 삭제하는 작업을 스케줄링합니다.- 로그 데이터 정리
- 임시 파일 삭제
- 만료된 세션 제거
일시중지 및 재개 (Pause/Resume)
실행 중인 Workflow를 일시중지하고 나중에 재개할 수 있습니다. 이 기능은 리소스 관리나 외부 의존성 문제가 발생했을 때 유용합니다.상태 전이
Workflow의 상태는 다음과 같이 전이됩니다:Sonamu UI에서 사용
Sonamu UI의 Tasks 탭에서 실행 중인 Workflow를 직접 일시중지하거나 재개할 수 있습니다.- 일시중지:
pending,running,sleeping상태의 Workflow 카드에서 “일시중지” 버튼 클릭 - 재개:
paused상태의 Workflow 카드에서 “재개” 버튼 클릭
API로 사용
백엔드에서 프로그래밍 방식으로 Workflow를 제어할 수 있습니다.주요 특징
- 멱등성 보장: 이미
paused상태인 Workflow에 pause를 호출해도 에러가 발생하지 않습니다. resume도 마찬가지입니다. - 터미널 상태 보호:
completed,failed,canceled상태의 Workflow는 pause/resume할 수 없습니다. - 즉시 재개: resume 호출 시
available_at이 현재 시간으로 설정되어 Worker가 즉시 작업을 가져갑니다.
사용 시나리오
주의사항
다음 단계
Step
Step으로 작업을 나누고 재시도 전략 구현하기
에러 처리
에러 처리 패턴과 보상 트랜잭션 배우기
Worker 설정
Worker 프로세스 설정 및 관리하기