AI를 사용하다 보면 가끔 '시키지도 않은 작업을 하거나 분명히 이렇게 하라고 했는데 지키지 않는 경우'를 경험해 보셨을 겁니다.

AI는 사용자가 입력한 프롬프트를 잘 따르는 편이지만, 늘 그런 것은 아닙니다.

훅(hook)은 이 문제를 다른 방식으로 풉니다. 지시해 두고 지켜지길 바라는 대신, 정해진 순간이 오면 기계적으로 실행되는 규칙으로 바꿉니다.

프롬프트는 왜 안 지켜지나

AI는 확률로 움직입니다. 프롬프트에 '이건 하지 마', '끝나면 정리해'라고 적어 둬도 매번 똑같이 한다는 보장이 없습니다. 평소엔 잘 지키다가도, 작업이 길고 복잡해지면 잊거나, 다르게 알아듣거나, 슬쩍 건너뜁니다.

훅은 그 판단을 아예 AI에게 맡기지 않습니다. 공식 문서의 정의는 이렇습니다.

They provide deterministic control over Claude Code's behavior, ensuring certain actions always happen rather than relying on the LLM to choose to run them.

(Claude Code의 동작을 정해진 대로 확실하게 통제합니다. AI가 어떤 행동을 하기로 선택해 주길 기대하는 대신, 그 행동이 언제나 일어나도록 보장합니다.)

차이는 마지막 한 단어, always에 있습니다. 프롬프트로 넣은 규칙은 AI가 지킬지 말지를 그때그때 새로 판단합니다. 훅으로 건 규칙에는 그 판단 단계가 없습니다. 정해진 순간이 오면 그냥 실행됩니다.

훅은 어떻게 작동하나

훅은 아무 때나 끼어들지 않습니다. AI가 일하는 과정에는 정해진 길목이 있고, 훅은 그중 한 곳을 골라 그 지점을 지날 때마다 미리 정해둔 명령을 자동으로 실행합니다.

제목에 '조건반사'라고 적은 게 이런 뜻입니다. AI가 그때그때 '이걸 할까 말까' 따지는 게 아니라, 정해둔 시점에 명령이 실행됩니다. 판단이 끼어들 틈이 없으니 빠뜨릴 일도 없습니다.

훅은 언제 걸리나

훅을 걸 수 있는 지점은 미리 정해져 있습니다. 터미널에 /hooks를 치면 그 목록이 전부 나옵니다. 세션을 여는 순간부터 닫는 순간까지 서른 개쯤 됩니다. 여기서 새로 걸 수는 없고, 지금 무엇이 걸려 있는지 확인하는 화면입니다.

일하는 순서대로 주요한 것만 보면 이렇습니다.

나머지는 하위 작업이나 작업 폴더 변경처럼 더 세세한 순간들입니다. 익숙해진 다음에 목록에서 찾아도 됩니다.

처음에는 이 중 세 개면 충분합니다.

도구를 쓰기 직전. AI가 명령을 실행하거나 파일을 고치기 바로 전입니다. 뒤에서 다시 다루겠지만, 하려는 일을 실제로 막을 수 있는 건 이 순간뿐입니다.

도구를 쓴 직후. 파일은 이미 바뀐 뒤라 되돌리지는 못합니다. 대신 뒤처리를 자동으로 붙일 수 있습니다. AI가 코드를 고칠 때마다 줄 맞춤을 정리하게 해두는 식입니다.

AI가 내 입력을 기다릴 때. 오래 걸리는 작업을 맡겨 두고 다른 일을 하다가, 끝나면 알림이 오게 할 수 있습니다. 터미널을 계속 들여다볼 필요가 없습니다.

정말 막아주는 건 '직전'입니다

셋 중 무게가 실리는 건 첫 번째, 직전입니다. 나머지 둘은 이미 벌어진 일에 반응하거나 알릴 뿐이지만, 직전의 훅은 벌어지려는 행동을 아예 없던 일로 되돌릴 수 있으니까요.

그 순간 돌아가는 명령이 '안 돼'라는 신호를 하나 내보내면, AI가 하려던 행동은 그대로 취소됩니다. 그리고 왜 막혔는지가 AI에게 함께 전해져서, AI는 곧 다른 길을 찾습니다.

맨 앞의 상황으로 돌아가 보겠습니다. 예를 들어 코딩할 때 'main에 푸시하지 마'를 훅으로 걸어 두면, AI가 git push를 하려는 바로 그 순간 훅이 명령을 들여다봅니다. 목적지가 main이면 곧바로 취소됩니다.

게다가 이 차단은 권한을 아무리 열어 놔도 뚫리지 않습니다. AI에게 '이제 일일이 안 물어봐도 되니 알아서 해'라며 감독을 최대로 풀어둔 상태에서도, 훅이 그어 둔 선은 지켜집니다. 편하자고 고삐를 늦춰도, 내가 정한 규칙만은 살아 있습니다.

훅은 결국 명령입니다

정해진 순간에 터미널에서 돌아가는 명령 한 줄, 그게 훅의 전부입니다. 그래서 훅을 만들려면 설정 파일을 열고 그 명령을 적어 넣어야 합니다.

'그럼 내가 직접 설정 파일을 열어서 명령을 적어야 하나?' 싶을 텐데, 그렇진 않습니다. 그 설정을 Claude Code에게 프롬프트로 만들게 하면 됩니다. 다음 글에서는 내가 원하는 훅을 Claude Code에게 직접 만들게 하는 방법을 알아보겠습니다.

참고한 문서