클로드 코드 실전 꿀팁 5편 - 토큰 아끼기

2026. 08. 31.

검색하면 토큰 아끼는 법이 수십 개 나옵니다. 그런데 대부분은 도구가 자기 계기판에 찍은 숫자예요. 여러분의 청구서와는 다른 이야기입니다.

여섯 가지입니다. 1번만 파일을 한 번 고치면 끝나고, 나머지는 작업하는 방식 쪽에 있어요.


1. 설정 세 가지를 확인해요

~/.claude/settings.json을 열고 아래 세 가지를 봅니다. 두 개는 넣는 것이고 하나는 이미 켜져 있는지만 보면 됩니다.

1-1. 서브에이전트는 싼 모델로 돌려요

CLAUDE_CODE_SUBAGENT_MODEL은 서브에이전트가 쓸 기본 모델입니다. 조사나 탐색처럼 판단이 단순한 작업에 상위 모델을 붙일 이유가 없어요.

{
  "env": {
    "CLAUDE_CODE_SUBAGENT_MODEL": "sonnet"
  }
}

다음 서브에이전트 작업을 돌린 뒤 /usage에 서브에이전트 몫이 따로 잡히면 걸린 것입니다.

1-2. 서브에이전트 캐시를 1시간으로 늘려요

구독으로 쓰면 메인 대화는 캐시가 1시간 유지되는데 서브에이전트는 해당되지 않습니다. subagentPromptCacheTtl을 적어야 붙어요.

{
  "subagentPromptCacheTtl": "1h"
}

대신 1시간 TTL은 캐시를 만들 때가 더 비쌉니다. 서브에이전트를 자주 띄우는 편이면 넣고, 어쩌다 한 번이면 굳이 안 넣어도 됩니다.

걸렸는지 확인할 방법은 없습니다. settings.json에 값이 들어갔다는 것까지가 알 수 있는 전부예요.

1-3. 툴 검색은 이미 켜져 있어요

툴 검색은 MCP 툴 정의를 필요할 때만 불러오는 기능입니다. 독립 측정으로 확인된 약 20% 절감이고, 잘라내는 게 없어서 부작용도 없어요.

여기서 넣을 값은 없습니다. ENABLE_TOOL_SEARCH를 비워 둔 기본 상태가 이미 MCP 툴 전부를 미뤄 두는 설정이에요. auto:5처럼 임계값을 주면 그 안에 드는 툴은 오히려 미리 올라옵니다.

덤으로 "MCP 서버를 3~6개로 줄여라"라는 조언도 여기서 정리됩니다. 툴 검색이 기본으로 켜진 지금은 대부분 불필요한 조언이에요.


2. 작업이 끝나면 커밋해요

컨텍스트를 가장 많이 먹는 건 우리가 쓴 프롬프트가 아니라 도구 실행 결과입니다. 한 감사 데이터에서는 전체의 약 60%가 도구 결과였고, 그중 82%는 줄여도 되는 내용이었어요.

같은 명령이라도 편차가 큽니다. git status 하나가 5토큰일 때도 있고 5,491토큰일 때도 있어요. 이 차이는 설정이 아니라 그 명령을 어떤 상태에서 부르느냐가 만듭니다.

클로드는 회귀를 확인하려고 git diff를 자주 부릅니다. 커밋하지 않은 변경이 쌓여 있으면 그때마다 그 전부를 다시 읽어요. 작업이 끝날 때마다 커밋하면 diff가 비고 매 메시지가 가벼워집니다.

복사해서 쓰기 - CLAUDE.md에 한 줄

작업 단위가 끝나면 커밋한다. git diff를 비워두는 것이 컨텍스트를 아낀다.

클로드가 알아서 커밋하고 다음 git diff가 짧게 돌아오면 제대로 걸린 것입니다.

같이 붙는 습관들이에요.

  • git diff 전에 git diff --stat
  • 전체 테스트 대신 관련된 것 하나
  • 설치와 로그는 --silent, --tail 100

3. ripgrep, ast-grep을 사용해요

클로드는 코드를 찾을 때 먼저 검색을 돌리고, 결과가 애매하면 그 파일들을 열어서 확인합니다.

