TechFeedTechFeed
바이브코딩

클로드 코드 완전 자동화 #3 — 리밋 걸리면? 중단과 재개 전략

한 줄 요약: 리밋에 걸리면 해당 세션은 멈추지만, 작업을 쪼개고 재시도 로직을 넣으면 자동으로 이어갈 수 있다. 클로드 코드(Claude Code)를 headless 모드로 자동 실행하다 보면 반드시 한 번은 마주치는 문제가 있다. 클로드 코드(Claude Code)를 자동화 환경에서 돌릴 때 마주치는 리밋은 성격이 제각각이다. 원인과 해결 경로가 다르기 때문에 먼저 구분하는 것이 중요하다.

by

한 줄 요약: 리밋에 걸리면 해당 세션은 멈추지만, 작업을 쪼개고 재시도 로직을 넣으면 자동으로 이어갈 수 있다.


클로드 코드(Claude Code)를 headless 모드로 자동 실행하다 보면 반드시 한 번은 마주치는 문제가 있다. Rate limit으로 429 에러가 뜨거나, 대화가 길어져 컨텍스트 창이 꽉 차거나, 월 구독 한도에 도달하는 상황이다. 이 글에서는 각 리밋의 실체와 행동 방식을 정확히 파악하고, 자동화 스크립트에서 안전하게 재개하는 전략을 정리한다.


※ 이 글은 클로드 코드 완전 자동화 시리즈 #3입니다. 2026년 3월 기준, Claude Code CLI 공식 문서 기반으로 작성됐습니다.


Claude Code에서 만나는 리밋 4가지

클로드 코드(Claude Code)를 자동화 환경에서 돌릴 때 마주치는 리밋은 성격이 제각각이다. 원인과 해결 경로가 다르기 때문에 먼저 구분하는 것이 중요하다.


리밋 종류발생 조건에러 신호해결 방향
Rate Limit단위 시간당 API 호출 수 초과429 Too Many Requests대기 후 재시도
컨텍스트 초과대화 누적 토큰이 200K 초과context window full 메시지/compact 또는 새 세션
구독 사용량 한도Pro/Max 플랜 월간 한도 소진usage limit reached 메시지갱신일 대기 또는 플랜 업그레이드
API 크레딧 소진Console API 선불 크레딧 소진402 / billing error크레딧 충전

※ 구독(Pro/Max)과 API 콘솔 크레딧은 별개다. Claude Code CLI는 기본적으로 Anthropic 계정 구독을 사용하고, --api-key로 Console API 키를 지정하면 크레딧을 소모한다.


Claude Code에서 만나는 리밋 4가지 — AI 코딩 도구 작업 화면
클로드 코드 완전 자동화 #3 — 리밋 걸리면? 중단과 재개 전략 — AI 코딩 도구 작업 화면 (출처: 공식 문서 및 벤치마크 데이터 기반)

🎓 유데미 강의 추천


Claude Code 실전 강의 — AI 코딩을 지금 시작하세요


설치부터 자동화·에이전트 활용까지, 실무에서 바로 쓰는 Claude Code 활용법을 단계별로 배울 수 있습니다.


강의 보러가기 →

리밋에 걸리면 실제로 어떻게 되나

각 리밋이 걸렸을 때 클로드 코드(Claude Code)가 취하는 행동은 실행 모드(대화형 / headless)에 따라 다르다.


Rate Limit (429)

대화형 세션에서는 클로드 코드가 내부적으로 일정 시간(수십 초~수 분) 대기한 뒤 자동으로 재시도한다. 사용자는 대기 메시지를 보게 된다. headless 모드(claude -p)에서는 재시도 없이 에러 메시지와 함께 즉시 종료된다. exit code는 0이 아닌 값으로 반환된다.


컨텍스트 윈도우 초과

Claude 3.x 모델의 컨텍스트 창은 200K 토큰이다. 대화가 길어지면 이 한도에 도달한다. 대화형에서는 /compact 명령으로 대화 내용을 요약·압축해 새 컨텍스트 공간을 확보할 수 있다. headless 자동화에서는 이 명령을 직접 호출할 수 없으므로, 처음부터 세션을 짧게 유지하는 설계가 필요하다.


