대형 프로젝트에서 작업하다 보면 Claude Code가 앞부분을 잊어버리는 것처럼 느껴질 때가 있습니다. 컨텍스트 윈도우에 담을 수 있는 양이 한정되어 있기 때문입니다. 어떻게 관리하느냐에 따라 작업 품질이 달라집니다.
언어 모델이 한 번에 처리할 수 있는 텍스트의 최대 크기입니다. 대화 기록, 읽은 파일, 실행 결과가 모두 이 안에 들어가야 합니다.
토큰(Token): 언어 모델이 텍스트를 처리하는 단위. 대략 영어 4글자 또는 한글 1~2글자. Context Window 크기는 토큰 수로 표시됩니다.
컨텍스트가 꽉 차면:
현재 대화를 요약해 컨텍스트를 줄입니다.
claude> /compact
전체 대화를 핵심 요점 위주로 압축합니다. 세부 내용 일부는 손실되지만 중요한 맥락은 유지됩니다.
{
"autoCompact": true,
"autoCompactThreshold": 0.8
}
컨텍스트 사용량이 80%를 넘으면 자동으로 압축합니다.
하나의 세션에 너무 많은 작업을 담지 않습니다.
# 권장: 기능별 세션 분리
claude # 로그인 기능
claude # 결제 기능
claude # 알림 기능
# 비권장: 하나의 세션에 모든 작업
claude # 로그인 + 결제 + 알림 + 리팩토링 + 테스트 ...
모든 파일을 읽게 하기보다 필요한 파일만 지정합니다.
X: "전체 프로젝트 파악하고 버그 고쳐줘"
O: "user.service.ts의 getUserById 함수에서
null 체크가 누락됐어. 거기만 봐줘"
긴 출력이 예상되는 작업에서 요약을 요청합니다.
"테스트 실행하고 실패한 것만 요약해줘.
전체 로그는 출력하지 않아도 돼"
매 요청마다 자동으로 컨텍스트를 주입하는 방법입니다.
CLAUDE.md의 내용은 매 세션마다 자동으로 컨텍스트에 포함됩니다. 프로젝트 핵심 정보를 여기에 담으면 항상 Claude가 알 수 있습니다.
{
"hooks": {
"UserPromptSubmit": [
{
"hooks": [{
"type": "command",
"command": "node .claude/context-provider.js"
}]
}
]
}
}
// .claude/context-provider.js
const branch = require('child_process')
.execSync('git branch --show-current').toString().trim();
const status = require('child_process')
.execSync('git status --short').toString().trim();
process.stdout.write(
`현재 브랜치: ${branch}\n변경 파일:\n${status}`
);
매 요청마다 Git 상태가 자동으로 컨텍스트에 추가됩니다.
claude> /context
현재 컨텍스트 사용량과 남은 용량을 확인합니다.
세션이 종료되면 컨텍스트도 사라집니다. --resume으로 이전 세션을 재개하면 해당 세션의 컨텍스트가 복원됩니다.
claude --resume
단, 압축된 컨텍스트는 요약본만 복원됩니다.
큰 파일 전체를 읽게 하면 컨텍스트를 많이 차지합니다.
X: "package-lock.json 읽고 의존성 정리해줘"
→ 수천 줄이 컨텍스트를 채움
O: "package.json의 dependencies 목록만 봐줘"
→ 필요한 부분만 읽음
특정 줄 범위나 함수 단위로 읽도록 지시하면 컨텍스트 효율이 높아집니다.
컨텍스트는 소모품이 아닌 자원입니다. 불필요한 내용으로 채우지 않고, 작업에 필요한 정보만 담는 것이 효율적인 사용법입니다.
/clear 또는 새 세션 시작