apiKey가 어디서 선언됐는지 찾는다고 해봅시다. grep apiKey는 변수 선언만이 아니라 주석, 문자열, 프로퍼티 접근까지 전부 걸어요. 서른 줄이 나오면 클로드는 어느 게 맞는지 보려고 파일 대여섯 개를 엽니다. 한 파일이 500줄이면 그것도 통째로 컨텍스트에 들어가요.

ast-grep으로 변수 선언만 찾으면 결과가 한 줄입니다. 열어볼 파일이 없어요.

아끼는 건 검색 자체가 아니라 검색 뒤에 따라오는 읽기입니다. 검색 결과를 좁히면 그 읽기가 통째로 사라져요.

찾는 것도구
리터럴 텍스트, 에러 문자열, 로그rg (ripgrep)
코드 구조 - 호출부, prop, 시그니처ast-grep
심볼 정의와 참조LSP

설치하고 클로드에게 알려주기

brew install ripgrep ast-grep

설치만으로는 클로드가 알아서 쓰지 않습니다. 두 가지를 더 합니다.

하나. ~/.claude/settings.json 허용 목록에 넣습니다. 안 넣으면 부를 때마다 승인 프롬프트가 떠요.

{
  "permissions": {
    "allow": ["Bash(rg:*)", "Bash(ast-grep:*)"]
  }
}

둘. CLAUDE.md에 언제 무엇을 쓸지 적습니다.

검색은 용도로 나눈다. 리터럴은 rg, 코드 구조는 ast-grep, 심볼 정의와 참조는 LSP.
여러 파일에 같은 수정을 넣을 때는 ast-grep --interactive를 쓴다.

다음에 뭔가를 찾을 때 클로드가 파일을 열기 전에 ast-grep -p ...를 먼저 부르면 제대로 걸린 것입니다.

진짜 이득은 검색이 아니라 수정이에요

40개 파일에서 같은 패턴을 바꾼다고 해봅시다. 클로드가 직접 하면 파일 40개를 읽고 수정 40개를 출력합니다.

읽은 쪽은 캐시에 얹히면 다음 요청부터 10분의 1로 다시 읽힙니다(5번). 출력에는 그 할인이 없어요. 비용을 결정하는 건 출력 쪽입니다.

# 1. 먼저 무엇이 걸리는지 확인
ast-grep -p '$PROP && $PROP()' src

# 2. 하나씩 승인하며 변경
ast-grep -p '$PROP && $PROP()' -r '$PROP?.()' --interactive src

# 3. 검증
git diff --stat && npm test

명령 한 줄이 나가고 git diff --stat만 돌아옵니다. 40개 파일의 내용은 컨텍스트에 올라오지 않아요.

--update-all은 확인 없이 전부 적용하니 쓰지 않습니다. -l도 빼세요. -l ts로 못 박으면 .tsx나 .js를 그냥 지나갑니다.


4. effort는 낮추고 필요할 때만 올려요

effort는 모델이 얼마나 깊게 생각할지 정하는 값입니다. 기본값이 high라서, 별도로 정하지 않았다면 간단한 일까지 전부 가장 깊게 생각하는 설정으로 돌고 있어요.

사고 토큰은 출력 토큰으로 청구되고 기본 예산이 요청 하나에 수만 토큰까지 갑니다. 3번에서 본 것처럼 출력에는 캐시 할인이 없어요.

레벨언제 쓰나
low짧고 범위가 분명한 작업. 판단이 거의 필요 없는 일
medium (권장)정확도를 조금 내주고 토큰을 줄인다. 평소 기본으로 두기 좋다
high클로드 코드 기본값. 균형
xhigh, max어려운 문제. max는 과하게 생각하는 경향이 있어 먼저 시험해보고 쓴다

특별한 이유가 없다면 medium기본으로 두세요. 대부분의 작업은 high까지 필요하지 않고, 어려운 문제를 만나면 그 턴에만 올리면 돼요.

복사해서 쓰기 - 기본을 medium으로

/effort medium

인자 없이 /effort만 치면 슬라이더가 열리고, /effort auto로 기본값으로 돌아옵니다.

깊게 생각해야 할 때는 프롬프트에 ultrathink를 넣으면 됩니다. 그 턴만 깊어지고 세션 effort는 그대로예요. API로 나가는 값이 안 바뀌니 캐시도 안 깨집니다.

서브에이전트와 스킬은 파일 frontmatter에 effort를 따로 적을 수 있습니다. 조사용 서브에이전트를 low로 내려두면 1-1의 모델 설정과 같이 붙어요.