구독 사용량 한도

Pro/Max 플랜은 월간 사용량 한도가 있다. 한도에 도달하면 다음 갱신일(보통 구독 시작일 기준 매월)까지 추가 요청이 불가능하다. 에러 메시지에 갱신 예정일이 표시된다. 이 경우 자동화 스크립트에서 할 수 있는 것은 없다 — 스크립트가 이 상황을 감지해 알림을 보내고 멈추는 것이 최선이다.


API 크레딧 소진

Console API 크레딧이 소진되면 402 응답 또는 billing 관련 에러가 반환된다. 크레딧을 충전하면 즉시 재개 가능하다. 자동화에서는 크레딧 잔액 알림을 Anthropic Console에서 설정해두는 것이 권장된다.


⚠️ 막히는 케이스: headless 모드에서 rate limit이 걸렸는데 exit code 0으로 종료됨 → 이 경우 stdout에 에러 메시지가 있어도 exit code만 보는 스크립트는 성공으로 판단한다 → 반드시 stdout/stderr에서 429, rate limit, too many requests 문자열을 별도로 체크해야 한다.
⚠️ 막히는 케이스: 대화형 세션에서 /compact를 써도 컨텍스트가 계속 꽉 참 → 단일 세션에 너무 많은 파일과 코드를 한꺼번에 올렸기 때문이다 → .claudeignore에 불필요한 디렉토리(node_modules, .git, dist, build 등)를 추가하고, 작업 단위를 파일 범위별로 분리해 새 세션에서 시작할 것.

자동화에서 리밋 대응 전략

리밋을 완전히 피할 수는 없다. 중요한 것은 리밋이 걸렸을 때 스크립트가 어떻게 반응하느냐다. 핵심 원칙은 세 가지다.


  • 작업을 독립 단위로 쪼갠다 — 한 세션에 너무 많은 작업을 넣지 않는다
  • 결과를 파일로 저장한다 — 중간 결과가 파일에 있으면 다음 실행에서 이어받을 수 있다
  • 에러를 감지하고 재시도 또는 중단한다 — 스크립트가 리밋 에러를 인식하지 못하면 무한 실패 루프가 발생한다

아래는 이 원칙을 적용한 bash 재시도 래퍼 스크립트다.


리밋에 걸리면 실제로 어떻게 되나 — 프로젝트 구조와 빌드 흐름
클로드 코드 완전 자동화 #3 — 리밋 걸리면? 중단과 재개 전략 — 프로젝트 구조와 빌드 흐름 (출처: 공식 문서 및 벤치마크 데이터 기반)
rate_limit 감지 + 지수 백오프 재시도 래퍼 (bash)
#!/usr/bin/env bash # claude_run.sh — rate limit 대응 재시도 래퍼 # 사용법: ./claude_run.sh "작업 프롬프트" output_file.txt PROMPT="$1" OUTPUT_FILE="$2" MAX_RETRIES=5 RETRY_DELAY=60 # 초 단위 초기 대기 시간 run_claude() { claude -p "$PROMPT" --output-format text 2>&1 } for attempt in $(seq 1 $MAX_RETRIES); do echo "[$(date '+%H:%M:%S')] 시도 $attempt / $MAX_RETRIES" OUTPUT=$(run_claude) EXIT_CODE=$? # 429 rate limit 감지 (exit code 및 stdout 모두 확인) if echo "$OUTPUT" | grep -qi "rate.limit\|429\|too many requests"; then WAIT=$((RETRY_DELAY * attempt)) # 지수 백오프 echo "[RATE LIMIT] ${WAIT}초 대기 후 재시도..." sleep $WAIT continue fi # 구독 한도 / 크레딧 소진 — 재시도 불가, 즉시 중단 if echo "$OUTPUT" | grep -qi "usage limit\|billing\|402"; then echo "[LIMIT REACHED] 구독 한도 또는 크레딧 소진. 수동 확인 필요." exit 2 fi # 정상 종료 if [ $EXIT_CODE -eq 0 ]; then echo "$OUTPUT" > "$OUTPUT_FILE" echo "[OK] 결과 저장: $OUTPUT_FILE" exit 0 fi echo "[ERROR] exit code $EXIT_CODE. 재시도..." sleep $RETRY_DELAY done echo "[FAIL] 최대 재시도 횟수 초과." exit 1

