"되돌려줘" 한 마디에 AI가 제가 분류한 데이터를 다 날렸어요 (바우처 웹앱 2편) — 훅 (Hook) 이 필요한 이유

상담센터 바우처 앱에 진짜 2년치 데이터 1,---건을 넣은 날에 벌어진 사고, 복구 불가 선언, 그리고 데이터 보호 훅 제작기


🎯 바쁘시면 이것만 읽어도 돼요

  • 실데이터(내담자 2--명, 상담 기록 2년치)를 넣은 지 사흘 만에, "테스트한 거 되돌려줘" 한 마디가 일괄 업데이트로 실행돼서 제가 손으로 분류해둔 '종결' 상태가 전부 리셋됐어요

  • 어느 게 진짜 종결이었는지 기록이 없어서 자동 복구가 불가능했어요 — git도 휴지통도 소용없는 종류의 사고였어요

  • 그래서 사고 친 AI한테 "너를 차단하는 훅을 만들어"라고 시켰어요. 이제 분류 데이터를 일괄로 건드리는 명령은 실행 전에 막혀요 (자체검증 28케이스 통과)

👀 이런 분들께 도움돼요

  • AI한테 실데이터(고객 명단, 장부, 업무 기록)를 맡기기 시작한 분

  • "되돌려줘", "원래대로 해줘" 같은 말을 AI한테 자주 하는 분

  • 코드는 git으로 되돌려도 데이터는 안 된다는 걸 아직 안 겪어본 분

  • 훅(hook)이 뭔지, 어디에 쓰는 물건인지 궁금했던 분

😮 Before: 장난감 앱에 진짜 데이터를 넣었어요

지난 글(구축기)에서 이어지는 이야기예요. 지난 글에서 소개했듯 저는 센터에서 자동화를 맡은 직원이고, 실무진(행정·회계·상담사·소장님)이 쓸 바우처 행정 웹앱을 실무진과 실시간으로 소통하면서 Claude Code로 만들어 배포까지 마친 상태였어요. 이번 글은 그다음 — 목업 데이터로 돌아가던 그 앱에 진짜 데이터를 부은 주의 이야기예요. 내담자 2--명, 바우처 등록 2--건, 2년치 상담 세션 1,---건, 직원 계정 1-개. 이때부터는 "지우고 다시 만들지 뭐"가 안 되는 단계였는데, 솔직히 저는 그 무게를 아직 몰랐어요.

✨ After: 사고 친 AI가 자기를 막는 문지기를 만들었어요

일괄 리셋 사고를 한 번 제대로 겪고 나서, 분류 데이터를 일괄로 바꾸는 명령은 AI가 실행하기 전에 자동 차단되는 훅을 달았어요. 지금은 제가 명시적으로 허락해야만 통과되고, 차단된 시도는 전부 로그로 남아요. 같은 사고는 이제 물리적으로 못 일어나요.

🛠️ 이 글에 필요한 배경은 딱 하나예요

  • 앱이 뭘 하는지(4역할, 등록·기록지·정산·입금)는 지난 글에 자세히 있어요

  • 이번 글에서 중요한 건 하나 — '진행중/종결' 상태예요. 이 값 기준으로 화면이 갈리고 정산이 돌아가요. 그리고 이 상태는 자동이 아니라 제가 한 건씩 손으로 분류해 넣은 값이에요

🔨 과정: 사고 → 복구 불가 → 문지기 → 오픈 준비

1️⃣ 진짜 데이터가 들어오니 결정의 무게가 달라졌어요

백필하면서 처음 느꼈어요. 퇴사한 직원분들의 계정이 있었는데, 계정을 지우면 그분들이 남긴 상담 기록까지 꼬여요. 그래서 삭제 대신 로그인만 차단하고 기록은 보존하는 쪽을 골랐어요. "지우는 건 쉽고 되살리는 건 어렵다" — 이때 한 이 생각이 며칠 뒤 사고의 복선이 될 줄 몰랐어요.

2️⃣ 😲 하이라이트: "되돌려줘" 한 마디가 사고가 됐어요

종결 토글 기능을 테스트하느라 몇 건을 '종결'로 바꿨다가, 테스트가 끝나서 가볍게 말했어요. "테스트한 거 되돌려줘."

제 예상: 방금 테스트로 바꾼 그 몇 건만 원래대로 돌아온다.

실제로 벌어진 일: AI는 "종결인 것 전부를 진행중으로"라는 일괄 업데이트를 돌렸어요. 테스트로 바꾼 건과 제가 진짜로 분류해둔 종결 건이 같은 '종결'이니까, 구분 없이 전부 진행중이 된 거예요.

더 무서웠던 건 그다음이었어요. 복구하려고 보니 어느 내담자가 진짜 종결이었는지 기록이 어디에도 없었어요. 코드는 git이 있고 파일은 휴지통이 있는데, DB 안의 '분류'라는 건 제 머릿속에만 있던 정보더라고요. AI도 "자동 복구는 불가능합니다"라고 인정했어요. 결국 한 건씩 수기로 다시 분류했어요.

그때 처음 알았어요 — "되돌려줘"는 제 머릿속에선 범위가 분명한데, AI한테는 해석의 여지가 있는 말이라는 걸요.

3️⃣ 사고 친 AI한테 "너를 막는 문지기를 만들어"라고 시켰어요

재발 방지를 문서로 적어둘까 하다가 관뒀어요. "조심해줘"라고 적어둬 봤자 다음 세션의 AI는 까먹어요. 그래서 실행 경로 자체를 막기로 했어요.

