Hooks
Hooks를 사용하면 Claude Code의 라이프사이클 중 특정 시점에 명령을 실행할 수 있습니다. 이 과정에서 다룬 다른 모든 것과 hooks의 핵심적인 차이점은 hooks가 **결정론적(deterministic)**이라는 점입니다 — 항상 실행됩니다.
한국어 대본
- 00:00훅을 사용하면 Claude Code의 수명 주기의 여러 시점에서 명령을 실행할 수 있습니다.
- 00:10훅과 지금까지 다룬 다른 모든 것의 핵심 차이는 훅이 결정적이라는 점입니다.
- 00:16훅은 항상 실행됩니다.
- 00:20그러니까 이렇게 말할 수 있습니다. Claude.md 파일에서 Claude에게 prettier를 실행하라고 지시할 수 있습니다. 즉, 후에
- 00:26모든 파일 편집, 그리고 대부분의 경우 그렇게 하겠지만 때로는 그렇지 않을 것입니다.
- 00:30완벽하지는 않지만 훅을 사용하면 예외 없이 매번 실행됩니다.
- 00:37일반적인 사용 사례로는 파일 편집 후 자동 서식 지정, 실행된 모든 명령 로깅,
- 00:43규정 준수를 위해 프로덕션 파일 수정과 같은 위험한 작업 차단 및
- 00:48자신에게 알림(Claude가 작업을 마칠 때)
- 00:52훅은 settings.json 파일에 구성됩니다.
- 00:56이벤트를 선택하고, 선택적으로 적용할 도구에 대한 매처를 설정하고, 실행할 명령을 제공합니다.
- 01:03사용자 프롬프트 제출은 Claude가 처리하기 전에 프롬프트를 제출하면 실행됩니다.
- 01:07도구 사용 전은 도구 호출 전에 실행됩니다.
- 01:10도구 사용 후는 도구 호출이 완료된 후에 실행됩니다.
- 01:14알림은 Claude가 알림을 보낼 때 실행됩니다.
- 01:16그리고 중지는 Claude가 응답을 마칠 때 실행됩니다.
- 01:19가장 일반적인 훅은 편집 후 자동 서식 지정입니다.
- 01:26도구 사용 후 훅을 edit 또는 multi-edit 매처로 설정하는 것이 맞습니까?
- 01:32그래서 Claude가 파일을 수정할 때마다 실행됩니다.
- 01:35명령은 파일 확장자를 확인하고 적절한 포맷터를 실행합니다.
- 01:40이것은 TypeScript용 prettier일 수 있습니다.
- 01:42Go에는 go format, Python에는 rough, 프로젝트가 사용하는 무엇이든.
- 01:49도구 사용 전 훅은 도구 호출이 실행되기 전에 차단할 수 있습니다.
- 01:52그래서 훅은 STDIN에서 JSON으로 도구 이름과 입력을 받습니다.
- 01:57코드 2로 종료하면 작업이 차단됩니다.
- 02:00그리고 STD 오류 메시지가 Claude의 피드백으로 전달됩니다.
- 02:04그래서 Claude는 차단된 이유를 알고 조정할 수 있습니다.
- 02:08종료 코드 0은 진행을 의미합니다.
- 02:10종료 코드 2는 차단을 의미합니다.
- 02:12이것이 강제 규칙을 적용하는 방법입니다.
- 02:14프로덕션 설정 디렉터리에 대한 쓰기를 차단하고,
- 02:16rm-rf를 포함하는 bash 명령어를 차단하고, main 브랜치로의 커밋을 차단하는 등 팀이 보장해야 하는 모든 것을 차단하세요.
- 02:23권장되지 않습니다.
- 02:26.clod/settings.json에 구성된 훅은 프로젝트 수준이며 저장소에 커밋할 수 있습니다.
- 02:32즉, 팀 전체가 동일한 훅을 자동으로 받게 됩니다.
- 02:35명령에서 Claude 프로젝트 디렉터리 환경 변수를 사용하여 프로젝트에 저장된 스크립트를 참조하세요.
- 02:41그래서 스크립트가 Claude의 현재 작업 디렉터리와 관계없이 작동합니다.
- 02:46훅을 사용하면 Claude Code의 동작을 결정적으로 제어할 수 있습니다.
- 02:55자동 서식 지정과 로깅에는 post-tool use를 사용하세요.
- 02:58위험한 작업을 차단하려면 pre-tool use를 사용하세요.
- 03:01슬래시 훅이나 settings.json에 구성하고 저장소에 커밋하여
- 03:06팀도 함께 받을 수 있습니다.
- 03:10반드시 매번 실행되어야 하는 작업이라면 프롬프트에 넣지 마세요.
- 03:14훅에 넣으세요.
Hooks를 사용하는 이유
CLAUDE.md에서 Claude에게 모든 파일 편집 후 Prettier를 실행하도록 지시할 수 있습니다. 대부분의 경우 실행될 것입니다. 하지만 때로는 실행되지 않을 수도 있습니다. Hook을 사용하면 예외 없이 매번 실행되도록 만들 수 있습니다.
일반적인 사용 사례는 다음과 같습니다:
- 파일 편집 후 자동 포맷팅
- 컴플라이언스를 위해 실행된 모든 명령 로깅
- 프로덕션 파일 수정과 같은 위험한 작업 차단
- Claude가 작업을 완료했을 때 자신에게 알림 전송
작동 방식
Hooks는 settings.json에서 구성됩니다. 이벤트를 선택하고, 선택적으로 어떤 도구에 적용할지 매처(matcher)를 설정한 다음, 실행할 명령을 제공합니다. 가장 일반적인 이벤트 중 일부는 다음과 같습니다:
- PreToolUse — 도구 호출 전에 실행됩니다
- PostToolUse — 도구 호출이 완료된 후 실행됩니다
- UserPromptSubmit — 프롬프트를 제출할 때, Claude가 처리하기 전에 실행됩니다
- Stop — Claude가 응답을 마쳤을 때 실행됩니다
- Notification — Claude가 알림을 보낼 때 실행됩니다
이는 연결할 수 있는 이벤트 중 일부일 뿐입니다 — Claude Code는 훨씬 더 많은 이벤트를 지원합니다. 전체 목록은 hooks 레퍼런스(opens in new tab)를 참조하세요.
Claude Code 내부의 /hooks 명령을 통해 구성하거나, settings.json을 직접 편집하여 구성할 수 있습니다.

