자동 실행이 겹쳐서 같은 일을 두 번 돌릴 때
Vercel Cron·GitHub Actions가 같은 작업을 겹쳐 돌리거나 API·DB 비용이 한순간에 커진 상황을 막는 순서입니다.
한 줄 결론
스케줄 작업은 한 번에 하나만 돌게 잠금을 걸고, 실패 재시도·타임아웃·알림을 코드와 인프라 양쪽에 둡니다.
아래 내용은 초보 바이브코더를 위한 일반 안내입니다. 서비스·지역·약관에 따라 달라질 수 있으며, 실제 사업화·운영 전에는 해당 분야 전문가 확인이 필요합니다.
먼저 용어부터 — 그다음 실행 프롬프트
- cron
- 정해진 시간에 자동으로 돌아가는 예약 작업
- CRON_SECRET
- 우리 API만 cron이 호출하게 막는 비밀 문자열
Webhook
이건 webhook입니다
결제사·외부 서비스가 ‘이벤트 생겼어’라고 우리 서버에 보내는 알림 URL입니다.
- 테스트 모드와 라이브 키를 섞지 않습니다
- 서명(signing secret)으로 위조 요청을 거릅니다
- 같은 알림이 두 번 와도 한 번만 처리합니다
이런 곳에 · Stripe/토스 결제 · 자동화 알림 · /ai/guides 결제 가이드
지금 할 일 · 테스트 webhook URL 등록 → 테스트 결제 1회 → 로그에 이벤트 확인
비용·주의 · 테스트는 무료. 라이브 키로 실결제·수수료 주의.
AI 프롬프트 보기
Stripe(또는 토스) webhook 테스트. test key, signing secret, idempotent 처리, 실패 시 재시도 주의.
Environment variables
이건 env(환경변수)입니다
비밀값·설정을 코드 밖에 두는 칸입니다. 로컬은 .env.local, 배포는 Vercel Environment Variables.
- 비밀은 Git에 커밋하지 않습니다
- 로컬과 배포 값이 다르면 ‘로컬만 됨’이 납니다
- 이름만 같아도 값이 비면 500이 납니다
이런 곳에 · OAuth secret · DATABASE_URL · API Key · CRON_SECRET
지금 할 일 · .env.example에 이름만 적고, 실제 값은 .env.local에만
비용·주의 · 잘못된 env로 무한 재시도하면 API 비용이 늘 수 있습니다.
AI 프롬프트 보기
Next.js + Vercel env 점검. 로컬은 되는데 배포만 실패. 필요한 키 목록(값 제외), Production 탭 확인 순서.
바로 실행 — AI 프롬프트
Vercel cron으로 /api/cron/job을 매일 호출합니다. vercel.json crons·CRON_SECRET·실패 재시도 1회·비용 나는 API 호출 제거 체크리스트.
막히면 다시 넣을 프롬프트
cron 401/timeout. path: [ ], duration: [ ]s, 로그: [ ]. maxDuration·배치 크기 조정.
럭키스팟 해석은 원출처를 바탕으로 한 실전 안내입니다. 요금·약관·라이선스는 제공자 페이지 최신 조건을 결제·배포 전에 대조하세요. 실제 사업화 전에는 해당 분야 전문가 확인이 필요할 수 있습니다.
초보자 한 줄 설명
크론은 '정각에 한 번'이 아닙니다. 배포 중·재시도·여러 스케줄러가 겹치면 같은 job이 동시에 여러 번 돌 수 있습니다.
먼저 AI 에이전트에게 붙여넣을 프롬프트
Next.js + Vercel Cron(또는 GHA) 배치 job에 중복 실행 방지를 붙인다. 1) 동일 job이 Vercel cron·GHA·외부에 중복 등록됐는지 찾는 체크리스트 2) PostgreSQL advisory lock 또는 Redis SET NX 예시(의사코드) 3) CRON_SECRET 헤더 검증 route 스켈레톤 4) maxDuration·batch size·재시도 상한 권장값 5) 비용 급증 시 볼 로그·대시보드 항목 파일별 최소, dry-run 모드 포함.
AI가 해줄 수 있는 일
- 중복 실행 막는 락 코드·CRON_SECRET 검증 route
- batch·timeout·재시도 상한·dry-run 모드
- 등록된 스케줄 중복 찾는 체크리스트
사람이 직접 해야 하는 외부 설정
- Vercel cron·GitHub Actions 중 한 곳만 스케줄 남기기
- CRON_SECRET을 Vercel 비밀값 칸에 넣기
- dry-run 5건 수동 실행 후 알림 확인
외부 설정 경로
- Vercel → Project → Settings → Cron Jobs
- GitHub → Repository → Actions → workflow 파일
- Vercel → Project → Settings → Environment Variables (CRON_SECRET)
제대로 됐는지 확인하는 방법
- 같은 job이 동시에 두 번 돌지 않는지(로그에 skip)
- 수동 trigger에 secret 없으면 401인지
- dry-run이 실제 API·DB를 건드리지 않는지
실행 순서
- 1등록된 스케줄 전부 나열·하나만 남기기
- 2job 시작 시 락 획득·실패 시 skip
- 3CRON_SECRET·수동 trigger 인증
- 4batch·timeout·재시도 상한 코드
- 5dry-run 5건 → 알림 → 프로덕션 크론
막히면 다시 AI에게 줄 프롬프트
크론 job이 [두 번 실행 / API 비용 급증 / 타임아웃]. 등록 위치: [Vercel/GHA/...], job 이름: [ ], 로그: [붙여넣기]. 중복 스케줄·락 없음·웹훅+크론 이중 트리거 점검.
막히는 지점
- Vercel Cron·GHA·외부 서비스에 동일 job 이중 등록
- 락 없이 배포·재시도·다중 인스턴스 겹침
- job 타임아웃 없이 다음 스케줄과 충돌
- CRON_SECRET 없이 공개 /api/cron URL
- 실패 시 every-minute 재시도로 비용 폭주
비용·보안·저작권·약관 주의
- 크론 URL 유출 시 대량 트리거 가능 — secret·IP 제한
- 스크래핑·자동 수집은 대상 약관·robots 확인(사업화 시 법무)
- 중복 크론·무한 재시도·대량 API 호출이 DB·LLM 비용을 한 번에 키웁니다. dry-run 먼저.
대안 도구
Inngest · Trigger.dev · 수동 cron+script
럭키스팟 판단
스케줄은 한 곳·한 락·한 알림부터. 수동 트리거 10번 성공 후에만 크론 주기를 켜세요.
이런 사람이 보면 좋음
- 매일·매시간 자동 수집·알림·정산을 붙이려는 사람
- 크론을 여러 곳에 동시에 등록한 적이 있는 사람
- 한 번 실패 후 수동 재실행하다 데이터가 두 배가 된 사람
초보자가 보통 착각하는 지점
- 크론은 정확히 한 번만 실행된다고 믿습니다. 배포 중·재시도·다중 인스턴스에서 겹칠 수 있습니다.
- GitHub Actions와 Vercel Cron에 같은 작업을 넣어 두고 둘 중 하나만 끄면 된다고 생각합니다.
- job이 오래 걸려도 다음 스케줄이 알아서 기다려 준다고 봅니다.
- 실패 시 every minute 재시도를 넣으면 빨리 복구된다고만 생각하고 비용을 계산하지 않습니다.
실제 점검 체크리스트
- Vercel → Settings → Cron Jobs와 GitHub → Actions에 같은 작업이 중복 등록되지 않았는지 확인합니다.
- 실행 시작 시 DB·Redis 잠금(락)으로 동시 실행을 막습니다.
- job 최대 실행 시간·타임아웃·재시도 상한을 설정합니다.
- 한 번에 처리하는 건수·API 호출에 상한을 둡니다.
- dry-run 모드로 먼저 몇 건만 처리해 로그를 확인합니다.
- Vercel → Environment Variables에 CRON_SECRET을 넣고, 수동 실행 URL을 비밀 없이 공개하지 않습니다.
실패했을 때 보는 순서
- 1최근 배포·크론 스케줄 변경 시각과 비용·에러 급증 시각을 맞춰 봅니다.
- 2로그에서 같은 jobId가 겹쳐 실행됐는지 확인합니다.
- 3중복 등록된 cron yaml·vercel.json·GHA workflow를 찾아 하나만 남깁니다.
- 4무한 루프·페이지네이션 누락으로 같은 데이터를 반복 호출하지 않는지 코드를 봅니다.
- 5락이 없으면 즉시 추가하고, 이미 중복 반영된 데이터는 별도 정리 스크립트로 대조합니다.
- 6API·DB 사용량 대시보드에서 어떤 엔드포인트가 튀었는지 확인합니다.
배포 전 확인 항목
- 스테이징에서 스케줄 한 주기를 실제로 기다리거나 trigger로 겹침 테스트를 했습니다.
- 수동 실행 엔드포인트에 CRON_SECRET 또는 동등한 인증이 있습니다.
- job이 실패해도 다음 주기 전에 알림이 옵니다.
- 비용이 큰 외부 API 호출은 야간·저빈도로 조정했습니다.
보안·법적 주의
- 크론 엔드포인트 URL이 유출되면 누구나 대량 작업을 트리거할 수 있습니다. secret·IP 제한을 검토하세요.
- 자동 수집·스크래핑은 대상 사이트 이용약관·robots·저작권을 확인해야 합니다. 상업 서비스는 법무 전문가 확인이 필요할 수 있습니다.
- 개인정보 대량 처리 자동화는 보관 기간·삭제 정책을 함께 설계하세요.