Claude 무인 루프가 플랜 사용량을 소모한 사례

중단 조건이 없는 LLM 루프가 하룻밤 동안 내 Claude 구독에서 실행되며 플랜 사용량을 13퍼센트포인트나 소모했다. 문제는 토큰당 가격이 아니었다. 코드 안에는 루프를 끝낼 수 있는 것이 아무것도 없었고, 그걸 지켜보는 사람도 없었다. 이 글에서는 Claude 플랜 한도가 실제로 어떻게 동작하는지, 사용량을 어떻게 읽는지, 그리고 내가 이제 무인 루프마다 넣는 3가지 제한에 대해 다룬다.
한도는 채팅 앱과 공유된다

Pro와 Max 구독에는 Claude Code가 포함되며, 한도는 5시간 세션 한도와 7일 주간 한도라는 두 개의 미터로 제공된다. Anthropic의 도움말에 따르면 Claude와 Claude Code는 같은 풀을 사용한다. 채팅 앱에서 쓴 만큼 Claude Code가 사용할 수 있는 양이 줄어들고, 반대도 마찬가지다.
이런 공유 구조 때문에 아침에 보이는 “예상보다 높게 나온” 막대를 터미널만 보고는 설명하기 어렵다. 사용량의 일부가 앱에서 발생했다면, 터미널의 세부 내역에는 나타나지 않는다.
한도에 도달했을 때 헷갈리기 쉬운 점 두 가지가 있다:
- 모델을 바꾸는 건 메시지에 특정 모델이 명시되어 있을 때만 도움이 된다. 예를 들어 Opus 전용 한도 같은 경우다. 일반적인 “모든 모델” 메시지라면, 모델을 바꿔도 아무런 효과가 없다.
- 선택지는 기다리기, 사용량 크레딧을 켜기, 또는 리셋 후 자동 계속이다. 자동 계속은 v2.1.234 이상에서
/rate-limit-options로 설정하며, 조직에서는autoContinueAtUsageLimit설정을 사용한다.
사용량 크레딧에는 부작용이 있다. 프롬프트 캐시 수명이 1시간(60분)에서 5분으로 줄어들어 같은 작업 습관이 더 많은 비용을 만든다. 또한 Max에 포함된 월간 API 크레딧은 Claude Code 한도를 늘리는 데 사용할 수 없다.
/usage를 올바르게 읽기
Claude Code 안에서 /usage를 입력한다. 구독자라면 Session 블록은 무시하고 플랜 사용량 막대와 그 아래 세부 내역을 본다. 세부 내역은 세 부분으로 나뉜다:
- Attribution : skill, subagent, plugin, MCP server별 사용량 비중.
- Behavior flags : 긴 컨텍스트나 캐시 미스 같은 항목.
- Loops : 예약 작업당 실행 횟수와 토큰 수(v2.1.242 이상).
d를 누르면 최근 24시간, w를 누르면 최근 7일을 볼 수 있다. 한 가지 주의점: 이 수치는 현재 사용 중인 기기의 로컬 기록에서 나온다. 다른 기기와 claude.ai 앱에서의 사용량은 포함되지 않는다.
하룻밤 사고가 어떤 모습이었는가
2026-08-01에 LLM 루프 하나가 아무도 승인하지 않은 채 밤새 실행되었고, 플랜 사용량은 13퍼센트포인트 증가했다. 여기서 13은 미터의 수치, 즉 전후 비교값이다. 어떤 변환 계수도 추정일 뿐이므로, 나는 의도적으로 이를 토큰 수로 바꾸지 않았다. (전체 사고 보고에는 자세한 내용이 있다.)
근본 원인은 루프가 멈출 수 없었다는 점이었다. 사람이 지켜보고 있었다면 몇 분 안에 종료됐을 것이다. 더 저렴한 모델로 바꿨더라도 아무것도 해결되지 않았을 것이다. 빠져야 할 종료 조건이 여전히 없었기 때문에, 단지 더 천천히 소모될 뿐이었을 테니까.
루프에 3가지 제한을 넣기

이 중 적어도 두 가지를 골라 코드에 강제하라: 연속 실패 제한, 총 호출 수 제한, 그리고 벽시계 기준 시간 제한. 내 예시의 값은 연속 실패 3회, 호출 200회, 3시간이다.
import time
MAX_FAILS, MAX_CALLS, MAX_SECONDS = 3, 200, 3 * 3600
def run(task, step):
start, calls, fails = time.time(), 0, 0
while not task.done():
if fails >= MAX_FAILS:
return "stopped: 3 consecutive failures"
if calls >= MAX_CALLS:
return "stopped: 200 calls"
if time.time() - start >= MAX_SECONDS:
return "stopped: 3 hours"
calls += 1
try:
step(task)
fails = 0
except Exception:
fails += 1
return "done"이 검사는 매 반복마다 실행되며, 함수는 멈춘 이유를 반환하므로 로그로 남길 수 있다. 먼저 가드를 테스트하라: step에 항상 예외를 던지는 함수를 넣고, 정확히 3번 시도한 뒤 실패 메시지가 나오는지 확인하라.
한 가지 함정이 있다. 429 쿨다운은 제한이 아니다. 새 한도 창이 열릴 때마다 루프를 되살리기 때문에, 이는 재개 메커니즘이다. 즉, 루프가 공손하게 영원히 돌도록 해준다.
무인 실행 전에 확인할 체크리스트
- 시작하기 전에 예상 사용량을 적어 둔다.
- 사람이 그 추정을 승인하게 한다.
- 최소 두 개의 제한을 설정하고 테스트한다.
- 종료 시 중단 사유와 사용량을 기록합니다.
- 매달 한 번, 모든 cron 작업, 스케줄러 항목, 백그라운드 실행기를 점검합니다.
가드가 적용되는 것은 직접 작성한 루프뿐입니다. Claude Code의 자체 /loop는 /usage의 Loops 행을 확인하고, 직접 끄거나 간격을 더 길게 조정해야 합니다. 또한 앱 사용량은 세부 내역에 포함되지 않으므로, 오전에 막대가 높게 보인다고 해서 화면만으로는 항상 그 원인을 알 수 없습니다.
제한, 크레딧, 모델 전환에 대한 FAQ를 포함한 전체 글은 my-blog.org의 원문 게시물 에 있습니다.
제가 개인 사이트에 두는 무료 도구: 34개의 계산기와 사용 방법 안내 - 대출, 퇴직금, 실수령 월급, 저축과 예금 비교. 새 도구는 광고 없이 한 통의 이메일로 안내됩니다.
출처
- 원문: https://dev.to/sungwoo_lee_e0f26be4a29fd/one-unattended-claude-loop-burned-13-points-of-plan-usage-215d (2026-10-19 · Sungwoo Lee)