이 래퍼를 쓰면 rate limit 시 지수 백오프(60초, 120초, 180초...)로 대기하고, 구독 한도나 크레딧 소진은 재시도 없이 즉시 exit code 2로 종료한다. 호출하는 상위 스크립트에서 exit code로 분기 처리할 수 있다.


중단 후 이어가기 — 세션 재개 전략

클로드 코드(Claude Code)에는 이전 대화를 이어가는 두 가지 방법이 있다.


대화형에서 /resume 사용

대화형 세션에서 /resume 명령을 실행하면 이전 대화 목록이 표시되고, 선택한 대화를 이어갈 수 있다. 단, 이 기능은 대화형 모드에서만 동작한다. headless(claude -p) 자동화에서는 이전 대화 ID를 --resume 플래그로 전달해야 한다.


headless에서 이전 세션 이어가기
# 첫 번째 실행 — 대화 ID를 파일에 저장 SESSION_ID=$(claude -p "작업 1 시작" --output-format json | jq -r '.session_id') echo "$SESSION_ID" > .claude_session_id # 이후 실행 — 저장된 세션 ID로 재개 SESSION_ID=$(cat .claude_session_id) claude -p "작업 2 이어서" --resume "$SESSION_ID" --output-format text

단, 세션 재개는 컨텍스트 한도 문제를 해결하지 않는다. 이전 대화가 이미 길었다면 재개해도 곧 컨텍스트가 꽉 찰 수 있다. 이 경우에는 새 세션을 시작하되, 이전 작업의 결과 파일을 컨텍스트로 넘기는 방식이 더 안정적이다.


파일 기반 상태 관리 (권장)

headless 자동화의 가장 안정적인 재개 전략은 중간 결과를 파일로 저장하고, 다음 세션에서 해당 파일을 프롬프트에 포함하는 것이다. 대화 상태에 의존하지 않으므로 컨텍스트 초과와 무관하게 작동한다.


자동화에서 리밋 대응 전략 — 도구별 기능 비교 차트
클로드 코드 완전 자동화 #3 — 리밋 걸리면? 중단과 재개 전략 — 도구별 기능 비교 차트 (출처: 공식 문서 및 벤치마크 데이터 기반)
파일 기반 상태 관리 패턴 (multi-step 작업)
#!/usr/bin/env bash # 작업을 단계별 파일로 분리해 재개 가능하게 만드는 패턴 WORK_DIR=".claude_work" mkdir -p "$WORK_DIR" # 단계 1 — 코드 분석 (아직 결과 파일이 없을 때만 실행) if [ ! -f "$WORK_DIR/step1_analysis.txt" ]; then echo "[STEP 1] 코드 분석 중..." claude -p "src/ 디렉토리의 함수 목록을 정리해줘" \ --output-format text > "$WORK_DIR/step1_analysis.txt" fi # 단계 2 — 이전 단계 결과를 프롬프트에 포함 if [ ! -f "$WORK_DIR/step2_tests.txt" ]; then echo "[STEP 2] 테스트 생성 중..." ANALYSIS=$(cat "$WORK_DIR/step1_analysis.txt") claude -p "다음 함수 목록에 대한 단위 테스트를 작성해줘:\n\n$ANALYSIS" \ --output-format text > "$WORK_DIR/step2_tests.txt" fi echo "[DONE] 모든 단계 완료."
⚠️ 막히는 케이스: --resume 플래그를 썼는데 session not found 에러가 남 → 세션은 로컬에 일정 기간만 보관된다. 며칠 이상 지난 세션 ID는 만료돼 재개할 수 없다 → 파일 기반 상태 관리로 전환하거나, 세션 ID 보관 주기를 최대 24시간 이내로 설계할 것.

비용 최적화 — 리밋을 덜 만나는 방법

