본문 바로가기
Claude Code 작업이 완료되었습니다: hooks로 알림음 설정하기
AI

Claude Code 작업이 완료되었습니다: hooks로 알림음 설정하기

백경현
백경현위니브 프론트엔드 개발자2026/09/30

얼마 전 디스코드에 올라온 사진 한 장. 어떤 엔지니어가 만든 'USB-Clawd'라는 장치인데, Claude Code의 답변이 끝나면 USB에 달린 로봇이 움직이며 "나 다 했어요"라고 알려주는 물건이었다. 다들 "귀엽다", "갖고 싶다" 하면서 한참을 웃었는데, 웃다 보니 문득 이런 생각이 들었다.

"근데 저거… 사실 내가 매일 겪는 문제잖아?”

Claude Code에 긴 작업을 맡겨두고 다른 일을 하다가, 한참 뒤에야 "어, 끝났네?" 하는 일이 정말 많다. 때로는 응답을 해야하는 상태로 오래동안 방치되는 경험이 잇다. 물리적인 장치까진 아니더라도 문제를 해결해 낼 방법은 없을까 고민하다가, Claude Code 내장 hooks와 사운드 알림만으로도 충분하겠다는 결론에 닿았다. 이번 글은 그 과정을 정리한 기록이다.

문제 상황

Claude Code에 긴 작업을 맡긴 뒤에는 보통 다른 작업으로 맥락을 옮기게 된다. 이때 두 가지 문제가 반복적으로 발생한다.

  • 완료 인지 지연: 작업이 끝난 지 한참 지났는데도 모르고 있다가 다음 단계로의 진행이 늦어진다.
  • 입력 대기 인지 지연: 도구 실행 승인이나 추가 정보를 기다리고 있는데도 방치되어, 전체 작업이 멈춰 있다.

결국 터미널을 수시로 들여다보게 되어 백그라운드 실행의 이점이 상당 부분 사라진다. 가장 간단한 해결책은 이벤트 기반 소리 알림이다.

바퀴를 만들지 말자: peon-ping

찾아보니 이미 만들어진 프로그램이 있었다. peon-ping이라는 서비스이고 도입해서 사용해보았다. 워크래프트 보이스를 재생해주는 CLI 툴이다.

장점

  • 설치하면 바로 동작해서 설정 부담이 적다.
  • 토스트 메시지도 같이 띄워줘서 시각적 알림까지 가능하다.

단점

  • 사운드팩 선택지가 제한적이고, 커스텀 팩 적용이 번거롭다.

이벤트별로 사운드를 독립적으로 사용하려면 결국 Claude Code 내장 hooks를 사용하는게 좋을 것이라고 판단했다.

(사실은 사무실에서 게임 사운드가 갑자기 울려서 화들짝 놀란 게 한 121980번쯤 된다. peon-ping을 대체할 다른 방법을 찾게 된 주된 이유였다)

Claude Code Hooks를 사용하여 알림음 설정하기

Claude Code의 hooks는 지정된 이벤트가 발생했을 때 임의의 셸 명령을 실행시키는 기능이다. 어떤 명령이든 붙일 수 있기 때문에, macOS의 afplay를 연결하면 사운드 재생이 가능하고, osascript를 연결하면 데스크톱 알림도 띄울 수 있다.

활용할 주요 이벤트 이번 글에서는 두 가지 이벤트만 다룬다. 이 둘만 잡아도 일상적인 알림 용도는 충분하다.

이벤트발동 시점용도
StopClaude가 응답을 마쳤을 때작업 완료 알림
Notification사용자 입력이나 승인이 필요할 때대기 상태 알림

설정 파일은 ~/.claude/settings.json에 작성하고, 수정 후에는 세션을 재시작해야 반영된다. 기본 구조는 다음과 같다.

{
  "hooks": {
    "<이벤트명>": [
      {
        "matcher": "",
        "hooks": [
          { "type": "command", "command": "<셸 명령>" }
        ]
      }
    ]
  }
}

핵심은 command 한 줄이다. 여기에 무엇을 넣느냐에 따라 알림 방식이 결정된다.

기본 알림음으로 시작하기

가장 가볍게 시작하려면 macOS 내장 사운드를 쓰면 된다. /System/Library/Sounds/에 Glass.aiff, Ping.aiff 등 짧고 자극이 적은 소리가 들어 있어 사무실에서도 무난하다.

{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          { "type": "command", "command": "afplay /System/Library/Sounds/Glass.aiff" }
        ]
      }
    ],
    "Notification": [
      {
        "matcher": "",
        "hooks": [
          { "type": "command", "command": "afplay /System/Library/Sounds/Ping.aiff" }
        ]
      }
    ]
  }
}

이것만으로도 "작업 완료"와 "입력 대기"를 청각적으로 구분할 수 있다.

사운드팩으로 확장하기

원하는 파일을 다운로드 하여 사운드를 설정할 수도 있다. 원하는 폴더에 사운드 파일을 모아두고, command만 수정하면 된다. afplay는 .mp3, .wav, .aiff를 모두 지원한다.

~/sounds/mario/
├── coin.mp3      # 작업 완료 (Stop)
└── pause.mp3     # 입력 대기 (Notification)
{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          { "type": "command", "command": "afplay ~/sounds/mario/coin.mp3" }
        ]
      }
    ],
    "Notification": [
      {
        "matcher": "",
        "hooks": [
          { "type": "command", "command": "afplay ~/sounds/mario/pause.mp3" }
        ]
      }
    ]
  }
}

폴더만 통째로 바꾸면 분위기를 한 번에 갈아치울 수 있다는 게 hooks 방식의 장점이다.

마무리하며

오랫동안 불편함을 겪던 문제였는데 간단한 설정으로 손쉽게 해결되었다.=. 이벤트가 발생할 때 짧은 신호 하나만 울려줘도 작업 흐름은 훨씬 매끄러워진다. USB-Clawd처럼 눈 앞에서 움직이지 않아도, hooks와 afplay 조합이면 비슷한 효과를 충분히 누릴 수 있었다.

핵심을 다시 정리하면 이렇다.

  • Stop과 Notification 두 이벤트만 잡아도 작업 완료와 입력 대기를 깔끔히 구분할 수 있다.
  • 시작은 macOS 시스템 사운드, 익숙해지면 사운드팩으로 확장한다.
  • 전역 설정은 중립적으로, 개성은 settings.local.json에만 둔다.

JSON 몇 줄만으로 끝나는 작업이니 부담 없이 적용해보길 권한다.

백경현
백경현
위니브 프론트엔드 개발자