TechFeedTechFeed
Claude Code 가이드

Claude Code 가이드 #12 — Hooks로 워크플로우 자동화

이벤트 기반 자동화 Hooks 완전 가이드. PreToolUse, PostToolUse, Notification 설정과 실전 lint·알림·가드 패턴.

Claude Code 가이드 #12 — 파일을 수정할 때마다 lint를 직접 실행하거나, 커밋 후 검증을 잊어서 에러를 뒤늦게 발견한 경험이 있나요? Hooks 시스템을 쓰면 이런 반복 작업을 Claude Code 이벤트에 연결해 자동화할 수 있습니다. 이 편에서는 Hooks의 종류, settings.json 설정법, 그리고 실전 자동화 패턴까지 완전 정리합니다.

※ 이 글은 2026년 3월 기준, Claude Code 공식 Hooks 문서 기반으로 작성됐습니다.

Hooks란 무엇인가?

Hooks는 Claude Code의 특정 이벤트가 발생할 때 자동으로 실행되는 셸 명령어입니다. settings.json에 정의하며, 이벤트 종류에 따라 실행 시점을 제어할 수 있습니다.

Hooks를 사용하면 다음과 같은 자동화가 가능합니다:

  • 파일 수정 후 자동 lint 실행
  • JS/Python 파일 저장 시 자동 구문 검사
  • 커밋 전 테스트 자동 실행
  • Notification 이벤트 시 슬랙/터미널 알림 전송

Hooks는 Claude Code가 도구를 사용하는 흐름의 전(Pre) 또는 후(Post)에 끼어들거나, 세션 상태 변화 이벤트에 반응할 수 있습니다.

Hooks 이벤트 흐름 — PreToolUse, PostToolUse, Notification 개요
Claude Code 가이드 #12 — Hooks로 워크플로우 자동화 — 이벤트 발생 시점과 Hook 실행 흐름 (출처: 공식 문서 기반)

Hook 종류 완전 정리

Claude Code에서 사용할 수 있는 Hook 이벤트 타입입니다:

이벤트발생 시점용도
PreToolUse도구 실행 직전실행 차단, 사전 검증
PostToolUse도구 실행 완료 후lint, 테스트, 알림
NotificationClaude가 알림을 보낼 때외부 알림 연동
StopClaude가 응답을 완료했을 때완료 후 정리 작업
SubagentStop서브에이전트가 완료됐을 때서브에이전트 결과 처리
TeammateIdle팀원 에이전트가 대기 상태일 때Agent Teams 상태 모니터링

각 이벤트에는 matcher를 지정해 특정 도구 또는 파일에만 반응하도록 좁힐 수 있습니다.

Hooks란 무엇인가? — CLI 실행 화면과 출력 결과
Claude Code 가이드 #12 — Hooks로 워크플로우 자동화 — CLI 실행 화면과 출력 결과 (출처: 공식 문서 및 벤치마크 데이터 기반)

settings.json에 Hooks 설정하기

Hooks는 .claude/settings.json(프로젝트) 또는 ~/.claude/settings.json(글로벌)에 정의합니다.

settings.json — 기본 Hook 설정 구조
// .claude/settings.json { "hooks": { "PostToolUse": [ { "matcher": "Write|Edit", "hooks": [ { "type": "command", "command": "echo '파일이 수정됐습니다: ' $CLAUDE_TOOL_OUTPUT" } ] } ] } }

Hook 설정 필드 설명:

필드타입설명
matcherstring (regex)반응할 도구 이름 (정규식 지원)
typeenum현재 command 만 지원
commandstring실행할 셸 명령어
timeoutnumber (ms)명령 타임아웃 (기본: 60000)
⚠️ 막히는 케이스: Hook 명령이 실행되지 않는 경우 — settings.json 구문 오류일 가능성이 높습니다. JSON은 trailing comma를 허용하지 않습니다. node -e "require('./.claude/settings.json')" 명령으로 JSON 파싱 오류를 확인하세요. 또는 hooks 키가 최상위 객체의 바로 아래에 있는지 구조를 점검하세요.

실전 Hook 예시 1 — 자동 Lint & 구문 검사

가장 실용적인 패턴입니다. JS/TS 파일이 수정될 때마다 자동으로 ESLint와 구문 검사를 실행합니다.