리밋에 덜 걸리는 가장 직접적인 방법은 토큰 소모를 줄이는 것이다. 클로드 코드(Claude Code) 자동화에서 적용할 수 있는 방법들이다.


모델 선택

Claude Code는 기본적으로 claude-sonnet을 사용한다. 단순 반복 작업(포맷 변환, 간단한 리팩토링 등)에는 더 저렴한 모델을 지정할 수 있다.


모델 지정 — headless 모드에서 사용
# 기본 (Sonnet — 균형) claude -p "작업 내용" --model claude-sonnet-4-5 # 저렴한 모델 (Haiku — 단순 작업용) claude -p "작업 내용" --model claude-haiku-4-5 # 고성능 모델 (Opus — 복잡한 아키텍처 설계 등) claude -p "작업 내용" --model claude-opus-4-5

.claudeignore로 불필요한 파일 제외

클로드 코드는 프로젝트 디렉토리를 탐색할 때 .claudeignore에 명시된 경로를 제외한다. 대규모 프로젝트에서는 컨텍스트에 들어오는 파일 수를 줄이는 것만으로도 토큰 소모가 크게 줄어든다.


중단 후 이어가기 — 세션 재개 전략 — 실전 워크플로우 다이어그램
클로드 코드 완전 자동화 #3 — 리밋 걸리면? 중단과 재개 전략 — 실전 워크플로우 다이어그램 (출처: 공식 문서 및 벤치마크 데이터 기반)
.claudeignore 예시 — 불필요한 디렉토리 제외
# .claudeignore node_modules/ dist/ build/ .next/ .git/ coverage/ *.log *.lock *.min.js *.map public/ assets/images/

CLAUDE.md로 컨텍스트 집중

프로젝트 루트에 CLAUDE.md를 두면 클로드 코드가 세션 시작 시 이 파일을 먼저 읽는다. 여기에 작업 범위, 금지 사항, 자주 쓰는 명령어를 명시하면 매번 긴 프롬프트를 전달할 필요가 없어 토큰이 절약된다. 이미 CLAUDE.md가 있다면 반복적인 지시 문구를 프롬프트에서 제거할 수 있다.


최적화 방법효과적용 난이도
.claudeignore 설정컨텍스트 토큰 대폭 감소낮음
작업 단위 분리세션 길이 단축, 재시도 용이낮음
Haiku 모델 지정비용 최대 95% 절감 (단순 작업)낮음
CLAUDE.md 활용프롬프트 길이 단축낮음
파일 기반 상태 관리컨텍스트 누적 방지중간

실전 패턴 — 리밋 안전 자동화 스크립트

아래는 시리즈에서 다룬 내용을 모두 통합한 실전 자동화 스크립트다. 시간당 실행 횟수 제한, 에러 감지, 슬랙 알림, 일일 비용 상한 설정을 포함한다.


