이벤트 기반 자동화 Hooks 완전 가이드. PreToolUse, PostToolUse, Notification 설정과 실전 lint·알림·가드 패턴.
Claude Code 가이드 #12 — 파일을 수정할 때마다 lint를 직접 실행하거나, 커밋 후 검증을 잊어서 에러를 뒤늦게 발견한 경험이 있나요? Hooks 시스템을 쓰면 이런 반복 작업을 Claude Code 이벤트에 연결해 자동화할 수 있습니다. 이 편에서는 Hooks의 종류, settings.json 설정법, 그리고 실전 자동화 패턴까지 완전 정리합니다.
⚠️ 막히는 케이스: Hook 명령이 실행되지 않는 경우 — settings.json 구문 오류일 가능성이 높습니다. JSON은 trailing comma를 허용하지 않습니다. node -e "require('./.claude/settings.json')" 명령으로 JSON 파싱 오류를 확인하세요. 또는 hooks 키가 최상위 객체의 바로 아래에 있는지 구조를 점검하세요.
실전 Hook 예시 1 — 자동 Lint & 구문 검사
가장 실용적인 패턴입니다. JS/TS 파일이 수정될 때마다 자동으로 ESLint와 구문 검사를 실행합니다.
Claude Code 가이드 #12 — Hooks로 워크플로우 자동화 — PostToolUse Hook으로 파일 수정 후 자동 구문 검사 실행 흐름 (출처: 공식 문서 기반)
⚠️ 막히는 케이스: Hook 스크립트가 파일 경로를 못 읽는 경우 — CLAUDE_TOOL_INPUT 환경변수는 JSON 문자열입니다. 도구 종류(Write, Edit, Bash 등)에 따라 JSON 구조가 다릅니다. Write 도구는 path 키를, Edit 도구는 file_path 키를 사용합니다. 스크립트에서 두 키를 모두 fallback으로 처리해야 합니다.
실전 Hook 예시 2 — 알림 자동화
Claude가 작업을 완료하거나 입력을 기다릴 때 터미널 소리나 슬랙 알림을 보낼 수 있습니다.
#!/bin/bash
# scripts/hook-notify-slack.sh
# Stop 이벤트 시 슬랙으로 완료 알림
SLACK_WEBHOOK_URL="https://hooks.slack.com/services/YOUR/WEBHOOK/URL"
curl -s -X POST "$SLACK_WEBHOOK_URL" \
-H 'Content-type: application/json' \
--data '{
"text": "Claude Code 작업이 완료됐습니다.",
"username": "Claude Code",
"icon_emoji": ":robot_face:"
}' > /dev/null
💡 팁:Stop Hook은 Claude가 응답을 완전히 완료했을 때만 실행됩니다. 긴 작업(파일 대량 생성, 코드 리팩토링 등)을 백그라운드에서 실행할 때 완료 알림을 받으면, 다른 작업을 하다가 돌아올 수 있어서 생산성이 높아집니다.
실전 Hook 예시 3 — PreToolUse로 실행 차단
PreToolUse Hook은 도구 실행 전에 실행됩니다. Hook 명령이 exit code 2를 반환하면 해당 도구 실행이 차단됩니다.
이를 이용해 특정 파일이나 명령어를 보호할 수 있습니다.
PreToolUse — 프로덕션 파일 수정 차단
#!/bin/bash
# scripts/hook-guard.sh
# PreToolUse Write|Edit 이벤트에서 호출됨
# 특정 파일(settings.json, .env 등)을 실수로 수정하는 것을 차단
FILE=$(echo "$CLAUDE_TOOL_INPUT" | python3 -c "
import sys, json
try:
d = json.load(sys.stdin)
print(d.get('path') or d.get('file_path') or '')
except:
print('')
")
# 보호할 파일 목록
PROTECTED_FILES=(
".env"
".env.production"
"vercel.json"
)
for protected in "${PROTECTED_FILES[@]}"; do
if [[ "$FILE" == *"$protected"* ]]; then
echo "BLOCKED: $FILE 는 보호된 파일입니다. 직접 수정이 필요하면 수동으로 편집하세요." >&2
exit 2 # exit 2 = 도구 실행 차단
fi
done
exit 0
Claude Code 가이드 #12 — Hooks로 워크플로우 자동화 — PreToolUse Hook exit code 2로 도구 실행 차단 패턴 (출처: 공식 문서 기반)
⚠️ 막히는 케이스:PreToolUse Hook에서 exit 2를 반환했는데 도구가 여전히 실행되는 경우 — exit code 2는 PreToolUse Hook에서만 차단 신호로 해석됩니다. PostToolUse Hook에서 exit 2를 반환해도 도구는 이미 실행된 이후이므로 차단이 되지 않습니다. 실행 전 차단은 반드시 PreToolUse에서만 가능합니다.
Hook에서 사용 가능한 환경변수
Hook 명령어 실행 시 Claude Code가 자동으로 설정하는 환경변수 목록입니다:
변수명
내용
사용 가능 이벤트
CLAUDE_TOOL_NAME
실행된 도구 이름 (Write, Edit, Bash 등)
Pre/PostToolUse
CLAUDE_TOOL_INPUT
도구 입력값 (JSON 문자열)
Pre/PostToolUse
CLAUDE_TOOL_OUTPUT
도구 실행 결과 (JSON 문자열)
PostToolUse
CLAUDE_NOTIFICATION
알림 메시지 내용
Notification
CLAUDE_PROJECT_DIR
현재 프로젝트 루트 경로
모든 이벤트
⚠️ 막히는 케이스: Hook 스크립트 실행 시간이 너무 길어서 Claude Code가 멈추는 경우 — Hook의 기본 타임아웃은 60,000ms(60초)입니다. lint나 테스트처럼 빠른 명령은 timeout: 15000 (15초)으로 낮춰서 설정하세요. 타임아웃이 초과하면 Hook이 실패로 처리되고, PreToolUse에서 타임아웃이 나면 도구 실행이 차단될 수 있습니다.