PostToolUse — JS/TS 파일 자동 lint (스크립트 방식 권장)
// .claude/settings.json // 복잡한 인라인 명령보다 bash 스크립트로 분리하는 방식을 권장합니다 { "hooks": { "PostToolUse": [ { "matcher": "Write|Edit", "hooks": [ { "type": "command", "command": "bash scripts/hook-lint.sh", "timeout": 15000 } ] } ] } }

더 간단한 방법은 별도 셸 스크립트로 분리하는 것입니다:

scripts/hook-lint.sh — 별도 스크립트로 분리
#!/bin/bash # scripts/hook-lint.sh # PostToolUse Write|Edit 이벤트에서 호출됨 # CLAUDE_TOOL_INPUT 환경변수에서 파일 경로 추출 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('') ") if [[ -z "$FILE" ]]; then exit 0 fi # JS/TS 파일만 검사 if [[ "$FILE" == *.js || "$FILE" == *.ts || "$FILE" == *.tsx ]]; then node --check "$FILE" if [ $? -ne 0 ]; then echo "SYNTAX ERROR: $FILE" >&2 exit 1 fi echo "OK: $FILE" fi
settings.json — 스크립트 방식 Hook 등록
// .claude/settings.json { "hooks": { "PostToolUse": [ { "matcher": "Write|Edit", "hooks": [ { "type": "command", "command": "bash scripts/hook-lint.sh", "timeout": 15000 } ] } ] } }
PostToolUse Hook으로 파일 저장 시 자동 lint 실행 화면
Claude Code 가이드 #12 — Hooks로 워크플로우 자동화 — PostToolUse Hook으로 파일 수정 후 자동 구문 검사 실행 흐름 (출처: 공식 문서 기반)
⚠️ 막히는 케이스: Hook 스크립트가 파일 경로를 못 읽는 경우 — CLAUDE_TOOL_INPUT 환경변수는 JSON 문자열입니다. 도구 종류(Write, Edit, Bash 등)에 따라 JSON 구조가 다릅니다. Write 도구는 path 키를, Edit 도구는 file_path 키를 사용합니다. 스크립트에서 두 키를 모두 fallback으로 처리해야 합니다.

실전 Hook 예시 2 — 알림 자동화

Claude가 작업을 완료하거나 입력을 기다릴 때 터미널 소리나 슬랙 알림을 보낼 수 있습니다.

Notification Hook — 터미널 벨 소리 + macOS 알림
// .claude/settings.json { "hooks": { "Notification": [ { "hooks": [ { "type": "command", "command": "osascript -e 'display notification \"Claude Code가 응답을 기다립니다\" with title \"Claude Code\"\''" } ] } ], "Stop": [ { "hooks": [ { "type": "command", "command": "printf '\\a'" } ] } ] } }

슬랙 웹훅을 연동하는 예시입니다:

Stop Hook — 슬랙 웹훅 알림
#!/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
settings.json — PreToolUse 가드 Hook 등록
// .claude/settings.json { "hooks": { "PreToolUse": [ { "matcher": "Write|Edit", "hooks": [ { "type": "command", "command": "bash scripts/hook-guard.sh", "timeout": 5000 } ] } ] } }
PreToolUse Hook으로 파일 수정 차단 — 보안 가드 패턴
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에서 타임아웃이 나면 도구 실행이 차단될 수 있습니다.

요약 및 관련 편

정리하면:

  • Hooks는 Claude Code 이벤트에 반응하는 셸 명령 자동화입니다
  • PreToolUse: 도구 실행 전 (exit 2로 차단 가능)
  • PostToolUse: 도구 실행 후 (lint, 테스트, 알림)
  • Notification / Stop: 세션 상태 변화 이벤트
  • Hook 스크립트는 scripts/ 폴더로 분리해 관리하면 유지보수가 쉽습니다
  • 환경변수 CLAUDE_TOOL_INPUT, CLAUDE_TOOL_OUTPUT으로 도구 입출력에 접근합니다

관련 가이드:

참고: Hooks 공식 문서 | Settings 문서 | Claude Code GitHub

claude-code클로드 코드hooks자동화lint워크플로우

관련 도구

관련 포스트

Claude Code 가이드 #11 — Skills 완벽 가이드2026-03-23Claude Code 가이드 #2 — CLAUDE.md 완벽 가이드2026-01-20Claude Code 가이드 #8 — 실전 바이브코딩 워크플로우2026-01-30Claude Code 가이드 #15 — Code Review 자동화2026-03-23