당사(合同会社ジョインクラス, 직원 1명)는 launchd의 정기 작업을 통해 claude -p를 무인으로 실행하여 부서별 상황 정리, 기획 기사 소재 보충, 리드 수집 등의 업무를 처리하고 있습니다.
월간 사용량 상한선을 $200, $160으로 설정하고 Slack에 경고 메시지를 보내는 시스템도 구축했습니다. 안심하고 있었는데, 2026년 9월 25일에 실제 비용을 확인해 보니 이 안전장치가 한 번도 작동하지 않은 상태였습니다.
원인은 간단합니다. 비용 기록 함수가 '호출 측에서 전달한 추정치'만을 합산하는 구조였기 때문입니다. 아침 요약 스크립트는 매번 고정 값인 0.02를 전달하고 있었습니다. 즉, 가상의 숫자로 상한선 판정을 하고 있었던 것입니다.
이 글에서는 먼저 실제 측정할 수 있도록 만든 방법을 설명하고, 그 후 실측 데이터를 기반으로 줄인 5가지 지점을 실제로 작동하는 코드와 함께 소개하겠습니다.
claude --output-format json으로 실행하면 응답 JSON 안에 total_cost_usd와 usage가 포함되어 있습니다. 이것을 그대로 합산하면 실제 사용량을 측정할 수 있습니다.
당사의 구현은 두 개의 파일로 이루어져 있습니다. 먼저 래퍼(wrapper)입니다.
핵심은 표준 출력에 응답 텍스트만 흘려보내는 것입니다. 기존의 RESULT=$(claude -p "...")를 RESULT=$(claude_run 라벨 -p "...")로 대체하는 것만으로 수십 개의 스크립트를 한 번에 마이그레이션할 수 있었습니다.
다음은 JSON을 받아 기록하는 쪽입니다(핵심 내용만 발췌).
def main():
label = sys.argv[1]
raw = sys.stdin.read()
...
작업 단위로 cache_creation_tokens까지 남겨둔 것이 효과적이었습니다. 실제로 축적된 데이터는 다음과 같은 형태입니다(2026년 11월 10일자 일부).
{
"month": "2026-11",
"total_usd": 30.3496,
...
}
- 인증 만료 등은 stderr에 출력됩니다. 마이그레이션 직후에는 이 부분을 제거하고 수동으로 한 번 실행해 보세요.
2>/dev/null을 제거하고 디버깅하는 것이 좋습니다.
- JSON이 아닌 출력은 통과시킵니다: 파싱(parse)에 실패하더라도 응답을 버리지 않도록 처리하지 않으면, 후속 처리가 빈 문자열로 작동하게 됩니다.
측정을 시작하며 가장 놀랐던 점은, “2+2는?”이라고 묻기만 해도 한 번 $0.27~$0.47이 소요되고 있었다는 것입니다.
내역을 살펴보니, 캐시 생성에 약 41,000 토큰이 사용되었습니다. 이 중 자사 파일(CLAUDE.md・에이전트 정의・스킬)은 약 5,800 토큰밖에 없습니다. 나머지는 Claude Code 측의 고정 오버헤드입니다.
즉, “CLAUDE.md를 짧게 하면 된다”는 식의 효과는 미미하며, 효과적인 것은 호출 빈도와 한 번의 작업에서 무엇을 시키느냐였습니다. 아래 5가지 지점은 이러한 전제 하에 최적화되었습니다.
부서별 상황 정리 같은 정형화된 업무에는 깊은 추론이 필요하지 않습니다.
source "$SCRIPT_DIR/lib/claude-run.sh"
RESULT=$(claude_run dept-dev --effort low -p "
...
... (STATE.md를 읽고 차이점을 요약하라는 지시)
...
당사에서는 --effort low를 붙이지 않은 작업이 단 하나 남아있는데, 비교하니 큰 차이가 납니다.
| 작업 | effort | 1회당 비용 |
|---|
| dept-dev | low | 약 $0.35 |
| ... | | |
프롬프트 내용 자체가 다르기 때문에 순수한 비교는 아닙니다. 다만, 캐시 생성 토큰도 약 1.7배 많고, 도구 호출이 늘어나 왕복(round trip)이 많아진 흔적이 보입니다. 검증 방법은 간단합니다. 같은 작업을 --effort low가 있는 경우와 없는 경우로 각각 몇 번씩 실행하여, jobs.<라벨>.usd / calls를 비교해 보세요.
기획 기사 소재 보충(replenish)은 호출 빈도가 가장 높은 작업입니다. 조사 과정과 집필 과정을 거치면서 전달하는 도구를 분리했습니다.
조사 과정: 읽기만 할 때
claude_run replenish --effort low --allowedTools "Read,WebSearch,WebFetch" -p "..."
집필 과정: 인터넷 검색 불필요
...
집필 중에 '혹시 몰라 검색'이 시작되면, 검색 결과가 그대로 컨텍스트에 포함되어 토큰이 증가합니다. 도구를 부여하지 않으면 곁가지로 빠질 수 없습니다. 보안 측면에서도 무인 실행 시 불필요한 권한을 주지 않는 것이 좋습니다.
래퍼(wrapper)에 넣어둔 --max-budget-usd 3은 한 번의 실행으로 사용할 수 있는 상한선입니다. 무인 작업에서 위험한 것은 평균값이 아니라, 루프에 빠진 단 한 번의 실행입니다. 월별 상한 가드만으로는, 깨닫고 보니 하루치가 소모되어 있을 수 있습니다.
이 값은 평소 1회당 비용($0.3~$0.6)의 5배 이상으로 설정했습니다. 너무 타이트하게 잡으면 정상적인 처리가 중간에 중단되어 기사가 절반만 작성되는 등의 다른 사고가 발생할 수 있기 때문입니다.
기록만으로는 부족합니다. 각 스크립트의 맨 앞에서 실제 측정값을 확인하고 중지시킵니다.
check_cost_limit() {
local tracker="$COMPANY_DIR/scripts/cost-tracker.json"
[ -f "$tracker" ] || return 0
...
}
함수 자체는 이전부터 있었습니다. 바뀐 것은 읽히는 숫자가 진짜가 되었다는 점뿐입니다. 처음에 작성했던 '가드가 작동하지 않았다'는 문제는 여기서 비로소 해결되었습니다.
고정 비용이 1회 약 41,000 토큰이라면, 10회를 1회로 통합하는 것이 가장 효과적입니다. 저희 회사는 다음 순서로 검토했습니다.
jobs를 usd가 큰 순으로 정렬합니다 - 상위 작업에 대해 '매번 호출할 필요가 있는지', '이전과 입력값이 바뀌지 않았는데 호출하지는 않았는지'를 확인합니다.
- 변경된 것이 없다면
claude를 호출하지 않고 종료합니다.
상위를 출력하는 명령어는 이것뿐입니다.
jq -r '.jobs | to_entries | sort_by(-.value.usd)[]
| "(.value.usd | tostring | .[0:6])\t(.value.calls)회\t(.key)"' \
.company/scripts/cost-tracker.json
저희 회사의 11월은 replenish (25회, 약 $12)가 전체의 4할을 차지하고 있었습니다. 다음으로 손댈 곳이 여기입니다.
월별 실제 측정값은 다음과 같습니다.
| 월 | 실측 합계 | 비고 |
|---|
| 2026-09 | $26.41 | 9/25부터 측정 시작 (약 6일분) |
| ... | | |
| 정직하게 말하자면, 9월은 측정 기간이 짧아 '줄이기 전'의 깨끗한 비교는 할 수 없습니다. 그럼에도 불구하고 10월의 $128.96에 비해, 11월은 10일 기준으로 $30.35 (이 페이스라면 월 $90 전후)입니다. 그리고 무엇보다, $160 경고 및 $200 중지 가드가 실제 숫자로 작동하게 된 것이 가장 큰 성과였습니다. | | |
claude -p를 --output-format json으로 변경하여, total_cost_usd를 작업별로 기록합니다 - 일주일 동안 모은 후,
usd가 큰 작업을 확인합니다 - 정형화된 작업에는 --effort low를 사용하고,
과정별로 --allowedTools를 좁힙니다 -
--max-budget-usd로 1회분 예산을 설정하고, check_cost_limit으로 월별 상한을 적용합니다 - 마지막으로, 호출 횟수 자체를 줄입니다.
순서가 중요합니다. 측정보다 먼저 CLAUDE.md를 줄여도, 저희 회사 같은 경우에는 전체의 1할 남짓에만 효과적이었습니다.
경영 관점에서 볼 때, AI 비용에서 무서운 것은 높은 자체가 아니라, 알 수 없는 것입니다. 숫자가 보이면 판단할 수 있습니다. 저는 이 작업을 통해 '비용은 1/10로 줄어들지만, 매출이 10배가 되는 건 아니다'라는 점을 다시 한번 실감했습니다. 절약된 돈과 시간은 매출에 직접 연결되는 업무에 투입하고 있습니다.
CLAUDE.md 및 설정, 비용 관리의 설계 과정을 체계적으로 정리한 책을 쓰고 있습니다.
- 『CLAUDE.md 설계 패턴』
- launchd / cron에서의 무인 실행 관련 내용은 『Claude Code 자동화 바이블』