Claude Code 작업 완료 시 알림음이 울리게 만들었습니다 (그리고 제 워크플로우가 바뀌었습니다)
요약
Claude Code의 Stop 훅을 활용하여 작업 완료 시 알림음이 울리도록 설정하는 방법을 소개합니다. 이를 통해 사용자가 터미널을 계속 주시하지 않아도 즉각적인 피드백을 받을 수 있어 워크플로우 효율을 극대화할 수 있습니다.
핵심 포인트
- Claude Code의 Stop 훅을 사용하여 작업 완료 알림 구현 가능
- settings.json 설정을 통해 간단하게 사운드 재생 자동화
- 피드백 루프 단축을 통해 작업 처리 시간 및 병목 현상 개선
- macOS, Linux, Windows 등 운영체제별 사운드 재생 명령어 활용
이 기사는 원래 Jo4 Blog에 게시되었습니다.
Claude Code에게 모듈 리팩토링 (refactor)을 요청하고, "잠시만"이라며 Twitter로 전환했다가 12분 뒤에 돌아왔을 때, 지난 11분 동안 Claude가 당신의 입력을 기다리며 가만히 앉아 있는 것을 본 적이 있는 그 기분, 아시나요?
네. 그게 바로 제 금요일 저녁이었습니다.
"거기 아직 있니?" 문제
저는 jo4.io를 구축하면서 Claude Code를 데일리 드라이버 (daily driver)로 사용해 왔습니다. Claude Code는 여러 파일에 걸친 리팩토링 (refactor), 테스트 실행, 버그 수정 등을 처리하는 데 매우 탁월합니다. 하지만 문제는 이겁니다. Claude가 작업을 마치거나 질문이 생겼을 때, 그냥... 가만히 있다는 것입니다. 조용히 말이죠. 마치 업무를 마쳤지만 당신의 YouTube 탐닉을 방해하고 싶지 않아 하는 예의 바른 인턴처럼 말입니다.
Claude가 제 어깨를 톡톡 두드려 줄 방법이 필요했습니다. 제가 터미널을 강박적으로 지켜보지 않아도 "저 다 했어요" 또는 "저기, 도움이 필요해요"라고 말해줄 무언가가 말이죠.
해결책: 5줄의 JSON
Claude Code에는 훅 (hook) 시스템이 있습니다. 저는 이미 위험한 git 명령어를 차단하기 위한 PreToolUse 훅 (PreToolUse hooks)에 대해 글을 쓴 적이 있습니다. 알고 보니 Claude가 응답을 마치고 제어권을 사용자에게 다시 넘길 때마다 실행되는 Stop 훅이 있었습니다.
제가 ~/.claude/settings.json에 추가한 설정 전체는 다음과 같습니다:
{
"hooks": {
"Stop": [
...
이게 전부입니다. 이게 끝이에요.
이제 일어나는 일
이제 Claude Code가 다음과 같은 상황일 때마다:
- 작업을 마치고 다음 지시를 기다릴 때
- 제 입력이 필요한 상황에 맞닥뜨렸을 때
- 긴 테스트 스위트 (test suite) 실행을 완료했을 때
- 명확한 확인을 위해 질문을 던질 때
...제 Mac에서 Funk 사운드가 재생됩니다. 아시죠, macOS가 아주 오래전부터 탑재해 온 그 만족스러운 작은 bonk 소리 말입니다.
이것이 게임 체인저인 이유
이전의 제 워크플로우 (workflow)는 다음과 같았습니다:
1. Claude에게 작업 부여
2. 브라우저로 전환
3. Claude를 잊어버림
...
이제는 이렇습니다:
1. Claude에게 작업 부여
2. 브라우저로 전환 / 커피를 가져오거나 스트레칭하기
3. *bonk*
...
저의 피드백 루프 (feedback loop)는 "생각날 때마다 확인하기"에서 즉각적인 상태로 변했습니다. 이것이 평균 작업 처리 시간을 절반으로 줄였다는 말은 과장이 아닙니다. Claude가 빨라진 것이 아니라, 저라는 병목 현상 (bottleneck)이 사라졌기 때문입니다.
사운드 선택하기
macOS에는 다양한 시스템 사운드가 기본적으로 포함되어 있습니다. 다른 소리를 원하시나요? 다음을 시도해 보세요:
# 사용 가능한 모든 시스템 사운드 목록 표시
ls /System/Library/Sounds/
...
Linux에서는 paplay, aplay를 사용할 수 있으며, Claude가 말 그대로 작업이 끝났다고 말해주길 원한다면 espeak "done"을 사용할 수도 있습니다. Windows WSL에서는 powershell.exe -c "(New-Object Media.SoundPlayer 'C:\Windows\Media\notify.wav').PlaySync()"가 작동합니다.
심화: 조건부 사운드
상황에 따라 다른 소리를 듣고 싶으신가요? Stop 훅 (hook)은 표준 입력 (stdin)을 통해 last_assistant_message 필드가 포함된 JSON을 전달받습니다. 이를 파싱하여 테스트가 통과하면 성공 사운드를, 무언가 깨지면 에러 사운드를 재생하도록 설정할 수 있습니다:
#!/bin/bash
input=$(cat)
message=$(echo "$input" | jq -r '.last_assistant_message // empty')
...
이 내용을 ~/.claude/stop-sound.sh로 저장하고 실행 권한을 부여한 뒤, 훅 (hook)이 이 파일을 가리키도록 설정하세요.
전체 모습
앞서 설정한 PreToolUse 훅 (hooks)과 결합하면, 저의 ~/.claude/settings.json은 다음과 같은 모습이 됩니다:
{
"hooks": {
"Stop": [
...
PreToolUse 훅 (hooks)은 Claude를 안전하게 유지합니다. Stop 훅 (hooks)은 저를 루프 (loop) 안에 머물게 합니다. 이 둘이 함께 작동하면서 Claude Code는 단순한 도구가 아니라, 언제 기다려야 하고 언제 재촉해야 하는지를 아는 팀원처럼 느껴지게 합니다.
이것들이 바로 너드 (nerdy) 엔지니어로서의 하루를 만들어주는 작은 요소들입니다. 다섯 줄 정도의 설정 변경, 수천 번은 들어봤을 법한 시스템 사운드 하나로, 갑자기 AI 보조 워크플로우 (workflow) 전체가 딱 맞아떨어지는 느낌을 받게 됩니다. 이는 혁신적인 기능도 아니고, Hacker News 메인 페이지를 장식할 만한 것도 아닙니다. 하지만 매일 수십 분의 컨텍스트 스위칭 (context-switch) 시간을 아껴줄 것이며, 왜 진작 설정하지 않았는지 의아해하게 될 것입니다.
아직 Stop hooks를 설정하셨나요? 어떤 소리를 선택하셨나요? 댓글을 남겨주세요. 사람들이 어떤 소리에 끌리는지 진심으로 궁금합니다. 만약 espeak 방식을 사용하여 Claude가 말 그대로 당신에게 말을 걸게 만들었다면 가산점을 드립니다.
Building jo4.io - 분석, 바이오 페이지(bio pages), 팀 워크스페이스(team workspaces) 기능을 갖춘 현대적인 URL 단축기(URL shortener)를 만드는 중입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기