6) 시스템 아키텍처
전체 구성
[공공데이터 API] [정책자금 공고 API] [뉴스 (빅카인즈·네이버)]
상가정보·LOCALDATA 기업마당·중소벤처24 키워드 언급량·메타데이터
상권분석·생활인구·실거래가 K-Startup
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────────────┐
│ 수집 파이프라인 (좌표계 변환 · 멱등 시드 · 증분 커서 · 오류 격리) │
└──────────────────────────────┬──────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────────┐
│ 백엔드 (FastAPI) │
│ · 지표 산출: 행정동×업종별 성장률·폐업률·생존율 → GeoJSON API │
│ · 구조화(Chunking) + 임베딩·인덱싱 → Hybrid RAG 검색 │
│ · 분석 에이전트: 전통/특이 변수 진단 + 근거 인용 응답 │
│ · 계산기: 월세 vs 매입 (실거래가 × 공시 금리) │
└──────────────────────────────┬──────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────────┐
│ 프론트엔드 (Flutter) │
│ 지도(단계구분도·마커·상권 카드·슬라이더) · 에이전트 대화 · 계산기 │
│ + 브이월드 WMTS 배경지도 · WFS 행정동 경계 │
└─────────────────────────────────────────────────────────────────┘
💡 쉽게 말하면: 아래에서 위로 물이 흐르는 정수장과 같습니다. 원수(공공데이터)를 받아 정수(수집·정리)하고, 물탱크(백엔드)에서 지표와 검색 자료로 가공한 뒤, 수도꼭지(Flutter 앱)로 사용자에게 내보냅니다.
브이월드의 역할 분담
브이월드는 지도·공간 레이어만 제공한다. 성장률·폐업률 지표는 우리가 LOCALDATA로 직접 산출해 얹는다.
| 기능 | API | 용도 |
|---|---|---|
| 배경지도 | WMTS/XYZ 타일 | 지도 베이스 |
| 행정구역 경계 | WFS (시군구·읍면동 폴리곤) | 단계구분도 영역 |
| 지오코딩 | Geocoder API | 업소 주소 → 좌표 변환 |
| 검색 | Search API | 주소·지명 검색 진입점 |
API 키 발급 시 서비스 도메인 등록이 필요하고 무료 quota가 있다. 브이월드 WFS 응답이 무겁거나 quota가 부족하면 경계 폴리곤만 통계청 SGIS API로 대체할 수 있다(배경지도는 브이월드 유지).
설계 원칙
- 업종 불가지론(agnostic): 파이프라인은 처음부터 특정 업종에 얽매이지 않게 구현한다. 업종코드와 지배변수 세트는 설정으로 분리한다. 업종 추가가 설정 추가만으로 끝나게 하기 위해서다.
- Strategy 패턴 —
if 업종분기 금지: 업종 유형별 분석 로직은 조건문 분기 대신 Strategy 클래스로 분리한다. 카페(경쟁밀도)와 부동산(금리)은 변수 구조가 근본적으로 달라, 조건문으로 섞으면 유지보수가 무너진다. - 코어/확장 지표 분리: 전국 공통 데이터 기반 코어 지표와 서울 전용 확장 지표를 코드 레벨에서 분리한다. 지역 확장 시 코어 지표는 그대로 동작한다.
- Fractal 11-File Set: 데이터 테이블 단위로 표준 파일 세트를 구성한다. 지표 집계 테이블도 각각 하나의 세트가 된다.
- ERD 노드-엣지 규칙: 테이블 관계는 노드-엣지 규칙대로 설계한다. 예:
학원테이블과교습과정테이블의 1:N 연결.