https://www.anthropic.com/engineering/claude-code-best-practices
최근 Claude Code를 출시했다. 이 커맨드라인 도구는 에이전트 기반 코딩을 지원한다. 연구 프로젝트로 개발된 Claude Code는 Anthropic 엔지니어와 연구원들이 코딩 워크플로우에 Claude를 더 자연스럽게 통합할 수 있게 해준다.
Claude Code는 의도적으로 저수준이며 특정 워크플로우를 강제하지 않는다. 이 도구는 원시 모델에 가까운 접근을 제공하면서도 유연하고 커스터마이즈 가능하며 스크립팅이 가능한 안전한 강력한 도구로 설계되었다. 하지만 이러한 유연성은 에이전트 기반 코딩 도구를 처음 사용하는 엔지니어들에게는 학습 곡선을 요구한다. 적어도 자신만의 모범 사례를 개발할 때까지는 말이다.
이 글에서는 Anthropic 내부 팀과 다양한 코드베이스, 언어, 환경에서 Claude Code를 사용하는 외부 엔지니어들에게 효과적인 것으로 입증된 일반적인 패턴들을 소개한다. 이 목록에 있는 내용은 절대적이거나 보편적으로 적용 가능한 것은 아니다. 이 제안들은 시작점으로 생각하고, 여러분에게 맞는 방법을 실험해보길 권한다.
더 자세한 정보를 원한다면 claude.ai/code에서 제공하는 포괄적인 문서를 참고하라. 이 문서는 이 글에서 언급한 모든 기능을 다루며 추가 예제, 구현 세부 사항, 고급 기법을 제공한다.
Claude Code는 자동으로 컨텍스트를 프롬프트에 포함하는 에이전트형 코딩 어시스턴트다. 컨텍스트 수집은 시간과 토큰을 소모하지만, 환경을 튜닝하여 최적화할 수 있다.
CLAUDE.md
파일 생성하기CLAUDE.md
는 Claude가 대화를 시작할 때 자동으로 참조하는 특별한 파일이다. 이 파일은 다음과 같은 내용을 문서화하기에 이상적이다:
CLAUDE.md
파일은 특별한 형식을 요구하지 않는다. 간결하고 사람이 읽기 쉬운 형태로 작성하는 것을 권장한다. 예를 들어:
# Bash 명령어
- npm run build: 프로젝트 빌드
- npm run typecheck: 타입 체크 실행
# 코드 스타일
- CommonJS(require) 대신 ES 모듈(import/export) 문법 사용
- 가능한 경우 import를 구조 분해 (예: import { foo } from 'bar')
# 작업 흐름
- 코드 변경을 마친 후 반드시 타입 체크 실행
- 성능을 위해 전체 테스트 대신 단일 테스트 실행 권장
CLAUDE.md
파일은 다음과 같은 위치에 배치할 수 있다:
claude
를 실행하는 위치 (가장 일반적인 사용법). 파일명을 CLAUDE.md
로 지정하고 git에 커밋하여 팀과 공유하거나, CLAUDE.local.md
로 지정하고 .gitignore
에 추가할 수 있다.claude
를 실행하는 디렉토리의 상위 디렉토리. 모노레포에서 유용하며, 예를 들어 root/foo
에서 claude
를 실행할 때 root/CLAUDE.md
와 root/foo/CLAUDE.md
파일을 모두 자동으로 참조한다.claude
를 실행하는 디렉토리의 하위 디렉토리. 상위 디렉토리와 반대의 경우로, 하위 디렉토리의 파일을 작업할 때 CLAUDE.md
파일을 필요에 따라 참조한다.~/.claude/CLAUDE.md
), 모든 claude 세션에 적용된다./init
명령어를 실행하면 Claude가 자동으로 CLAUDE.md
파일을 생성한다.
CLAUDE.md
파일 튜닝하기CLAUDE.md
파일은 Claude의 프롬프트에 포함되므로, 자주 사용하는 프롬프트처럼 꾸준히 다듬어야 한다. 흔히 하는 실수는 효과를 검증하지 않고 지나치게 많은 내용을 추가하는 것이다. 시간을 들여 실험하면서 모델이 가장 잘 따르는 지침을 찾아내는 것이 중요하다.
CLAUDE.md
에 내용을 직접 추가하거나 #
키를 눌러 Claude에게 지시를 내릴 수 있다. 이 지시는 자동으로 관련 CLAUDE.md
에 반영된다. 많은 엔지니어들은 코딩 중에 커맨드, 파일, 스타일 가이드라인을 기록하기 위해 #
를 자주 사용하고, CLAUDE.md
변경 사항을 커밋에 포함시켜 팀원들도 함께 활용할 수 있게 한다.
Anthropic에서는 때때로 프롬프트 개선 도구를 통해 CLAUDE.md
파일을 검토하고, “IMPORTANT”나 “YOU MUST”와 같은 강조 표현을 추가해 지침의 준수도를 높인다.
기본적으로 Claude Code는 시스템을 수정할 가능성이 있는 모든 작업에 대해 권한 요청을 한다. 파일 쓰기, 다양한 bash 명령, MCP 도구 등이 이에 해당한다. Claude Code는 안전을 최우선으로 고려해 의도적으로 보수적인 접근 방식을 채택했다. 여러분은 안전하다고 판단되는 추가 도구를 허용하거나, 되돌리기 쉬운 잠재적으로 안전하지 않은 도구(예: 파일 편집, git commit
)를 허용하도록 허용 목록을 커스터마이즈할 수 있다.
허용 도구를 관리하는 방법은 네 가지가 있다:
/permissions
명령어를 사용해 허용 목록에 도구를 추가하거나 제거한다. 예를 들어, Edit
을 추가해 항상 파일 편집을 허용하거나, Bash(git commit:*)
를 추가해 git 커밋을 허용하거나, mcp__puppeteer__puppeteer_navigate
를 추가해 Puppeteer MCP 서버를 통해 네비게이션을 허용할 수 있다..claude/settings.json
또는 ~/.claude.json
파일을 직접 편집한다(팀과 공유하기 위해 전자를 소스 컨트롤에 체크인하는 것을 권장한다).--allowedTools
CLI 플래그를 사용한다.Claude는 gh
CLI를 활용해 GitHub과 상호작용할 수 있다. 이를 통해 이슈 생성, 풀 리퀘스트 오픈, 코멘트 읽기 등 다양한 작업을 수행할 수 있다. 만약 gh
가 설치되어 있지 않더라도, Claude는 GitHub API나 MCP 서버(설치된 경우)를 사용할 수 있다.
Claude는 여러분의 셸 환경에 접근할 수 있다. 이를 통해 여러분이 직접 사용하는 편의 스크립트와 함수를 Claude에게도 제공할 수 있다. 또한 Claude는 MCP와 REST API를 통해 더 복잡한 도구를 활용할 수 있다.
Claude Code는 bash 환경을 상속받아 모든 도구에 접근할 수 있다. Claude는 unix 도구나 gh
같은 일반적인 유틸리티를 알고 있지만, 커스텀 bash 도구에 대해서는 별도의 설명이 필요하다:
--help
옵션을 실행해 도구 문서를 확인하도록 지시한다.CLAUDE.md
파일에 문서화한다.Claude Code는 MCP 서버와 클라이언트 역할을 동시에 수행한다. 클라이언트로서, Claude Code는 여러 MCP 서버에 연결해 다양한 도구를 활용할 수 있다. 이 연결은 세 가지 방식으로 설정할 수 있다:
.mcp.json
파일 (코드베이스에서 작업하는 모든 사람이 사용 가능). 예를 들어, Puppeteer와 Sentry 서버를 .mcp.json
에 추가하면, 해당 저장소에서 작업하는 모든 엔지니어가 별도의 설정 없이 바로 사용할 수 있다.MCP를 사용할 때는 --mcp-debug
플래그와 함께 Claude를 실행해 구성 문제를 식별하는 것이 도움이 될 수 있다.
반복적인 작업(디버깅 루프, 로그 분석 등)을 위해 .claude/commands
폴더 내에 프롬프트 템플릿을 마크다운 파일로 저장한다. 이렇게 저장한 명령어는 /
를 입력했을 때 슬래시 명령어 메뉴에서 사용할 수 있다. 이 명령어들을 git에 커밋하면 팀원들과 공유할 수 있다.
커스텀 슬래시 명령어에는 $ARGUMENTS
라는 특수 키워드를 사용해 명령어 호출 시 파라미터를 전달할 수 있다.
예를 들어, GitHub 이슈를 자동으로 가져와 수정하는 슬래시 명령어는 다음과 같다:
GitHub 이슈를 분석하고 수정해 주세요: $ARGUMENTS.
다음 단계를 따르세요:
1. `gh issue view`를 사용해 이슈 상세 정보를 확인
2. 이슈에 설명된 문제를 이해
3. 코드베이스에서 관련 파일 검색
4. 이슈를 해결하기 위한 필요한 변경 사항 구현
5. 테스트 작성 및 실행으로 수정 사항 검증
6. 코드가 린팅과 타입 체크를 통과하는지 확인
7. 설명이 포함된 커밋 메시지 작성
8. 푸시하고 PR 생성
GitHub 관련 작업은 모두 GitHub CLI(`gh`)를 사용하세요.
위 내용을 .claude/commands/fix-github-issue.md
파일에 저장하면, Claude Code에서 /project:fix-github-issue
명령어로 사용할 수 있다. 예를 들어 /project:fix-github-issue 1234
를 입력하면 Claude가 #1234 이슈를 수정한다. 마찬가지로 개인 명령어는 ~/.claude/commands
폴더에 추가해 모든 세션에서 사용할 수 있다.
Claude Code는 특정 워크플로우를 강제하지 않으므로, 여러분이 원하는 방식으로 유연하게 사용할 수 있다. 이러한 유연성 덕분에, 우리 사용자 커뮤니티에서는 Claude Code를 효과적으로 활용하는 몇 가지 성공적인 패턴이 자연스럽게 형성되었다.
이 다용도 워크플로우는 다양한 문제에 적합하다:
1단계와 2단계는 매우 중요하다. 이 단계 없이 Claude는 바로 코딩을 시작하려는 경향이 있다. 때로는 이것이 원하는 결과일 수 있지만, Claude에게 먼저 조사하고 계획을 세우도록 요청하면 초기에 깊은 사고가 필요한 문제에서 성능이 크게 향상된다.
이 워크플로우는 단위 테스트, 통합 테스트, 또는 엔드투엔드 테스트로 쉽게 검증할 수 있는 변경 사항에 적합한 Anthropic의 선호 방식이다. 에이전트 기반 코딩과 결합하면 테스트 주도 개발(TDD)이 더욱 강력해진다:
Claude는 시각적 목업, 테스트 케이스, 또는 다른 종류의 출력과 같은 명확한 목표가 있을 때 가장 잘 작동한다. 테스트와 같은 예상 출력을 제공하면 Claude는 변경을 수행하고 결과를 평가하며 성공할 때까지 점진적으로 개선할 수 있다.
테스트 워크플로와 유사하게, Claude에게 시각적 목표를 제공할 수 있다:
인간과 마찬가지로, Claude의 출력물도 반복 작업을 통해 크게 개선된다. 첫 번째 버전이 괜찮을 수 있지만, 2-3번 반복 후에는 훨씬 더 나은 결과를 얻을 수 있다. 최상의 결과를 위해 Claude가 자신의 출력물을 확인할 수 있는 도구를 제공한다.
Claude를 감독하는 대신 claude --dangerously-skip-permissions
명령어를 사용해 모든 권한 검사를 우회하고 작업이 완료될 때까지 방해받지 않게 할 수 있다. 이 방법은 린트 오류 수정이나 보일러플레이트 코드 생성과 같은 워크플로우에 적합하다. 하지만 Claude에게 임의의 명령어를 실행하게 하는 것은 위험하며, 데이터 손실, 시스템 오류, 또는 데이터 유출(예: 프롬프트 삽입 공격)을 초래할 수 있다. 이러한 위험을 최소화하려면 인터넷 접근이 차단된 컨테이너 내에서 --dangerously-skip-permissions
를 사용한다. Docker Dev Containers를 사용한 참조 구현을 따라할 수 있다.
새로운 코드베이스에 적응할 때, 학습과 탐색을 위해 Claude Code를 활용한다. 프로젝트에서 페어 프로그래밍을 하면서 다른 엔지니어에게 물어보는 것과 같은 질문을 Claude에게 할 수 있다. Claude는 코드베이스를 능동적으로 탐색하여 다음과 같은 일반적인 질문에 답할 수 있다:
foo.rs
파일의 134번째 줄에 있는 async move { ... }
는 어떤 역할을 하는가?CustomerOnboardingFlowImpl
은 어떤 예외 상황을 처리하는가?bar()
대신 foo()
를 호출하는 이유는 무엇인가?baz.py
파일의 334번째 줄과 동일한 기능을 Java로 구현하려면 어떻게 해야 하는가?Anthropic에서는 이러한 방식으로 Claude Code를 사용하는 것이 핵심 온보딩 워크플로우가 되었다. 이는 적응 시간을 크게 단축시키고 다른 엔지니어들의 부담을 줄이는 데 기여했다. 특별한 프롬프트가 필요하지 않다! 단순히 질문을 하면, Claude가 코드를 탐색하여 답을 찾아준다.
Claude는 다양한 git 작업을 효율적으로 처리할 수 있다. Anthropic 엔지니어들의 90% 이상이 git 관련 상호작용에 Claude를 활용하고 있다:
Claude Code는 다양한 GitHub 작업을 관리할 수 있다:
이를 통해 gh
커맨드라인 구문을 외울 필요 없이 일상적인 작업을 자동화할 수 있다.
Anthropic의 연구원과 데이터 과학자들은 Claude Code를 사용해 Jupyter 노트북을 읽고 작성한다. Claude는 이미지를 포함한 출력을 해석할 수 있어 데이터를 빠르게 탐색하고 상호작용할 수 있는 방법을 제공한다. 특별히 필요한 프롬프트나 워크플로우는 없지만, VS Code에서 Claude Code와 .ipynb
파일을 나란히 열어 작업하는 것을 추천한다.
또한 동료에게 노트북을 보여주기 전에 Claude에게 정리하거나 미적으로 개선하도록 요청할 수 있다. 특히 노트북이나 데이터 시각화를 “미적으로 매력적”으로 만들라고 명시적으로 지시하면, 인간의 시각적 경험을 최적화하도록 상기시키는 데 도움이 된다.
아래 제안 사항은 모든 워크플로우에 적용된다:
Claude Code의 성공률은 첫 시도에서 더 구체적인 지침을 제공할 때 크게 향상된다. 처음부터 명확한 방향을 제시하면 나중에 수정할 필요가 줄어든다.
예를 들어:
부적절한 지침 | 적절한 지침 – | – foo.py에 테스트를 추가한다 | foo.py에 새로운 테스트 케이스를 작성한다. 사용자가 로그아웃된 상황과 같은 예외 사항을 다룬다. 모의 객체(mock)는 사용하지 않는다 ExecutionFactory의 API가 왜 이렇게 이상한가? | ExecutionFactory의 git 기록을 살펴보고 API가 어떻게 만들어졌는지 요약한다 캘린더 위젯을 추가한다 | 홈페이지에 구현된 기존 위젯을 살펴보고 패턴을 이해한다. 특히 코드와 인터페이스가 어떻게 분리되어 있는지 확인한다. HotDogWidget.php가 좋은 예제다. 그런 다음, 이 패턴을 따라 새로운 캘린더 위젯을 구현한다. 사용자가 월을 선택하고 앞뒤로 페이지를 넘기며 연도를 선택할 수 있도록 한다. 이미 코드베이스에서 사용 중인 라이브러리 외에는 새 라이브러리를 사용하지 않고 처음부터 구현한다
Claude는 의도를 추론할 수 있지만 마음을 읽지는 못한다. 명확한 지침은 기대치와의 일치를 더 잘 이끌어낸다.
Claude는 이미지와 다이어그램을 다루는 데 뛰어난 능력을 보인다. 이를 활용하는 주요 방법은 다음과 같다:
이 기능은 UI 개발을 위한 디자인 목업 참조나, 분석 및 디버깅을 위한 시각적 차트 작업에 특히 유용하다. 시각적 자료를 추가하지 않더라도, 결과물의 시각적 매력이 얼마나 중요한지 Claude에게 명확히 알려주는 것이 도움이 된다.
저장소 내 어디에 위치한 파일이나 폴더든지 탭 완성 기능을 활용해 빠르게 참조할 수 있다. 이를 통해 Claude가 적절한 리소스를 찾거나 업데이트하는 데 도움을 줄 수 있다.
Claude가 읽을 수 있도록 특정 URL을 프롬프트와 함께 붙여넣는다. 동일한 도메인(예: docs.foo.com)에 대해 반복적으로 권한 요청을 피하려면 /permissions
를 사용해 도메인을 허용 목록에 추가한다.
자동 수락 모드(shift+tab으로 전환)는 Claude가 자율적으로 작업할 수 있게 해주지만, 일반적으로 적극적으로 협력하고 Claude의 접근 방식을 안내하는 것이 더 나은 결과를 얻을 수 있다. 처음에 작업을 철저히 설명하는 것이 가장 좋은 결과를 얻는 방법이지만, 언제든지 Claude의 방향을 수정할 수도 있다.
다음 네 가지 도구가 방향 수정에 도움을 준다:
Claude Code가 가끔 첫 시도에서 문제를 완벽하게 해결하기도 하지만, 이러한 수정 도구를 사용하는 것이 일반적으로 더 빠르고 나은 솔루션을 제공한다.
/clear
명령으로 컨텍스트를 집중적으로 유지하기긴 대화를 나누는 동안 Claude의 컨텍스트 윈도우에는 관련 없는 대화 내용, 파일 내용, 명령어 등이 쌓일 수 있다. 이는 성능을 저하시키고 때로는 Claude의 집중력을 흐릴 수 있다. 작업 간에 /clear
명령을 자주 사용하여 컨텍스트 윈도우를 초기화하면 이러한 문제를 방지할 수 있다.
여러 단계로 구성되거나 철저한 해결책이 필요한 대규모 작업(예: 코드 마이그레이션, 수많은 린트 오류 수정, 복잡한 빌드 스크립트 실행 등)의 경우, Claude가 체크리스트와 작업용 스크래치패드로 Markdown 파일(또는 GitHub 이슈)을 사용하도록 하여 성능을 향상시킬 수 있다.
예를 들어, 대량의 린트 오류를 수정하려면 다음과 같이 진행한다:
클로드에 데이터를 전달하는 방법은 여러 가지가 있다:
cat foo.txt | claude
와 같은 방식. 로그, CSV 파일, 대용량 데이터 처리에 유용하다.대부분의 작업에서는 이러한 방법들을 조합해서 사용한다. 예를 들어, 로그 파일을 파이프로 전달한 후, 클로드에게 추가 컨텍스트를 가져오도록 도구를 사용하도록 지시해 로그를 디버깅할 수 있다.
Claude Code는 CI, pre-commit 훅, 빌드 스크립트, 자동화와 같은 비대화형 환경을 위한 헤드리스 모드를 제공한다. 헤드리스 모드를 활성화하려면 -p
플래그와 함께 프롬프트를 사용하고, 스트리밍 JSON 출력을 원할 경우 --output-format stream-json
옵션을 추가한다.
단, 헤드리스 모드는 세션 간에 지속되지 않는다. 각 세션마다 다시 활성화해야 한다.
헤드리스 모드는 GitHub 이벤트에 의해 트리거되는 자동화 작업을 실행할 수 있다. 예를 들어, 레포지토리에 새로운 이슈가 생성될 때 이를 처리할 수 있다. 공개된 Claude Code 레포지토리는 Claude를 사용해 새로운 이슈를 검토하고 적절한 라벨을 할당하는 방식을 보여준다.
Claude Code는 주관적인 코드 리뷰를 제공하여 전통적인 린팅 도구가 감지하지 못하는 문제를 식별할 수 있다. 예를 들어, 오타, 오래된 주석, 혼동을 줄 수 있는 함수나 변수명 등을 찾아낼 수 있다.
독립적으로 사용하는 것 외에도, 여러 클로드 인스턴스를 병렬로 실행하는 방식으로 더 강력한 활용이 가능하다:
간단하지만 효과적인 접근 방식은 한 Claude가 코드를 작성하는 동안 다른 Claude가 코드를 검토하거나 테스트하는 것이다. 여러 엔지니어와 협업하는 것과 유사하게, 때로는 별도의 컨텍스트를 유지하는 것이 도움이 된다:
/clear
명령을 실행하거나 다른 터미널에서 두 번째 Claude를 시작한다./clear
명령을 다시 실행해) 코드와 검토 피드백을 모두 읽도록 한다.테스트에도 비슷한 방법을 적용할 수 있다: 한 Claude가 테스트를 작성하고, 다른 Claude가 테스트를 통과하는 코드를 작성하도록 한다. 심지어 각 Claude 인스턴스가 서로 통신하도록 할 수도 있다. 별도의 작업 스크래치패드를 제공하고, 어느 것을 작성하고 어느 것을 읽을지 지시하면 된다.
이러한 분리는 단일 Claude가 모든 작업을 처리하는 것보다 더 나은 결과를 얻는 경우가 많다.
각 단계가 완료될 때까지 기다리지 않고, Anthropic의 많은 엔지니어들이 다음과 같은 방법을 사용한다:
이 방법을 사용하면 여러 작업을 동시에 진행할 수 있어 시간을 절약할 수 있다. 각 터미널 탭에서 독립적으로 작업을 수행할 수 있으므로, 작업 간 간섭 없이 효율적으로 관리할 수 있다.
이 방법은 여러 독립적인 작업을 수행할 때 특히 유용하며, 여러 체크아웃보다 가볍고 효율적인 대안을 제공한다. git worktrees를 사용하면 동일한 저장소에서 여러 브랜치를 별도의 디렉토리로 체크아웃할 수 있다. 각 worktree는 고유한 작업 디렉토리를 가지며 파일이 격리되어 있지만, 동일한 Git 히스토리와 reflog를 공유한다.
git worktrees를 사용하면 프로젝트의 다른 부분에서 여러 Claude 세션을 동시에 실행할 수 있다. 각 세션은 독립적인 작업에 집중할 수 있다. 예를 들어, 한 Claude는 인증 시스템을 리팩토링하는 동안 다른 Claude는 전혀 관련 없는 데이터 시각화 컴포넌트를 개발할 수 있다. 작업이 겹치지 않기 때문에 각 Claude는 다른 변경 사항을 기다리거나 병합 충돌을 처리할 필요 없이 최대 속도로 작업할 수 있다:
git worktree add ../project-feature-a feature-a
cd ../project-feature-a && claude
유용한 팁:
git worktree remove ../project-feature-a
claude -p
(헤드리스 모드)는 Claude Code를 프로그램적으로 더 큰 워크플로우에 통합하면서 내장 도구와 시스템 프롬프트를 활용한다. 헤드리스 모드를 사용하는 두 가지 주요 패턴이 있다:
확장 작업(Fanning out): 대규모 마이그레이션이나 분석 작업을 처리한다. 예를 들어, 수백 개의 로그 파일에서 감정 분석을 수행하거나 수천 개의 CSV 파일을 분석하는 작업이 여기에 해당한다.
claude -p "React에서 Vue로 foo.py 마이그레이션. 작업이 완료되면 성공 시 OK, 실패 시 FAIL 문자열을 반드시 반환해야 한다." --allowedTools Edit Bash(git commit:*)
파이프라이닝(Pipelining): Claude를 기존 데이터/처리 파이프라인에 통합한다.
claude -p "<your prompt>" --json | your_command
를 호출한다. 여기서 your_command
는 처리 파이프라인의 다음 단계이다.이 두 가지 사용 사례 모두에서, Claude 호출을 디버깅하기 위해 --verbose
플래그를 사용하는 것이 도움이 된다. 일반적으로 프로덕션 환경에서는 더 깔끔한 출력을 위해 verbose 모드를 끄는 것을 권장한다.
Claude Code 작업에 대한 여러분의 팁과 모범 사례는 무엇인가요? @AnthropicAI를 태그하여 여러분이 무엇을 만들고 있는지 공유해 보세요!
이 글은 Boris Cherny가 작성했다. 이 작업은 Claude Code 사용자 커뮤니티 전반에서 모은 모범 사례를 바탕으로 한다. 커뮤니티의 창의적인 접근 방식과 워크플로우는 우리에게 계속해서 영감을 준다. 또한 Daisy Hollman, Ashwin Bhat, Cat Wu, Sid Bidasaria, Cal Rueb, Nodir Turakulov, Barry Zhang, Drew Hodun을 비롯한 Anthropic 엔지니어들에게 특별한 감사를 표한다. 이들의 유용한 통찰과 Claude Code에 대한 실무 경험은 이 가이드라인을 만드는 데 큰 도움을 주었다.