generated from ttipo/project-base
feat(backend): 상가정보 데이트 업종 적재 명령 추가
`npm run place:sync -- store [--signgu=...]` 로 소상공인 상가정보의 데이트 업종 6개(카페·빵/도넛·아이스크림/빙수·샌드위치/샐러드·요리 주점·생맥주)를 장소 DB 에 적재한다. 기본 범위는 1차 큐레이션 동네가 속한 대구 중구·남구·수성구다. - 분기마다 다시 실행하면, 끝까지 받은 (시군구, 업종) 묶음에서 사라진 업소를 gone(폐업 추정)으로 숨긴다. 지우지 않고, 결과가 기존의 80% 미만이면 건너뛴다 - 기준년월(stdrYm)을 source_snapshot 에 남긴다 - 공공데이터포털 공통 규칙(키 가림·간격·재시도·한도)을 PublicDataClient 로 묶어 관광공사·상가정보 클라이언트가 함께 쓴다(TourApiFactory → PublicDataApiFactory) 2026-11-02 대구 실측: 기준 2026-09, 3,776곳(18회 호출). 세 동네 반경 안 업소 수는 후보표(반경 API)와 거의 같다(도심 1,295/1,316 · 수성못 425/425 · 앞산 262/263). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
# 장소 DB 설계 (v1.2, 2026-11-02)
|
||||
# 장소 DB 설계 (v1.3, 2026-11-02)
|
||||
|
||||
WanderGo 의 장소·축제 데이터를 어떻게 저장하고, 갱신하고, 앱에 노출하는지 정한다.
|
||||
1단계(엔티티·마이그레이션)와 2단계(관광공사 국문·반려동물 동기화 명령)를 구현했다 — `backend/src/modules/place/`, `backend/src/commands/place-sync.ts`, `backend/src/migrations/`.
|
||||
1단계(엔티티·마이그레이션)와 2·3단계(관광공사 국문·반려동물·상가정보 동기화 명령)를 구현했다 — `backend/src/modules/place/`, `backend/src/commands/place-sync.ts`, `backend/src/migrations/`.
|
||||
이 문서와 코드가 다르면 코드가 기준이다. 바꿀 때는 이 문서도 함께 고친다.
|
||||
|
||||
## 0. 전제 (이미 정한 것)
|
||||
@@ -238,13 +238,14 @@ erDiagram
|
||||
- 비표출 레코드는 법정동이 비어 있으므로 비표출 확인은 지역 필터 없이 한다(매뉴얼 검토 노트).
|
||||
- 동기화는 `place` 만 쓴다. `place_curation` 은 읽지도 쓰지도 않는다.
|
||||
|
||||
### 4.1 실행 방법 (구현됨: 관광공사 국문·반려동물)
|
||||
### 4.1 실행 방법 (구현됨: 관광공사 국문·반려동물·상가정보)
|
||||
|
||||
```bash
|
||||
# 개발 — 키가 있는 백엔드 컨테이너 안에서 (dc = docker compose -f docker-compose.yml -f docker-compose.dev.yml --env-file .env.development)
|
||||
dc exec backend npm run migration:run # 스키마 먼저
|
||||
dc exec backend npm run place:sync -- tour-kor # 대구(27) 목록 → 상세. 한도에 닿으면 멈춘다
|
||||
dc exec backend npm run place:sync -- tour-pet # 반려동물 동반 정보(약 10회)
|
||||
dc exec backend npm run place:sync -- store # 상가정보 데이트 업종(대구 중구·남구·수성구, 30회 안팎). 분기마다
|
||||
dc exec backend npm run place:sync -- status # 적재 현황·오늘 쓴 호출 수
|
||||
# 다음 날 같은 tour-kor 명령을 다시 실행하면 남은 상세를 이어서 받는다
|
||||
|
||||
@@ -257,6 +258,10 @@ node dist/commands/place-sync.js tour-kor
|
||||
- 상세는 nature → attraction → culture → cafe → food … 순서로 받는다(이틀에 나뉘어도 앱에 먼저 필요한 것부터).
|
||||
- 목록을 끝까지 받았을 때만 사라진 장소를 숨기고, 목록이 기존 노출 장소의 80% 미만이면 원본 장애로 보고 숨기지 않는다.
|
||||
- 원본 수정일(modifiedtime)이 바뀐 장소는 `detail_synced_at` 을 비워 상세를 다시 받는다.
|
||||
- 상가정보는 `storeListInDong`(divId=signguCd, 소분류 업종 필터)로 시군구 × 데이트 업종 6개를 받는다(`--signgu=` 로 범위 변경).
|
||||
끝까지 받은 (시군구, 업종) 묶음에서만 이번에 보이지 않은 업소를 `gone`(폐업 추정)으로 바꾸고, 결과가 기존의 80% 미만이면 건너뛴다.
|
||||
업종이 바뀐 업소(예: 카페 → 빵집)는 같은 bizesId 로 갱신되어 그대로 노출된다. 기준년월(stdrYm)은 `source_snapshot` 에 남긴다.
|
||||
- 2026-11-02 임시 DB + 가짜 상가정보 API 로 확인: 첫 적재 → 다음 분기 폐업 추정·업종 변경·신규 → 급감 시 폐업 처리 건너뜀 → 한도 0 이면 아무것도 바꾸지 않음.
|
||||
- 2026-11-02 임시 DB + 가짜 API 로 확인한 흐름: 한도 3회로 멈춤 → 같은 날 재실행 시 추가 호출 없음 → 다음 날 이어받기 → 수정 1곳만 재조회·사라진 1곳 숨김 → 반려동물 반영.
|
||||
|
||||
## 5. 위치 검색
|
||||
@@ -304,7 +309,7 @@ node dist/commands/place-sync.js tour-kor
|
||||
|
||||
1. ✅ 엔티티 + 마이그레이션: `place`, `place_curation`, `place_i18n`, `festival_event`, `place_sync_run`, `place_listing` 뷰 (2026-11-02)
|
||||
2. ✅ 관광공사 국문 적재 명령(대구) + 반려동물 동기화 + 현황 명령 (2026-11-02, 실제 적재는 개발 계정으로 2일)
|
||||
3. 상가정보 적재 명령(대상 행정동)
|
||||
3. ✅ 상가정보 적재 명령(대구 중구·남구·수성구 데이트 업종) (2026-11-02)
|
||||
4. 큐레이션 CSV 가져오기 명령(미리보기 → 반영)
|
||||
5. 조회 API: `GET /api/places`(검색·필터·커서 페이지네이션), `GET /api/places/{id}`, `GET /api/events`
|
||||
6. 일·주·분기 동기화 + 폐업 대조
|
||||
|
||||
Reference in New Issue
Block a user