Claude Code에서 파일 수정이나 명령 실행 같은 이벤트가 일어날 때 자동으로 실행되는 셸 명령이다. 모델이 읽고 해석하는 지침이 아니라 Claude Code가 직접 돌리는 스크립트라서, 포맷팅·검사·위험한 명령 차단처럼 매번 반드시 해야 하는 일을 걸어 둘 때 쓴다.
| 방법 | 동작 방식 | 이럴 때 쓴다 |
|---|---|---|
| CLAUDE.md 지침 | 모델이 읽고 따르려 함 | 코딩 스타일 같은 권장 사항 |
| 권한 설정 | 도구 사용을 허용하거나 거부 | 특정 명령을 통째로 막을 때 |
| 훅 | 이벤트마다 스크립트를 실행 | 포맷팅·검사·조건부 차단처럼 매번 할 일 |
CLAUDE.md에 "수정 후 prettier 돌려줘"라고 적으면 모델이 잊을 수도 있다. 훅으로 걸어 두면 파일이 수정될 때마다 prettier가 무조건 돌아간다. 하네스 엔지니어링 관점에서 훅은 에이전트의 행동을 감싸는 가드레일이다.
모든 프로젝트에 쓸 훅은 ~/.claude/settings.json에, 팀과 공유할 훅은 프로젝트의 .claude/settings.json에 넣는다. 이벤트 이름, 어떤 도구에 반응할지 정하는 matcher(예: Edit|Write), 실행할 명령을 적는다. 등록된 훅은 Claude Code 안에서 /hooks로 확인할 수 있다.
| 이벤트 | 실행 시점 | 쓰는 예 |
|---|---|---|
PreToolUse | 도구 실행 전 | 위험한 명령 차단 |
PostToolUse | 도구 실행 후 | 포맷터, 린트 실행 |
UserPromptSubmit | 프롬프트를 보낼 때 | 맥락 추가, 입력 검사 |
Stop | 응답이 끝날 때 | 테스트 실행, 완료 알림 |
훅은 어떤 도구가 어떤 입력으로 불렸는지를 JSON으로 표준입력에서 받는다. 스크립트가 0으로 끝나면 그대로 진행하고, 2로 끝나면 해당 동작을 막고 표준에러에 쓴 메시지를 Claude에게 돌려준다. 그래서 PreToolUse 훅에서 rm -rf나 DROP TABLE이 든 명령을 걸러 내면, Claude가 차단 이유를 보고 다른 방법을 찾는다.
여러 에이전트가 동시에 코드를 건드릴 때도 훅이 매번 린트와 타입 체크를 돌려 코드 스타일이 깨지지 않게 지켜 준다.
훅은 사용자 계정 권한으로 실행되므로 내용을 확인하지 않은 스크립트는 등록하지 않는다. 프로젝트 설정에 넣은 훅은 저장소를 받은 모든 사람에게 적용된다는 점도 기억한다. 도구를 부를 때마다 도는 훅이 느리면 작업 전체가 느려지니, 무거운 테스트는 PostToolUse보다 Stop에 거는 편이 낫다.
가장 흔한 건 파일을 고칠 때마다 포맷터와 린트를 돌리는 PostToolUse 훅이다. 여기에 위험한 명령을 막는 PreToolUse 훅과, 작업이 끝날 때 알림을 띄우거나 테스트를 돌리는 Stop 훅을 함께 거는 경우가 많다.
| 어디서 | 어떻게 쓰나 |
|---|---|
| 팀 저장소 | 프로젝트 .claude/settings.json에 포맷터·린트 훅을 넣어 누가 Claude Code를 써도 같은 스타일로 맞춘다 |
| 서버·DB를 다루는 작업 | PreToolUse 훅으로 삭제·초기화 명령을 걸러 내고, 막힌 이유를 Claude에게 알려 준다 |
| 오래 걸리는 에이전트 작업 | Stop 훅으로 끝날 때 테스트를 돌리거나 데스크톱 알림을 띄워, 다른 일을 하다 돌아온다 |
| 개인 작업 환경 | ~/.claude/settings.json에 UserPromptSubmit 훅을 걸어 현재 브랜치 같은 맥락을 매번 덧붙인다 |