CongKong AI 챗봇 — 파일 첨부, 타이핑 인디케이터, 비즈니스 시간 설정
이번 주 챗봇에 추가된 것들
4월 28~30일 사이에 CongKong AI 챗봇에 굵직한 기능 세 가지가 들어갔다.
1. 파일/이미지 첨부 전송 (4/30)
위젯과 관리자 패널 양쪽에서 파일·이미지를 첨부해 전송할 수 있게 됐다. Firebase Storage에 업로드 후 다운로드 URL을 메시지에 포함하는 방식.
처음엔 PDF 업로드 시 403 에러가 계속 났다. Storage Rules와 CORS 설정이 맞지 않아서였다. Rules에서 contentType 검사 조건을 조정하고, storage.cors.json에 허용 origin을 추가해서 해결했다.
위젯은 Shadow DOM으로 CSS를 격리하고 있어서, 파일 첨부 input 스타일이 호스트 사이트에 영향을 주거나 반대로 영향받지 않도록 추가 처리가 필요했다.
2. 담당자 실시간 타이핑 인디케이터 (4/30)
고객이 채팅창을 열고 있을 때, 담당자가 답변을 입력 중이면 "입력 중..." 인디케이터가 표시된다.
구현은 Firestore의 session 문서에 agentTyping: boolean 필드를 두고 onSnapshot으로 구독하는 방식. 심플하지만 실시간성이 확실하다.
AI가 응답 중일 때는 이미 로딩 인디케이터가 있으므로, AI 인계 세션에서는 타이핑 인디케이터를 숨기도록 분기 처리했다.
3. 비즈니스 시간 설정 (4/29)
회사별로 영업 시간을 설정할 수 있는 기능. 영업 시간 외에 들어온 메시지는 안내 메시지를 자동 반환한다.
관리자 패널 설정 화면에 요일·시간 range 입력 UI를 추가하고, Firestore의 tenant 문서에 businessHours 배열로 저장하는 구조로 구현했다.
인프라 삽질: 호스팅 이전
4/29에는 기능 개발 외에 인프라 이슈도 있었다. Firebase Hosting에서 Cloudflare Pages로 옮겼다가 widget.js 캐시 헤더 규칙이 꼬이는 문제가 생겨 다시 Firebase로 롤백했다.
Firebase Hosting의 headers 규칙은 순서가 중요하다. **/*.js에 max-age 캐시를 걸어두면, 그보다 먼저 정의된 widget.js의 no-cache 규칙이 덮어씌워진다. 더 구체적인 패턴을 항상 앞에 두어야 한다는 것을 다시 확인했다.
채널 단위 지식베이스 스코핑 (4/28)
같은 챗봇 내에서도 채널(카테고리)별로 다른 지식베이스와 솔루션을 참조하도록 scoping 기능을 추가했다. FAQ 즉시 답변에서 링크 및 PDF 액션도 붙었다.