> ## Documentation Index
> Fetch the complete documentation index at: https://supastack.dev/llms.txt
> Use this file to discover all available pages before exploring further.
> For the full documentation corpus in one file, fetch: https://supastack.dev/llms-full.txt

# 예약 작업

스케줄 액션을 통한 워크스페이스 반복 작업.

## 초보자 연습

전제 조건: 아래 두 개의 초보자 가이드를 읽고, 웹 로컬 설정을 완료하고, 편집기의 루트에서 이 모노레포를 엽니다. 웹 설정은 `apps/web/.env.local`에 속합니다. Next.js는 ​​루트 `.env`를 읽지 않습니다. 기본 가짜 모드의 `/dashboard`는 데이터베이스가 없는 데모입니다. `/auth`에는 마이그레이션된 데이터베이스가 필요합니다.

빠른 용어: 작업 영역은 한 팀의 별도 사용자, 데이터 및 설정입니다. 서버는 신뢰할 수 있는 백엔드입니다. 제공업체 키를 브라우저 및 전화 코드에 보관하세요. 마이그레이션은 테이블을 생성하거나 업데이트하는 버전이 지정된 데이터베이스 변경입니다. AI 모델은 응답하는 엔진입니다. 모델 카탈로그는 서버의 사용 가능한 모델 ID 및 가격 목록입니다. 공급자는 AI, 이메일, 청구 서비스와 같은 외부 서비스입니다. 자격은 작업 영역에서 기능을 사용할 수 있도록 하는 부여입니다. 웹훅은 한 서비스가 다른 서비스의 URL에 보내는 메시지입니다.

1. Settings → Developers를 열고 일정 컨트롤을 사용하여 UTC 런타임이 포함된 테스트 작업을 생성합니다.

2. 앱을 계속 실행하고 동일한 서버 전용 `SCHEDULER_TICK_SECRET`를 앱과 터미널에서 사용할 수 있도록 합니다. 저장소 루트에서 아래 명령을 실행하십시오.

3. 기한이 다가오고 작업이 자체 상태에 도달하는지 확인합니다. 아무것도 실행되지 않으면 UTC 시간, 스케줄러 공급자 및 서버 로그를 확인하십시오. 절대 비밀글을 채팅에 붙여넣지 마세요.

사용자 정의 코드의 경우 제공된 `prompts/README.md`로 시작하고 가장 가까운 프롬프트(앱 화면의 경우 `prompts/new-app-screen.md`, 공개 페이지의 경우 `prompts/new-landing-page.md`)를 복사합니다. 서버, 데이터베이스 또는 공급자 작업의 경우 코딩 에이전트에게 이 가이드의 작업을 제공하고 `AGENTS.md`, `.ai/PROJECT_CONTEXT.md` 및 일치하는 `.ai/` 미러를 읽도록 요청하세요. 여기에 이름이 지정된 정확한 소스 파일을 검사하십시오. 편집하기 전에 파일을 나열하고 확인합니다. 작업 공간 소유권과 서버 전용 비밀을 보존합니다. 차이점을 보여주세요. 원하는 동작, 입력 및 출력 필드, 허용된 역할, 예상되는 성공 및 오류, 테스트 계정, 공급자 또는 장치를 알려주십시오. 샘플 값을 사용하십시오. 절대 진짜 비밀을 붙여넣지 마세요.

[시작하기 전에](https://supastack.dev/ko/docs/web/before-you-start.md)

[단말기 기본사항](https://supastack.dev/ko/docs/web/terminal-basics.md)

[웹 로컬 설정](https://supastack.dev/ko/docs/web/ship-in-5-minutes.md)

[에이전트 프롬프트 및 프로젝트 메모리](https://supastack.dev/ko/docs/web/agents.md)

```
corepack pnpm jobs:tick
```


## 반복 작업을 데이터베이스에 저장

설정 예약은 작업 공간 범위 `job_schedule` 행에 작업 유형 및 크론 규칙을 저장합니다. Cron 필드는 UTC에서 평가됩니다. `createDrizzleJobScheduler.claimDueSchedules`는 `FOR UPDATE SKIP LOCKED`를 사용하여 마감 행을 요청하고 다음 실행을 진행한 후 핸들러를 파견합니다.

일반 `JobRunner`는 대기열 추가/상태/취소를 약속합니다. 반복은 스케줄러 행에 속합니다. Trigger.dev 워크플로 의미는 명시적으로 유지됩니다.


## 드라이브 스케줄러 틱

`POST /api/internal/scheduler-tick`를 활성화하려면 서버 전용 `SCHEDULER_TICK_SECRET`를 설정하세요. `corepack pnpm jobs:tick`는 이를 dev/CI용으로 호출합니다. 구성이 없으면 404가 반환됩니다. `JOB_PROVIDER=trigger`에서 배포된 `scheduler.tick` cron이 스케줄러를 구동합니다.

```
# Against a running local app, with SCHEDULER_TICK_SECRET configured:
corepack pnpm jobs:tick
```


## 소유권 주장과 실행을 별도로 확인

겹치는 틱, 기한/미기한 규칙, 비활성화된 행, 핸들러 실패, 취소 및 다른 작업 공간의 일정을 테스트합니다. 청구/고급 및 작업 완료를 별도로 검사합니다. 청구된 행은 완료된 작업의 증거가 아닙니다.

[발송된 이메일.다이제스트 예시](https://supastack.dev/ko/docs/web/project-structure.md)

[Trigger.dev 실행](https://supastack.dev/ko/docs/modules/jobs.md)


## 설치 및 설정

예약 작업 — 다이제스트, 정리, 갱신 — 은 임시 타이머가 아니라 schedule-actions를 통합니다: listWorkspaceSchedules, upsertScheduleAction, removeScheduleAction이 워크스페이스의 cron 구동 작업을 관리합니다.

스케줄은 작업, cron 식, 실행되는 워크스페이스를 지정합니다. 워커는 실행 시점에 컨텍스트를 해석하므로 일시 중지되거나 삭제된 스케줄은 재배포 없이 작업 생성을 멈춥니다.

```
listWorkspaceSchedules()
upsertScheduleAction({ task, cron })
removeScheduleAction(formData)
```


## 구현 워크플로

모든 예약 실행을 신뢰할 수 없는 입력으로 취급하세요: 등록 이후 상태가 바뀌었을 수 있으므로 실행 안에서 워크스페이스와 엔타이틀먼트를 다시 해석합니다. 작업을 멱등하게 만드세요 — 재시도되거나 이중 발화된 실행이 효과를 중복해서는 안 됩니다.

스케줄은 운영 표면입니다: 설정이나 로그에 보이게 유지해 멈추거나 폭주한 스케줄을 사용자가 알아채기 전에 찾을 수 있게 하세요.


## 검증 및 문제 해결

샌드박스에서 스케줄을 수동으로 발화하고, 일시 중지하고, 비활성화된 워크스페이스가 실행 생성을 멈추는지, 중복 발화가 하나의 효과만 내는지 확인하세요. cron 식은 작업 코드에 흩뿌리지 말고 관리된 설정에 두세요.


## 다음

[트랜잭션 이메일](https://supastack.dev/ko/docs/modules/email.md)
