Claude Code의 hooks로 작업 자동화하기
요약
Claude의 hooks는 Claude의 판단을 거치지 않고 사용자가 지정한 타이밍에 셸 명령어를 실행하는 메커니즘입니다. 이는 단순 문맥(context) 제공 방식인 CLAUDE.md와 근본적으로 다릅니다. 파일 편집 시 Prettier를 자동으로 실행하는 예시를 통해, `PostToolUse` 같은 특정 이벤트를 활용하여 개발 워크플로우 자동화 방법을 안내합니다.
핵심 포인트
- hooks는 Claude의 판단 없이 정해진 타이밍에 명령을 실행함.
- CLAUDE.md는 문맥 제공용이며, hooks는 실제 동작(Action) 구현용임.
- 파일 편집 시 포맷팅 등 워크플로우 자동화에 유용함.
- 특정 이벤트(`PostToolUse`)를 활용하여 작동 타이밍을 설정할 수 있음.
이 글에서 알 수 있는 것
- hooks가 CLAUDE.md와는 다른 'Claude의 판단을 거치지 않고 실행되는' 메커니즘이라는 점
- 파일 편집 시 자동으로 정렬하는, 실제로 작동하는 설정 방법
- hooks가 작동하지 않는 상황과 적합하지 않은 용도
- 설정을 작성할 위치와 CLAUDE.md의 차이점
결론: hooks는 Claude의 판단을 거치지 않고 실행되는 메커니즘
CLAUDE.md는 Claude가 읽고 판단에 사용하는 '문맥(context)'입니다. '매번 정렬해 줘'라고 써도, 실제로 실행할지는 Claude의 판단에 맡겨집니다.
hooks는 사용자가 정한 타이밍에, Claude의 판단을 거치지 않고 셸 명령어를 실행하는 메커니즘입니다. 실행 여부를 Claude에게 맡기지 않으므로, 정해진 처리를 매번 돌릴 수 있습니다.
공식 문서에서도 '커밋 전'이나 '파일 편집 시'처럼 특정 타이밍에 실행하고 싶다면, CLAUDE.md가 아닌 hook으로 작성하라고 안내하고 있습니다.
실례: 파일을 편집할 때마다 자동으로 정렬하기
Claude가 파일을 편집할 때마다 Prettier(코드 포맷팅 도구)를 자동으로 실행하는 hook입니다.
작동 타이밍
Claude는 작업을 할 때, 파일 쓰기(Edit)
Write
또는 명령어를 실행하는 Bash와 같은 '도구'를 사용합니다. hook은 이러한 도구의 사용 전후에 동작할 수 있습니다(동작을 '발화한다(trigger)'라고 부릅니다).
이번에는, 도구 사용이 성공한 후에 발화하는 PostToolUse 이벤트를 사용합니다.
'발화하지 않는' 쪽의 동작은 공식 문서의 기술에 따릅니다(후술).
전제 조건
- JavaScript / TypeScript 프로젝트에 Prettier를 도입 완료 (
npm install --save-dev prettier) jq를 설치 완료 (macOS의 경우brew install jq)
Prettier가 미도입된 경우에도, npx가 로컬에 없는 패키지를 임시로 다운로드하여 실행할 수 있습니다. 다만 대기 시간이 발생할 수 있으므로 도입해 두는 것이 좋습니다. 다른 언어에서는 해당 언어의 포맷팅 도구로 대체합니다.
설정
프로젝트의 .claude/settings.json에 다음 내용을 추가합니다. 이미 다른 설정이 있는 경우, hooks 부분만 추가하면 됩니다.
{
명령어로 파일을 덮어쓸 때는 작동하지 않습니다. 이 점은 공식 문서에 명시되어 있습니다.
어떻게 덮어쓰여도 대응하고 싶을 때는, 파일의 변경 자체를 감지하는 `FileChanged`
이벤트를 사용하도록 공식에서 안내하고 있습니다. 본 기사에서는 다루지 않습니다.
## hooks가 필요 없는 경우와 금지에 사용할 때 주의할 점
### 알림만 목적일 때
Claude의 작업 완료 신호만 받는 것이라면, hooks는 불필요합니다. Ghostty・Kitty・iTerm2에서는 기본적으로 데스크톱 알림이 도착하며, 다른 터미널에서도 `~/.claude/settings.json`에 `preferredNotifChannel`을 `terminal_bell`로 설정하면 벨이 울립니다. 알림 소리나 명령어를 직접 정하고 싶을 때 hooks를 사용합니다.
### '만지게 하지 않기' 기능을 만들 때
공식 문서는 `PreToolUse` hook으로 조작을 차단할 수 있다고 설명합니다. 이 차단은 `--dangerously-skip-permissions`로 실행하더라도 유효합니다.
다만, 허점(抜け道)을 의식해야 합니다.
- **Bash는 별도 취급**: `Edit|Write`를 대상으로 하는 hook은 Bash에서의 덮어쓰기를 감지하지 못합니다. 모든 변경을 보고 싶다면, `Bash`도 대상으로 추가하는 방법이 공식적으로 소개되어 있습니다. - : hook에는 `if`로 필터링할 수 있으며, 베스트 에포트(best effort) `if`로 '이 명령어일 때만 작동'이라는 조건을 붙일 수 있습니다. 다만, 명령어 내용을 분석할 수 없는 경우에는 조건과 관계없이 hook이 작동합니다. 확실하게 허용/거부하고 싶을 때는 권한 설정(permissions)을 사용하도록 공식에서 안내하고 있습니다.
본 기사에서는 금지 기능을 만드는 방법은 다루지 않습니다.
## 설정은 어디에 적나요?
hooks를 어디에 작성하느냐에 따라 적용 범위가 달라집니다.
| 위치 | 적용 범위 | 팀과 공유 가능 여부 |
|---|---|---|
| `~/.claude/settings.json` | 자신의 모든 프로젝트 | 불가능 (자신의 PC만) |
| `.claude/settings.json` | 해당 프로젝트만 | 가능 (리포지토리에 커밋 가능) |
| `.claude/settings.local.json` | 해당 프로젝트만 | 불가능 (Claude Code가 저장한 설정은 gitignore됨) |
자동 정렬처럼 팀원들이 통일하고 싶은 규칙은 프로젝트 설정에 둡니다. 자신의 취향만을 위한 설정은 사용자 설정, 일시적인 테스트는 로컬 설정입니다.
## hooks와 CLAUDE.md의 차이점
| hooks | CLAUDE.md |
|---|---|
| 실행하는 것 | 셸 명령어 | Claude에 대한 지시(문맥) |
| ... |
## 요약
- hooks는 정해진 타이밍에, Claude의 판단을 거치지 않고 셸 명령어를 실행하는 메커니즘입니다.
- 설정 파일의 `hooks`에 추가하기만 하면 사용할 수 있습니다. `/hooks`에서 목록을 확인할 수 있습니다. - 자동 정렬과 같은 '매번 규칙적으로 수행하는 처리'에 능합니다. Bash를 경유한 덮어쓰기에는 효과가 없습니다.
- 알림은 표준 설정으로 충분할 때가 많습니다. 금지 기능에 사용할 때는 Bash를 경유한 허점에 주의해야 합니다.
이벤트 종류는 본 기사에서 소개된 것 외에도 수없이 많습니다. 자세한 내용은 참고 문헌의 리فرنس(reference)를 참조해 주십시오.
## 참고 문헌
- Automate actions with hooks — hooks의 기본, 설정 절차, 자동 정렬 예시
- Hooks reference — 모든 이벤트 사양, `if` 필드, `FileChanged` 상세 - How Claude remembers your project — '특정 타이밍에 실행하고 싶은 지시는 hook으로 작성한다'는 안내
- Configure your terminal for Claude Code — `preferredNotifChannel` 등 표준 알림 설정 - Configure permissions — 권한 설정(허용/거부 규칙) 공식 문서
- Prettier CLI — `--ignore-unknown` 설명
*본 기사 작성에는 AI 도구를 활용했습니다. 정보의 정확성에는 주의를 기울였으나, 최신 정보는 공식 문서를 함께 확인해 주십시오.*
### Discussion
AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기