실제 예시
가장 일반적인 hook: 편집 후 자동 포맷팅입니다. "Edit|MultiEdit|Write" 매처로 PostToolUse hook을 설정하면 Claude가 파일을 수정할 때마다 실행됩니다. 이 명령은 파일 확장자를 확인하고 적절한 포맷터를 실행합니다 — TypeScript의 경우 Prettier, Go의 경우 gofmt 등 프로젝트에서 사용하는 도구에 따라 달라집니다.
PreToolUse로 차단하기
PreToolUse hooks는 도구 호출이 실행되기 전에 도구 호출을 차단할 수 있습니다. Hook은 도구 이름과 입력을 stdin을 통해 JSON 형식으로 받습니다. 종료 코드(exit code)가 동작을 결정합니다:
- 종료 코드 0 — 정상적으로 진행합니다.
- 종료 코드 2 — 작업을 차단합니다. stderr 메시지는 Claude에게 피드백으로 전달되어 왜 차단되었는지 알고 조정할 수 있게 합니다.
- 그 외의 종료 코드 — 차단하지 않는 오류로, 사용자에게 표시되지만 아무것도 중단시키지 않습니다.
이것이 엄격한 규칙을 강제하는 방법입니다. 프로덕션 구성 디렉터리에 대한 쓰기를 차단하세요. rm -rf가 포함된 bash 명령을 차단하세요. main 브랜치로의 커밋을 차단하세요. 팀에서 제안이 아니라 보장되어야 하는 것이라면 무엇이든 해당됩니다.

팀과 Hooks 공유하기
.claude/settings.json에 구성된 hooks는 프로젝트 수준이며 저장소에 체크인할 수 있습니다. 이는 전체 팀이 자동으로 동일한 hooks를 갖게 된다는 의미입니다. 명령에서 CLAUDE_PROJECT_DIR 환경 변수를 사용하여 프로젝트에 저장된 스크립트를 참조하면, Claude의 현재 작업 디렉터리와 관계없이 작동합니다.
요약
Hooks는 Claude Code의 동작에 대한 결정론적 제어를 제공합니다. 자동 포맷팅과 로깅에는 PostToolUse를 사용하세요. 위험한 작업을 차단하려면 PreToolUse를 사용하세요. /hooks 또는 settings.json에서 구성하세요. 그리고 팀도 이를 사용할 수 있도록 저장소에 체크인하세요.
반드시 매번 실행되어야 하는 작업이 있다면, 프롬프트에 넣지 마세요. Hook에 넣으세요.