리밋 안전 자동화 스크립트 — 통합 버전
#!/usr/bin/env bash # safe_claude_runner.sh — rate limit + 비용 상한 + 슬랙 알림 통합 # 설정값 SLACK_WEBHOOK="https://hooks.slack.com/services/YOUR/WEBHOOK/URL" MAX_RUNS_PER_HOUR=10 # 시간당 최대 실행 횟수 DAILY_COST_LIMIT=5.0 # 일일 비용 상한 (달러, 개인 추적용) RUN_LOG=".claude_run_log.txt" COST_LOG=".claude_cost_log.txt" WORK_DIR=".claude_work" mkdir -p "$WORK_DIR" send_slack_alert() { local MESSAGE="$1" if [ -n "$SLACK_WEBHOOK" ]; then curl -s -X POST -H 'Content-type: application/json' \ --data "{\"text\": \"[Claude Auto] $MESSAGE\"}" \ "$SLACK_WEBHOOK" > /dev/null fi echo "[ALERT] $MESSAGE" } check_hourly_rate() { local NOW=$(date +%s) local ONE_HOUR_AGO=$((NOW - 3600)) local RECENT_RUNS=0 if [ -f "$RUN_LOG" ]; then RECENT_RUNS=$(awk -v cutoff="$ONE_HOUR_AGO" '$1 > cutoff' "$RUN_LOG" | wc -l) fi if [ "$RECENT_RUNS" -ge "$MAX_RUNS_PER_HOUR" ]; then send_slack_alert "시간당 실행 한도($MAX_RUNS_PER_HOUR)에 도달. 다음 시간까지 대기." sleep 3600 fi echo "$(date +%s)" >> "$RUN_LOG" } run_task() { local TASK_NAME="$1" local PROMPT="$2" local OUTPUT_FILE="$WORK_DIR/${TASK_NAME}.txt" # 이미 완료된 작업은 건너뜀 if [ -f "$OUTPUT_FILE" ]; then echo "[SKIP] $TASK_NAME — 이미 완료됨" return 0 fi check_hourly_rate echo "[RUN] $TASK_NAME" OUTPUT=$(claude -p "$PROMPT" --model claude-sonnet-4-5 \ --output-format text 2>&1) EXIT_CODE=$? if echo "$OUTPUT" | grep -qi "rate.limit\|429\|too many requests"; then send_slack_alert "Rate limit 감지: $TASK_NAME. 60초 후 재시도." sleep 60 run_task "$TASK_NAME" "$PROMPT" # 재귀 재시도 return fi if echo "$OUTPUT" | grep -qi "usage limit\|billing\|402"; then send_slack_alert "구독 한도 또는 크레딧 소진. 자동화 중단." exit 2 fi if [ $EXIT_CODE -ne 0 ]; then send_slack_alert "오류 발생 (exit $EXIT_CODE): $TASK_NAME" return 1 fi echo "$OUTPUT" > "$OUTPUT_FILE" echo "[OK] $TASK_NAME 완료 → $OUTPUT_FILE" } # 작업 목록 실행 run_task "analyze" "src/의 함수 목록을 정리해줘" run_task "test_gen" "$(cat "$WORK_DIR/analyze.txt" 2>/dev/null) 위 함수들에 대한 단위 테스트를 작성해줘" run_task "docs" "$(cat "$WORK_DIR/analyze.txt" 2>/dev/null) 위 함수들에 대한 JSDoc 주석을 작성해줘" send_slack_alert "모든 작업 완료." echo "[DONE]"
💡 팁: $WORK_DIR/${TASK_NAME}.txt 파일이 있으면 해당 작업을 건너뛰는 로직이 핵심이다. 스크립트가 중간에 중단되더라도 다음 실행에서 완료된 작업은 다시 실행하지 않는다. cron으로 주기적으로 돌리면 실패한 작업만 자동으로 재시도된다.
📌 참고: 슬랙 알림 없이도 이 스크립트는 동작한다. SLACK_WEBHOOK을 빈 문자열로 두면 알림 전송을 건너뛴다. 이메일 알림이 필요하다면 send_slack_alert 함수 안에 mail -s "Claude Alert" you@example.com <<< "$MESSAGE"를 추가하면 된다.

시리즈 마무리 — 핵심 체크리스트

클로드 코드(Claude Code) 완전 자동화 3편 시리즈에서 다룬 내용을 체크리스트로 정리한다.


항목확인
--dangerously-skip-permissions 이해 및 적용#1
headless 모드(claude -p) 사용#1
cron / launchd 스케줄링 설정#2
GitHub Actions 연동#2
.claudeignore로 불필요한 파일 제외#3
429 / usage limit 에러 감지 로직#3
파일 기반 상태 관리로 재개 가능 설계#3
모델 선택으로 비용 최적화#3
알림(슬랙/이메일) 연동#3

참고: Claude Code 공식 문서 / CLI 레퍼런스


자주 묻는 질문

다른 대안과 비교했을 때 어떤 상황에 적합한가요?

재개 방식은 작업 길이로 갈립니다. 짧고 하루 안에 끝나는 작업이라면 --resume에 세션 ID를 넘겨 대화 컨텍스트를 그대로 이어가는 것이 간편하지만, 세션은 며칠이면 만료되고 컨텍스트 한도 문제도 해결하지 못합니다. 그래서 multi-step이거나 여러 날 걸치는 자동화에는 중간 결과를 파일로 저장하고 다음 프롬프트에 그 파일을 넣는 파일 기반 상태 관리가 적합합니다. 리밋 대응도 나뉘어, rate limit(429)은 지수 백오프로 재시도하는 것이 맞지만 구독 한도나 402 크레딧 소진은 재시도가 무의미하니 즉시 중단하고 알림을 보내는 쪽이 옳습니다.


