종합부동산웹앱 1·2·3단계 통합 구현
질의 원문
이 순서 기억하고 1, 2, 3번 진행해
진행 순서:
- 파이프라인 ↔ 워치리스트 탐색 UX
- 투자 지표 출처·시점 관리
- 실데이터 수집 API 연결
수집 경로와 시점
- 수집시점: 2026-08-11 17:15 KST
- 수집 경로: 로컬 작업트리의 웹앱 코드, 테스트, 프로젝트 문서
- 구현 파일:
src/realestate/webapp/app.pysrc/realestate/webapp/watchlist.pysrc/realestate/webapp/templates/pipeline.htmlsrc/realestate/webapp/templates/watchlist.htmlsrc/realestate/webapp/static/app.jssrc/realestate/webapp/static/watchlist_logic.jssrc/realestate/webapp/static/app.css- 테스트 파일:
tests/test_webapp_pipeline.pytests/test_webapp_watchlist.pytests/webapp_watchlist_logic.test.js
데이터 등급
| 항목 | 등급 | 비고 |
|---|---|---|
| 사용자 요구 | 1차/대화 원문 | 사용자가 직접 지정한 순서 |
| 구현 상태 | 1차/로컬 코드 | 현재 작업트리 파일 기준 |
| 테스트 결과 | 1차/로컬 실행 | pytest와 Node 테스트 결과 |
| 투자 지표 값 | 미수집 | 실제 단지 가격·전세·분담금 분석 아님 |
| 실데이터 API 값 | 미수집 | 주입형 수집기 계약만 구현 |
구현 결과
1. 파이프라인 ↔ 워치리스트 탐색 UX
- 파이프라인 카드에
data-watchlist-count를 추가했다. - 연결 후보가 있는 카드의
워치리스트 N링크를/watchlist?source_doc_id=<doc_id>로 바꿨다. - 파이프라인 화면에
워치리스트 후보만토글을 추가했다. - 워치리스트 화면은
source_doc_idquery를 숨은 필터로 렌더링하고, 각 후보 카드에
data-watch-source-doc-id를 붙인다.
watchlist_logic.js의matchesFilters가sourceDocId조건을 적용한다.
2. 투자 지표 출처·시점 관리
WatchlistItem에metric_sources를 추가했다.- 허용 지표는
current_price,jeonse_price,expected_contribution세 개로 제한했다. - 메타데이터는
source,source_url,collected_at,data_grade,original_verified만 저장한다. - 기존 현재가·전세가·예상 분담금의
null허용 정책은 유지했다. - 워치리스트 카드에 지표 출처, 수집시점, 데이터등급, 원본 확인 여부를 표시한다.
3. 실데이터 수집 API 연결
POST /api/watchlist/{item_id}/metrics/refresh를 추가했다.- 앱에
metric_collector가 주입되지 않았으면 HTTP 503을 반환한다. - 수집기가 반환한 명시 필드만 저장하며, 반환값이 비어 있거나 잘못되면 오류로 처리한다.
- 리뷰 보강으로 refresh가 반환한 각 지표에는
source,collected_at,data_grade가 모두 있어야 한다. - 지표 값이
null로 바뀌면 같은 지표의 낡은 출처 메타데이터도 삭제한다. - 이 endpoint는 실제 값을 추정하지 않는다. 수집기 연결 실패 시 기존 워치리스트 값도 덮어쓰지 않는다.
검증
- RED: 파이프라인 링크·워치리스트 source 필터·Node sourceDocId 필터 테스트가 실패함을 확인했다.
- GREEN: 같은 테스트가 통과함을 확인했다.
- RED:
metric_sources저장·렌더 테스트가KeyError와 누락 HTML로 실패함을 확인했다. - GREEN:
metric_sources저장·렌더 테스트가 통과함을 확인했다. - RED: metric refresh endpoint가 없어 404로 실패함을 확인했다.
- GREEN: 수집기 미설정 503과 주입 수집기 갱신 테스트가 통과함을 확인했다.
- 리뷰 RED/GREEN: refresh 값에 출처 메타데이터가 없으면 502로 실패하고, 값이
null이 되면 낡은 출처가 지워지는 테스트를 추가해 통과시켰다. - E2E 보강:
/watchlist?source_doc_id=...접속 후 실제 브라우저에서 일치 후보만 보이는지 확인했다. - 집중 검증:
python -m pytest tests/test_webapp_watchlist.py tests/test_webapp_pipeline.py tests/test_webapp_static_js.py -q-> 57 passed - 현황판·E2E 포함 focused:
python -m pytest tests/test_webapp_watchlist.py tests/test_webapp_pipeline.py tests/test_webapp_static_js.py tests/test_webapp_watchlist_e2e.py tests/test_investment_board.py -q-> 68 passed, 2 warnings - Node 검증:
node --test tests/webapp_watchlist_logic.test.js-> 6 passed - JS 문법:
node --check src/realestate/webapp/static/app.js,node --check src/realestate/webapp/static/watchlist_logic.js-> 통과 - 전체 검증:
python -m pytest -q-> 243 passed, 2 warnings - 투자 현황판:
python -m realestate.cli invest-board->reports/investment_board.html재생성 - whitespace:
git diff --check-> 오류 없음(CRLF 안내만 출력)
가정
- 실제 가격·전세·분담금은 사용자가 입력하거나 수집기가 반환한 명시값만 사용한다.
metric_collector는 후속 네이버·국토부·법원 수집기 연결을 위한 내부 계약이다.- 원본 확인 여부는 수집기 또는 사용자가 명시해야 하며, 기본값은 원본 미확인이다.
한계·미확인
- 이번 구현은 네이버부동산, 국토부, 법원경매 원본을 새로 호출하지 않았다.
metric_collector가 없는 운영 환경에서는 실데이터 갱신 버튼/API가 503으로 실패한다.- 재개발·재건축 분담금은 조합·정비계획·관리처분 원본 확인 전까지 추정 또는 미검증 값이다.
- 경매 가격·권리 정보는 매각물건명세서·등기부·임차인 현황 원본 확인 없이는 하한선 스크리닝이다.
원문 Markdown: docs/analysis/2026-08-11-종합부동산웹앱-1-2-3단계-통합구현.md