Claude Code엔 PreToolUse 훅이라는 게 있어요. AI가 명령을 실행하기 직전에 검사 스크립트를 먼저 통과시키는 장치예요. 여기에 파이썬 스크립트(protect-data.py)를 달았어요:

AI가 명령 실행 시도 → 훅이 먼저 검사: 분류 데이터 테이블에 일괄 update/delete인가? → 맞으면 차단 + blocked.log에 기록 → 정말 필요하면 제가 동의 표시(DATA_OK=1)를 붙여야만 통과

JS 코드든 SQL이든 REST 호출이든 형태를 바꿔도 잡게 했고, 만들고 끝이 아니라 우회 케이스 28개를 자체검증시켰어요. 그런데도 사흘 뒤에 프로젝트 폴더 밖에서 명령을 돌리면 안 막히는 구멍을 발견해서 한 번 더 보강했어요. 문지기도 점검이 필요하더라고요.

4️⃣ 기능을 빼니까 오히려 앱이 완성됐어요

사고를 겪고 나니 설계 보는 눈이 바뀌었어요. "자동으로 해주는 기능"이 덜 고마워지고 "사람이 확정하는 절차"가 좋아 보이더라고요.

  • 기간이 지나면 자동으로 종결 처리하던 판정을 폐기하고, 사람이 토글로 바꾸되 확인 모달을 한 번 거치게 했어요

  • 수동 배정 화면은 통째로 제거했어요 — 일정 앱 동기화가 대신하니까요

  • 메뉴는 진행중·종결·전체 내역·현황, 딱 4개만 남겼어요

5️⃣ 마지막 작업은 코드가 아니라 안내문이었어요

앱이 돌아가도 실무진이 못 쓰면 없는 거랑 같아요. 우리 실무진은 앱이 낯선 분들이고, 역할마다 로그인하면 보이는 화면 자체가 달라요. 그래서 가이드도 하나로 안 만들고 역할별로 따로 만들었어요 — 소장님용(기록지 확인·정산), 회계용(입금·엑셀 내보내기), 상담사용(기록지 제출).

톤도 일부러 낮췄어요. "클릭하면 이 화면이 나와요" 수준의, 앱을 처음 써보는 분 기준으로요. 웹 문서랑 이미지 두 형태로 뽑아서 어디서든 바로 열어볼 수 있게 했고요. 이것도 AI한테 시켰는데, 의외로 잘 맞는 일이었어요 — 앱 코드를 직접 짠 AI라서, 화면 설명이 한 군데도 안 틀리더라고요.

📊 결과

항목

사고 전

사고 후

분류 데이터 일괄 변경

AI가 그냥 실행

훅이 실행 전 차단, 해제는 동의 표시 필수

차단 기록

없음

blocked.log 감사 로그

검증

없음

자체검증 28케이스 + 사각지대 1회 보강

종결 판정

자동 판정

사람이 토글 + 확인 모달

실무진 온보딩

없음

역할별 가이드 3종 (소장·회계·상담사)

운영 데이터

내담자 2--명 / 등록 2--건 / 세션 1,---건 무사 운영 중

💡 효과적이었던 것

  • 복구보다 재발 방지 장치를 먼저 만든 것 — 수기 복구는 하루면 끝나지만, 장치가 없으면 다음 사고는 더 큰 데이터에서 터졌을 거예요

  • 규칙을 문서가 아니라 훅으로 만든 것 — 메모리는 잊혀도 실행 차단은 안 잊혀요. "하지 마"는 약속이고, 훅은 자물쇠예요

  • 훅한테도 테스트를 시킨 것 — 28케이스 검증이 없었으면 "달아놨으니 안심"하고 있다가 구멍으로 또 당했을 거예요

⚠️ 이런 건 아쉬웠어요

  • 백업을 사고 후에야 생각했어요. 실데이터 넣는 날 정기 백업부터 잡았어야 했는데, 순서가 거꾸로였어요

  • 훅이 가끔 멀쩡한 명령도 잡아요. 과잉 차단이라 데이터가 위험한 건 아니지만, 동의 표시 붙이는 게 한 번씩 번거로워요

📋 따라하려면

  1. AI한테 실데이터를 맡기기 전에 "절대 일괄로 못 건드리는 값" 목록부터 정해요 (저는 진행중/종결 상태, 입금액, 비고)

  2. Claude Code 설정에 PreToolUse 훅으로 차단 스크립트를 달아요 — 해당 테이블 + 일괄 update/delete 조합이면 차단

  3. "되돌려줘" 대신 "방금 바꾼 ○○○ 3건만 원복해줘"처럼 범위를 사람이 말해요

  4. 훅을 만들었으면 우회 케이스(다른 언어, 다른 경로, 폴더 밖 실행)로 테스트까지 시켜요

  5. 차단 로그를 남겨요 — AI가 뭘 하려다 막혔는지 보는 것 자체가 공부가 돼요

  6. 오픈 전에 실사용자 역할별 가이드를 AI한테 만들게 해요 — 앱을 직접 짠 AI가 화면 설명도 제일 정확해요

내 다음 목표

  • DB 정기 백업 잡기

  • 행정·회계 실계정 셋업 마무리하고 센터에 정식 오픈하기

  • 현황 화면을 제대로 된 대시보드로 키우기 — 지난 글에서 적어둔 숙제 중 아직 안 끝난 것

3
2개의 답글

뉴스레터 무료 구독