5. 세션 중간에 설정을 바꾸지 마세요

프롬프트 캐시는 앞에서부터 순서대로 쌓입니다. 툴 정의가 맨 앞, 그다음 시스템 프롬프트와 CLAUDE.md, 그다음 대화 이력이에요. 캐시를 읽는 값은 원래 가격의 10분의 1입니다.

문제는 앞쪽이 바뀌면 그 뒤가 전부 무효가 된다는 점입니다. 세션 중간에 무심코 하는 행동 넷이 여기 걸려요.

  • 모델 바꾸기 - 캐시는 모델마다 따로입니다. 바꾸는 순간 대화 전체를 정가로 다시 처리합니다.
  • MCP 서버 켜고 끄기 - 툴 정의가 맨 앞이라, 하나만 건드려도 CLAUDE.md와 대화 전체가 날아갑니다.
  • CLAUDE.md 수정 - 세션 시작 때는 거의 공짜지만, 40번째 메시지에서는 비쌉니다.
  • effort 바꾸기 - /effort도 캐시 키에 들어갑니다. 4번은 세션을 시작할 때 정하는 것이고, 도중에 올리면 그 앞이 전부 다시 처리됩니다.

작업을 바꿀 때 /clear하는 건 오히려 싼 선택입니다. 비싼 건 하던 작업 중간에 설정을 건드리는 쪽이에요.


6. 토큰 절감 도구는 켜본 다음 직접 재봐요

셸 출력을 압축해서 토큰을 줄여준다는 도구들이 있습니다 (rtk, headroom 등)

60~90% 절감을 광고해요. 써도 됩니다. 다만 켜는 것만으로 좋아지지는 않습니다.

한 팀이 같은 태스크를 도구 켠 쪽과 끈 쪽으로 짝지어 425회 돌려봤어요.

항목결과 (low effort, 80쌍)
비용+7.6% 더 비쌈 (p=0.004)
턴 수+13.8% (p=0.03)
도구가 실제로 압축하는 토큰+3.2% (사실상 변화 없음)

effort를 high로 올리면 이 차이는 사라집니다(+0.1%). 어느 조건에서도 절감은 없었고, 품질은 양쪽 동일했어요. 이 도구가 나쁘다는 얘기가 아니라 광고 문구가 내 환경에서 그대로 나오지는 않는다는 얘기입니다.

왜 큰 효과가 안 나나

  • 클로드 코드는 파일을 자체 Read/Grep 도구로 읽습니다. 셸 훅을 아예 안 거쳐요
  • 에이전트가 셸에서 돌리는 것의 절반은 압축 대상이 아닌 명령입니다
  • 6분의 1은 파이프나 heredoc이라 도구가 재작성을 거부합니다
  • 남는 건 셸 호출의 33%, 그리고 그건 전체 도구 결과 문자의 20%가 안 됩니다

그 몫을 통째로 70% 압축해도 상한이 입력 토큰의 약 3%입니다. 도구가 나쁜 게 아니라 닿는 면적이 작은 거예요.

그래서 이렇게 재봐요

같은 팀이 잰 다른 도구는 약 10% 절감이 나왔습니다. 되는 것도 있어요. 어느 쪽인지는 내 작업에서 재봐야 압니다.

  1. 한 번에 하나씩만 켭니다. 둘을 같이 켜면 어느 쪽 효과인지 못 가립니다
  2. 켜기 전 일주일과 켠 뒤 일주일을 /usage에서 비교합니다. 하루 단위 d가 아니라 7일 창인 w 토글이에요
  3. 도구가 표시하는 절감률은 보지 않습니다. 자기 숙제를 자기가 채점한 숫자예요
  4. 본전을 뽑는 것만 남깁니다

마지막 체크리스트

서브에이전트 모델과 캐시 TTL을 넣고, 툴 검색이 꺼져 있지 않은지 봤다
작업이 끝나면 커밋해서 git diff를 비운다
rgast-grep을 깔고 허용 목록과 CLAUDE.md에 적어뒀다
/effort medium으로 두고, 필요한 턴에만 ultrathink를 쓴다
세션 중간에 모델, effort, MCP를 바꾸지 않는다
절감 도구는 하나씩 켜고 /usagew 토글로 전후를 비교한다

더 읽어보면 좋을 링크