종합부동산웹앱 AI 분석 워크벤치 원천 실행 레이어 구현
질의 원문
계속 진행해
수집 경로와 시점
- 수집·구현시점: 2026-08-12 14:44:31 +09:00
- 확인 경로: 로컬 저장소
src/realestate/webapp/analyst.py,src/realestate/webapp/orchestrator.py,src/realestate/webapp/app.py,src/realestate/collectors/ - 직전 맥락: AI 투자분석 워크벤치 1차 구현 후, 다음 단계로
run_analysis_plan()이 가능한 백엔드 원천을 실제 실행하도록 확장
데이터 등급
| 항목 | 등급 | 비고 |
|---|---|---|
| 사용자 지시 | 1차 사용자 입력 | 본 대화에서 직접 제공 |
| 구현 코드 | 로컬 코드 원본 | 오케스트레이터 실행 레이어, FastAPI 실행 플래그, JS 실행 플래그 |
| 테스트 executor 결과 | 테스트 대역 | 네트워크 없이 호출 계약 검증용 |
| 실제 원천 수집값 | 미수집 | 이번 검증은 네트워크 원천을 직접 호출하지 않고, 실행 가능 계약과 실패 기록을 검증 |
구현 내용
run_analysis_plan()에 execute_sources와 source_executor 인자를 추가했다. 기본값은 실행하지 않는 계획 요약 모드이며, 웹앱의 분석 실행 버튼은 execute_sources=true를 넘겨 실제 실행 모드로 동작한다.
실행 모드에서는 collector_plan의 원천을 순회한다.
available원천은 executor를 호출한다.- executor 성공 시
source_results에 요약과 Markdown을 남기고,source_status.execution_status=executed로 표시한다. - executor가
SourceUnavailable을 던지면 후보를 꾸며내지 않고source_status.execution_status=unavailable과 실패 사유를 남긴다. partial원천은 자동 실행하지 않고skipped로 남긴다.
기본 executor는 다음 원천을 안전 실행 대상으로 둔다.
seoul_redev: 서울 열린데이터광장 OA-22856 공식 xlsx를 수집해 정비사업 후보 랭킹redev_national: 국토교통부 전국 도시정비사업 공식 CSV를 수집해 후보 랭킹capital_strategy:target_price와capital또는own_capital이 있을 때 자금계획 계산
네이버 단지, 국토부 실거래, 건축물대장 등은 원천 식별자나 서비스키가 없으면 자동 실행하지 않고 SourceUnavailable로 남긴다.
FastAPI의 /api/analyst/run은 execute_sources와 선택적 app.state.analyst_source_executor를 오케스트레이터에 전달한다. 테스트에서는 이 주입 지점을 사용해 네트워크 없이 executor 호출 계약을 검증했다.
프론트엔드의 분석 실행 버튼은 execute_sources: true를 전달하도록 갱신했다.
가정
- “계속 진행”은 직전 단계의 다음 축인 “분석 계획에 포함된 백엔드 원천 실행”을 의미한다고 보았다.
- 실제 원천 API는 네트워크, 키, 식별자 상태에 따라 실패할 수 있으므로, 실패는 정상 결과의 일부로 기록한다.
- 테스트에서는 네트워크 원천을 직접 호출하지 않고 executor 주입으로 실행 계약을 검증하는 것이 안전하다.
한계·미확인
- 이번 단계는 실제 서울/전국 정비사업 파일을 테스트에서 다운로드하지 않았다.
- 네이버 단지 시세, 국토부 실거래, 건축물대장 자동 호출은 아직 원천 식별자 보강이 필요하다.
/api/analyst/run에서 생성된watchlist_candidates를 사용자가 승인해 워치리스트에 저장하는 흐름은 다음 단계다.- LLM API 연결은 아직 하지 않았다. 현재는 deterministic planner와 backend executor 구조다.
검증
- RED:
run_analysis_plan(..., execute_sources=True, source_executor=...)가 인자를 받지 못해 실패 - RED:
/api/analyst/run이source_results를 반환하지 않아 실패 - GREEN:
$env:PYTHONPATH='src'; python -m pytest tests/test_webapp_analyst.py::test_run_analysis_plan_executes_available_sources_with_injected_executor tests/test_webapp_analyst.py::test_run_analysis_plan_records_source_unavailable_without_fabricating_candidates tests/test_webapp_app.py::test_analyst_run_endpoint_uses_injected_executor_when_enabled -q-> 3 passed - Focused:
$env:PYTHONPATH='src'; python -m pytest tests/test_webapp_analyst.py tests/test_webapp_app.py -q-> 15 passed - JS 문법:
node --check src/realestate/webapp/static/app.js-> 통과
다음 단계
watchlist_candidates를 화면에 표시하고, 사용자가 선택해 워치리스트로 저장하는 승인 흐름을 추가한다.- planner가
source_refs를 받을 수 있게 해 네이버 단지번호, 법원 사건번호, 정비사업 원문 URL이 있을 때 해당 수집기를 실행한다. - 실행 결과 문서 저장 시 원천 실행 결과와 실패 원인을 더 읽기 쉬운 투자안 카드 형태로 정리한다.