static/index.html에 AI 위협분석 모달과 챗봇 패널을 연결한 뒤, "그래서 이 화면에서 실제로 얻을 수 있는 정보가 뭐인가"를 처음부터 끝까지 추적한 감사 기록. 개선 우선순위까지 정리한다.
// DroneSimulator.simulate()
targetId: DRONE-001/002/003 중 하나 (고정된 3개뿐)
latitude/longitude: 한반도 범위 내 완전 랜덤
altitude: 100~1000m 랜덤
speed: 50~250km/h 랜덤
status: 항상 "DETECTED"
실제 센서 데이터가 아니라 순수 난수다. 매 라운드마다 좌표가 그냥 랜덤으로 다시 뿑히는 거라, 화면에서 드론이 "이동"하는 것처럼 보여도 실제로는 물리적으로 이어지는 굤적이 아니라 매번 새로 첍히는 점들이다.
DroneSimulator → Kafka(target-tracking 토픽)
│
┌─────────┴─────────┐
▼ ▼
target-tracking-service threat-intel-ai-service
(Java, 같은 서비스) (Python, 별도 서비스)
│ │
WebSocket 브로드캐스트 Qdrant에 "이력"으로 영구 저장
→ 지도/사이드바 실시간 표시 (챗봇이 나중에 검색할 데이터)
│
PostgreSQL에도 저장 (지금 대시보드는 안 쓀)
같은 Kafka 이벤트 하나가 서로 다른 두 소비자에게 각자 다른 목적으로 쓰인다.
<table header-row="true"><tr><td></td><td>AI 위협분석 버튼</td><td>AI 챗봇 패널</td></tr><tr><td>비교 대상</td><td>고정된 10개 패턴</td><td>실제 탐지 이력(Qdrant) + 문서</td></tr><tr><td>입력</td><td>현재 표적 1개 현재값</td><td>자유 텍스트 질문</td></tr><tr><td>출력</td><td>등급 백지 + SITREP + 유사패턴 3개</td><td>자연어 답변 + 근거 출처 + 도구호출 결과</td></tr><tr><td>언제 유용한가</td><td>"이 표적 지금 위험한가?"</td><td>"과거에 이런 적 있었나?"</td></tr></table>
문제는 화면상으로는 둘이 완전히 분리돼 있어서, 사용자가 이 차이를 알 방법이 없다는 것이다.
지도 위 드론 아이콘 + 사이드바 카드(원시 수치) + (버튼을 누르면) 위협등급 모달 또는 챗봇 답변. 사용자가 아무 버튼도 안 누르면 원시 좌표/고도/속도 숫자 나열 이상의 정보는 얻을 수 없다.
1~4번은 프론트엔드만으로 가능하고, 5~6번은 각각 Java 시뮬레이터 로직과 Python 조회 API가 추가로 필요하다.