본문 바로가기
C.W.K.
Stream
Lesson 08 of 13 · published

Hook — 예측 가능한 생명 주기 제어

~22 min · hooks, automation, pre-tool-use, post-tool-use

Level 0🌱 입문자
0 XP0/70 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

모델의 약속만으로 부족한 곳에는 Hook을 걸어

Hook은 Claude Code의 생명주기 사건에 맞춰 명령, HTTP 요청, 또는 판단용 지시를 실행해. 세션 시작, 사용자 입력, 도구 호출 전후, 권한 요청, 작업 종료 같은 지점에 꽂을 수 있어. 모델이 규칙을 기억해주길 기대하는 대신 반드시 일어나야 할 동작을 시스템으로 보장하는 장치야.

PreToolUse는 도구가 실행되기 전에 검사해서 exit code 2로 차단할 수 있어. 보호된 경로 쓰기나 위험한 명령을 막기에 알맞아. PostToolUse는 성공 뒤에 실행되므로 formatter, type-check, 영향받은 테스트를 자동으로 돌리기 좋아.

셸 명령은 stdin으로 JSON을 받고 exit code로 흐름을 제어해. HTTP Hook은 알림이나 감사 기록에, prompt hook은 단순 규칙으로 못 정하는 판단에 써. 비밀 파일을 절대 읽지 말라는 요구처럼 실패 비용이 큰 규칙은 문장보다 Hook이 믿을 만해.

직접 확인할 항목: PermissionRequest, SessionStart, Stop, UserPromptSubmit, command, http, prompt.

Code

모든 Edit·Write 뒤에 자동으로 포맷하기·json
// .claude/settings.json
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "description": "Format and type-check TypeScript on save",
        "hooks": [
          {
            "type": "command",
            "command": "bash -c 'F=$FILEPATH; if [[ $F == *.ts || $F == *.tsx ]]; then npx prettier --write \"$F\" && npx tsc --noEmit; fi'"
          }
        ]
      }
    ]
  }
}
보호된 경로에 쓰지 못하게 막기·bash
#!/bin/bash
# .claude/hooks/protect-files.sh
INPUT=$(cat)
FILE=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')

PROTECTED=(".env" ".env.production" "secrets/" ".pem" "id_rsa")

for p in "${PROTECTED[@]}"; do
  if [[ "$FILE" == *"$p"* ]]; then
    echo "Blocked: $FILE matches protected pattern '$p'" >&2
    exit 2
  fi
done
exit 0

# Wired in settings.json:
# "PreToolUse": [{"matcher":"Edit|Write","hooks":[{"type":"command",
#  "command":"bash .claude/hooks/protect-files.sh"}]}]

External links

Exercise

모든 Edit와 Write 뒤에 프로젝트 포매터를 실행하는 PostToolUse Hook을 추가해. 일부러 서식을 망가뜨린 편집을 시키고 파일이 자동으로 정리되는지 확인해 봐. 여유가 있다면 .env 쓰기를 막는 PreToolUse Hook도 추가해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.