익명 질문 게시판 — 문제를 겪고, 다섯 고삐로 통제하는 실전
보여주는 것이 전부. 데이터는 어디에도 남지 않고, 브라우저를 닫으면 끝. 전단지끼리 서로 연결되지 않습니다.
여러 브라우저가 같은 게시판을 보고, 한쪽의 질문이 다른 쪽에도 나타나고, 닫았다 열어도 데이터가 남습니다. 주문을 받고·기록하고·관리하는 카운터가 내 컴퓨터에서 실행됩니다.
5장 감정 일기장은 "혼자 쓰는 카페"였습니다. 이번엔 많은 손님이 동시에 줄 서는 카페 — 줄을 세우고, 100번 주문을 막고, 쓰러진 카운터를 다시 세우고, 매출을 확인해야 합니다. 그게 바로 5가지 고삐입니다.
· 익명 질문 등록 + 실시간 목록 + 좋아요 투표
관리자 화면에서 답변 작성·게시 (3줄 이내)
데이터는 data 폴더에 JSON 저장 · 초록+흰색 톤 · 375px 반응형
★ 체크리스트 7항목 — 특히 "브라우저 두 개에서 열고, 한쪽 질문이 다른 쪽에 새로고침 없이 나타나는가"
매 단계 상태 출력 + 증거 요구 + 실패 시 재검증
localhost:3000 = "내 컴퓨터 안의 주소", 카페의 우리 가게 정문. 안 뜨면 npm start(=카페 오픈). 접속 불가 시 부록 A.2.
'익명으로 모은다'는 어디에나 통합니다 — 의견을 받으면 만족도 설문, 칭찬을 받으면 롤링페이퍼, 제보를 받으면 사내 건의함. 공개(QR 접속)는 10장 배포에서.
1. 욕설·비속어 → 차단 + "부적절한 질문입니다"
2. 개인정보(이름·연봉·주소) 질문 → 차단
3. 주제 무관 질문 → "주제와 관련된 질문을 해주세요"
4. 차단 질문은 관리자 화면에서만 보이게
+ CLAUDE.md에도 규칙 추가, ★ 체크리스트 4항목 + 증거
우리가 한 일 — 코드 수정이 아니라 자연어로 규칙을 적은 것. Claude Code가 filter.js를 만들어 등록 전에 거치도록 연결했습니다. (그림 7.7~7.8)
단어·패턴 필터는 변형 욕설을 놓치거나 정상 질문을 잘못 막을 수 있음 — 변형 표현과 정상 질문을 직접 넣어 시험하고, 운영 중 발견 사례를 계속 추가.
1. 10초 이내 재질문 → "잠시 후에 다시 질문해주세요"
2. 길이 최소 5자 ~ 최대 300자
3. 같은 내용 연속 → 차단
4. 1분에 5개 이상 → 5분간 입력 차단
빈칸만·공백 300개 + "추가 시나리오를 최소 2개 발굴할 것"
→ 저자 실행 시 AI가 8개를 추가 발굴: 제로폭 공백, 공백 패딩 위장, 필드 누락, 잘못된 JSON, 사용자별 제한 격리, 경계값 5·300자, 슬라이딩 윈도우… 전부 통과 (그림 7.9)
· 숫자·날짜 포함 답변 → "검증 필요" 태그 자동 부착
좋아요 집계·정렬 자동 테스트 (5>3>1 정렬, 10번 → 정확히 10 증가)
화면 좋아요 수 ≠ 실제 기록 수 → "집계 불일치" 경고
이것은 사실 검증이 아니라 위험 표시 — 사람이 확인할 답을 골라내는 것.
· "검증 필요" 답변은 게시 보류 → "검증 대기" 상태
관리자가 원문·공식 안내와 대조 후 승인 게시 또는 수정 후 게시 (그림 7.11~7.12)
6.3의 루프가 처음 완전체로 돕니다 — 위험한 답변 앞에서 고리가 멈추고 사람을 기다림. '고리 안의 사람' = 당신.
규칙·울타리·검증은 전부 "정상 작동 중"의 일 — 서버가 죽으면 셋 다 무용지물.
멈춘 코드는 "5초 후 재시작"을 실행할 수 없으니, 외부의 감시자가 필요합니다.
번거로울 뿐 어렵지 않은 과정 — 꼭 직접 해보기를 권합니다. "죽으면 자동으로 살아난다"를 눈으로 확인하는 순간, 안전벨트가 체감됩니다.
현재 접속자(실시간) · 오늘 질문/답변 수 · 차단 질문 수 · 검증 대기 수 · 서버 응답 시간 · 오늘 재시작 횟수 · 최근 1시간 질문 추이 그래프
URL은 /admin/dashboard, 로그인한 관리자만 접속. 파괴 테스트: 데이터 0건 표시, 비로그인 접근 거부 + AI 추가 발굴 2개.
접속하면 모든 현황이 한눈에(그림 7.22) — 문제가 생기기 전에 "뭔가 이상하다"를 알 수 있습니다.
Lv.4 달성 — 5가지 고삐 완성. Q&A 게시판은 이제 "통제된 서비스"입니다.
| 상황 | 통제 없는 게시판 | 5가지 고삐를 채운 게시판 |
|---|---|---|
| 욕설 입력 | 그대로 전체 공개 | 차단 + 관리자 화면에만 보관 |
| 도배 시도 | 목록이 도배로 뒤덮임 | 쿨타임·중복·횟수 제한이 자동 차단 |
| 숫자 든 답변 실수 | 틀린 답이 그대로 게시 | "검증 대기" → 관리자 승인 후 게시 |
| 서버 다운 | 수업 중단, 수동 복구까지 정지 | PM2가 수 초 내 자동 재시작 + 기록 |
| 이용 현황 | 알 방법 없음 | 대시보드에서 실시간 확인 |
코드는 한 줄도 직접 쓰지 않았습니다 — 문제를 말로 설명하고, 경계와 시험과 복구를 요구했을 뿐.
이것이 하네스 엔지니어링입니다.
① Console 가입 → 크레딧 화면에서 $5만 충전 (+세금 $0.50)
② "자동 새로고침(자동 충전)"은 반드시 끄기 — $5를 다 쓰면 AI가 멈출 뿐, 비용 폭발이 물리적으로 불가능
③ 구매 버튼 비활성화? 주소 "자동 채우기" 오류 의심 — 빈칸 직접 확인 (그림 7.27~7.31)
· "API 키 받기" → 생성 → 그 화면에서 즉시 복사 (다시 못 봄)
sk-ant-로 시작하는 문자열 = 인증 정보. 절대 타인 공유 금지, 코드·캡처·대화창에도 적지 않기
유출 의심 시 Console에서 즉시 폐기·재발급 (그림 7.32~7.37)
· 관리자 화면에 "AI 자동 답변" 버튼 — .env의 Key로 Claude API 호출, 3줄 이내 답변 생성
현재 사용 가능한 Haiku 모델 ID를 확인해 적용하고 보고에 명시
생성 답변은 관리자 검토 후 게시 (그림 7.38~7.42)
Opus: 복잡한 추론, 느리고 크레딧 큼 · Sonnet: 속도·지능 균형 · Haiku: 가장 빠르고 저렴
짧은 답변·낮은 비용 우선이므로 Haiku — 단 중요한 답변은 모델과 무관하게 근거 확인 + 관리자 검토.
| 고삐 | AI 답변에 적용한 내용 |
|---|---|
| ① 규칙 | 욕설·차별·위험 내용이 있으면 게시하지 않음 |
| ② 울타리 | 답변 3줄 이내 · AI 호출 분당 횟수 제한 |
| ③ 검증 | 단정 표현 → "정확하지 않을 수 있음" 면책 · 숫자·날짜·범위 → "관리자 확인 필요" 태그 |
| ④ 안전벨트 | API 실패 시 앱은 계속 동작 + "관리자가 직접 답변해 주세요" 표시, 무한 재시도 금지·원인 로그 |
| ⑤ CCTV | 호출 수·응답 시간·토큰·예상 비용·면책 답변 수 → /api/ai-status 에서 JSON 조회 |
무관한 질문("이성원 교수에 대해 설명하라") → "제공된 자료가 없어 확실히 답변할 수 없습니다. 관리자에게 문의하세요. ※ 정확하지 않을 수 있습니다." (그림 7.43) — 태그는 오답의 증거가 아니라 사람이 대조하라는 신호입니다.
| 고삐 | 코드 답변 (7.1~7.7) | AI 답변 (7.8) |
|---|---|---|
| 규칙 | 정해진 문구라 위반 자체가 드묾 | 무슨 말을 할지 몰라 차단 규칙이 필수 |
| 울타리 | 길이·횟수 형식적 제한 | 폭주·비용까지 막는 실질 제한 |
| 검증 | 같은 조건 → 같은 결과, 반복 검증 쉬움 | 같은 질문에도 답이 달라짐 — 지속 검증 필수 |
| 안전벨트 | 서버 다운 대비 | 외부 API 실패까지 대비 |
| 모니터링 | 접속·요청 지표 | 호출·토큰·비용·면책까지 관측 |
정해진 출력에는 고삐가 형식적이지만 — 스스로 판단하는 출력 앞에서 고삐는 생존의 조건입니다.
하네스 엔지니어링이 특히 중요한 곳: 실행할 때마다 새로운 답을 만드는 생성형 AI 기능.
기능: 커플 이름+시작일 → "사귀기 000일째", 100·200·365일 카드, 하트 애니메이션, PNG 저장, 포트 3100
고삐 1 비속어 이름 차단·부정 표현 교체·"사랑해" 금지 ·
고삐 2 미래 날짜 불가·이름 1~20자·새로고침 1분 3회 ·
고삐 3 D-day 자동 테스트 ·
고삐 4 PM2 ·
고삐 5 /api/stats 통계 + ★ 체크리스트 8항목
· 톤: 따뜻하되 과하지 않게, 구체적 장면 언급 ("우리가 처음 만났던 그 카페처럼…")
길이 3~5문장 · 기념일별 톤 변화 (100일 설렘 → 200일 편안 → 365일 감사)
금지: "사랑해" 직접 사용 · "영원히"·"죽을 만큼" · "반드시" 같은 의무 표현
실행 프롬프트는 역시 두 줄 — "CLAUDE.md를 읽고 만들어줘…"
"카드 배경을 파스텔 핑크 그라데이션, 손글씨 폰트로 + PNG 다운로드 + 카카오톡 공유 버튼. 수정 후 기존 체크리스트 7개가 여전히 통과하는지도 확인해줘." (그림 7.49~7.50)
"커플 기념일" → "팀 프로젝트 D-day", "수능 D-day", "여행 카운트다운". Skill.md의 톤을 "응원 메시지"로 바꾸면 수능 앱 완성. Part 4에서 배포하면 공개 URL — 연인에게 "이거 내가 만들었어"라고 보내세요.
Skill.md에 "메시지 생성 방식" 절 추가 — Claude API(Haiku) 사용, Key는 서버 .env에서만, 톤·금지 규칙 준수, /api/ai-status 지표 제공 → "이 규칙을 읽고 수정해줘".
· 대상: Q&A 게시판(3000) + 기념일 앱(3100)
공통 지표: 온라인/오프라인 초록불·빨간불, 접속자, 오늘 요청, 에러, 재시작 횟수, 1시간 추이 — 각 서비스의 /api/stats에서 수집
AI 지표 자동 감지: /api/ai-status 응답이 오면 표시, 404면 영역 자체를 숨김(에러 아님)
어두운 배경 + 밝은 카드, 5초 자동 갱신
확인 — 기념일 앱을 kill로 죽여도 PM2가 즉시 살려 대시보드는 태연 → 하지만 "서버 재시작: 1회"가 증거를 남깁니다(그림 7.53).
통제 — "오프라인/재시작 시 ▲ [시각] 팝업 경고 + 기존 체크리스트 재확인" (그림 7.55)
확장 가능한 모니터링 — 새 서비스가 /api/stats만 제공하면 config.json에 URL 추가로 끝. 서비스가 10개가 되어도 한 화면.
세 서비스 일괄 관리: 각 폴더에서 npx pm2 start ecosystem.config.js — 종료는 npx pm2 stop qa-board / d-day-countdown / monitoring-hub (그림 7.56~7.61).
| 문제 | 해결 | 채운 고삐 |
|---|---|---|
| 부적절한 글 | CLAUDE.md에 필터 규칙 추가 | ① 규칙 쓰기 (Instructions/Rules) |
| 도배 | 쿨타임·길이 제한·중복 차단 | ② 울타리 치기 (Guardrails) |
| 답변 오류 | 자동 검증 + 관리자 승인 + 자동 테스트 | ③ 시험 보기 (Testing/Evals) |
| 서버 다운 | PM2 자동 재시작 | ④ 안전벨트 (Auto-recovery) |
| 상태 파악 불가 | 실시간 모니터링 대시보드 | ⑤ CCTV (Monitoring/Observability) |
CLAUDE.md(4장) = 회사 규정 · Skill.md(5장) = 자격증 —
그리고 8장에서 .claude/agents/의 직무기술서가 더해져,
'만드는 AI'와 '검사하는 AI'의 역할이 마침내 분리됩니다.
형식 검증을 넘어 내용 검증으로, 성숙도 Lv.5로.
※ 8장은 Claude API를 사용합니다 — 7.8을 건너뛴 독자는 먼저 7.8(Key 발급)을 마치고 오세요.