더 깊게 공부하려면 어떤 자료를 보면 좋을까요?

리밋의 실체를 정확히 알려면 Anthropic 공식 문서의 Rate limits 페이지에서 429 응답 헤더(retry-after)와 토큰·요청 한도 구조를 먼저 보시길 권합니다. 컨텍스트가 자주 꽉 찬다면 가이드 #18 컨텍스트·토큰 최적화 편과 /compact 동작 문서를, 비용을 줄이려면 모델별 가격표에서 Haiku와 Sonnet의 토큰 단가 차이를 확인하면 모델 선택 기준이 명확해집니다. 그리고 --resume·--output-format json·session_id 필드의 정확한 동작은 Claude Code CLI 레퍼런스(docs.anthropic.com/en/docs/claude-code/cli-reference)에서 다시 맞춰보세요.


클로드 코드 완전 자동화 #3, 한 줄로 정리하면 어떻게 되나요?

자동화 중 마주치는 리밋은 rate limit(429), 컨텍스트 200K 초과, 구독 월 한도, API 크레딧 소진의 네 가지이며 해결 경로가 제각각입니다. 리밋에 걸리면 그 세션은 멈추지만, 작업을 독립 단위로 쪼개고 중간 결과를 파일로 저장한 뒤 에러 문자열을 grep해 재시도할지 중단할지 분기하면 자동으로 이어갈 수 있습니다. 핵심은 리밋을 피하는 게 아니라, 걸렸을 때 스크립트가 올바르게 반응하도록 설계하는 것입니다.


실무에서 처음 도입할 때 가장 먼저 확인할 것은 무엇인가요?

자동화 스크립트가 리밋 에러를 제대로 구분해 처리하는지부터 확인하세요. headless 모드의 claude -p는 rate limit이 걸려도 대화형처럼 알아서 대기·재시도하지 않고 즉시 종료되기 때문에, exit code만 보는 스크립트는 실패를 성공으로 오인합니다. 그래서 stdout과 stderr에서 429, rate limit, too many requests 문자열을 직접 grep해 재시도 대상인지, usage limit이나 402 billing처럼 즉시 중단해야 하는 상황인지를 갈라야 합니다. 재시도 가능한 리밋은 지수 백오프로 대기시키고, 구독 한도·크레딧 소진은 재시도 없이 exit code 2로 끊어 알림을 보내는 분기 구조를 처음부터 넣는 것이 가장 먼저 점검할 부분입니다.


가장 자주 발생하는 실수나 함정은 무엇인가요?

가장 흔한 함정은 종료 코드를 맹신하는 것입니다. headless 모드에서 rate limit이 걸렸는데 exit code가 0으로 떨어지는 경우가 있어, 코드만 보는 스크립트는 멀쩡히 성공한 줄 알고 빈 결과를 다음 단계로 넘깁니다. 두 번째 함정은 /compact를 써도 컨텍스트가 계속 꽉 차는 상황인데, node_modules·.git·dist 같은 디렉터리를 .claudeignore로 빼지 않고 한 세션에 너무 많은 파일을 올린 탓입니다. 세 번째는 --resume으로 이어가려다 session not found가 나는 경우로, 로컬 세션은 며칠 지나면 만료되므로 세션 ID에 의존하지 말고 중간 결과를 파일로 저장해 다음 프롬프트에 넘기는 파일 기반 상태 관리로 설계해야 안전합니다.


🎓 관련 강의


Claude Code 완전 정복 — 유데미 강의


이 글에서 다룬 내용을 더 체계적으로 배우고 싶다면 강의를 확인해보세요. 실전 예제 중심으로 구성되어 있습니다.


강의 살펴보기 →
claude-code클로드 코드자동화리밋비용재시도

관련 도구

관련 포스트