fix(backend): 원본 좌표 오류 장소 제외 · 관광공사 사진 https · KOPIS 일정변경 중복 정리 #6

Merged
ttipo merged 3 commits from fix/place-data-cleanup into main 2026-11-05 15:34:16 +09:00
Owner

무엇을 · 왜

2026-11-04 회귀 점검에서 남긴 원본 데이터 문제를 동기화 단계에서 정리한다. 세 가지 모두 다음 동기화부터 적용된다.

  • 좌표가 실제 위치가 아닌 관광공사 장소를 받지 않음
    • 오천서원: 주소는 대구 수성구인데 좌표는 포항이다.
    • 대구올레 팔공산 3·4·5코스: 주소·좌표 모두 운영 사무실(수성구)이라 김광석길에서 '도보 7분'으로 보였다.
    • 좌표가 주소(없으면 법정동 코드)의 시·도 밖이면 받지 않는다(geo.ts isInSido 재사용).
    • 시·도 검사로 못 거르는 곳은 확인한 contentid 목록(TOUR_WRONG_LOCATION_IDS)으로 받지 않는다.
    • 이미 있던 장소는 목록을 끝까지 받은 뒤 숨겨진다.
    • 관광공사 장소 1,174곳에 미리 적용해 이 4곳만 걸리는 것을 확인했다.
  • 관광공사 사진 주소를 https 로
    • 장소 사진 1,059건 중 279건이 http 였다. 같은 서버(tong.visitkorea.or.kr)가 https 로도 준다.
    • 앱은 http 사진도 받지만 웹(https 페이지)에서는 혼합 콘텐츠로 막힌다.
    • 장소·행사 모두 저장할 때 바꾼다. 확인하지 않은 다른 서버는 그대로 둔다.
  • KOPIS 일정변경 재등록 중복
    • KOPIS 는 일정이 바뀐 공연 제목에 "[일정변경]" 을 붙이고 새 id 로 다시 등록한다. 그래서 같은 공연이 두 번 보였다(고령 남진 콘서트).
    • 제목 앞의 알림은 떼고, 같은 공연장·같은 기간·같은 제목이면 먼저 등록된 것만 남긴다.
    • 문화포털 전시의 "제목 6글자 이상 겹침" 기준은 공연에 쓰지 않는다.
      처음 적용했을 때 음악제 이름이 같은 같은 날 다른 공연("포항국제음악제, …")을 합쳐 버렸다.

확인 방법

cd backend
npm run lint && npm run test
docker exec -w /app wandergo-backend npx jest --config ./test/jest-e2e.json test/kopis-sync.e2e-spec.ts test/place.e2e-spec.ts test/festival.e2e-spec.ts
# 개발 DB 반영(키 필요)
docker exec wandergo-backend npm run place:sync -- tour-kor --skip-details
docker exec wandergo-backend npm run place:sync -- kopis
  • 린트 Warning 0, 단위 테스트 235개 통과(새로 8개 — 좌표 2 · 사진 주소 2 · 제목 정리 2 · 공연 중복 기준 2)
  • e2e(KOPIS·장소·행사) 38개 통과 — 일정변경 중복은 숨기고, 음악제 이름만 같은 다른 공연은 남긴다
  • 개발 DB 에 반영해 확인했다
    • tour-kor --skip-details: 숨김 4(시·도 불일치 1, 실제 위치 아님 3), 관광공사 사진 1,055곳 https
      (http 로 남은 4곳은 숨긴 장소)
    • kopis: 남진 콘서트 1건만 남고 제목 정리, 포항국제음악제 11/10 공연 2건 모두 노출
    • API: 김광석길 함께 가기 좋은 곳에서 대구올레 코스가 빠졌다. "오천서원" 검색 0건

영향 범위

  • backend
  • frontend
  • flutter
  • docker / 인프라
  • 규칙 문서(.claude/)

공유 계약 변경 없음(동기화 규칙만 바뀌었다). 설계 문서 docs/design/place-db.md 에 세 규칙과 사례를 적었다.

체크리스트

  • 린트/분석 통과 (Warning 0) · 변경 영역 테스트 통과
  • 주석 한국어, 매직 넘버·하드코딩 문자열 없음
  • 사용자 노출 실패는 모두 에러 코드와 함께 처리 — 해당 없음
  • 에러 코드를 바꿨다면 npm run sync:error-codes 실행 후 생성 파일까지 커밋 — 해당 없음
  • 민감정보 미커밋
  • 로그에 비밀번호·토큰·요청 본문 전체가 남지 않음

🤖 Generated with Claude Code

## 무엇을 · 왜 2026-11-04 회귀 점검에서 남긴 원본 데이터 문제를 동기화 단계에서 정리한다. 세 가지 모두 다음 동기화부터 적용된다. - **좌표가 실제 위치가 아닌 관광공사 장소를 받지 않음** - 오천서원: 주소는 대구 수성구인데 좌표는 포항이다. - 대구올레 팔공산 3·4·5코스: 주소·좌표 모두 운영 사무실(수성구)이라 김광석길에서 '도보 7분'으로 보였다. - 좌표가 주소(없으면 법정동 코드)의 시·도 밖이면 받지 않는다(`geo.ts` `isInSido` 재사용). - 시·도 검사로 못 거르는 곳은 확인한 contentid 목록(`TOUR_WRONG_LOCATION_IDS`)으로 받지 않는다. - 이미 있던 장소는 목록을 끝까지 받은 뒤 숨겨진다. - 관광공사 장소 1,174곳에 미리 적용해 이 4곳만 걸리는 것을 확인했다. - **관광공사 사진 주소를 https 로** - 장소 사진 1,059건 중 279건이 http 였다. 같은 서버(`tong.visitkorea.or.kr`)가 https 로도 준다. - 앱은 http 사진도 받지만 웹(https 페이지)에서는 혼합 콘텐츠로 막힌다. - 장소·행사 모두 저장할 때 바꾼다. 확인하지 않은 다른 서버는 그대로 둔다. - **KOPIS 일정변경 재등록 중복** - KOPIS 는 일정이 바뀐 공연 제목에 "[일정변경]" 을 붙이고 새 id 로 다시 등록한다. 그래서 같은 공연이 두 번 보였다(고령 남진 콘서트). - 제목 앞의 알림은 떼고, 같은 공연장·같은 기간·같은 제목이면 먼저 등록된 것만 남긴다. - 문화포털 전시의 "제목 6글자 이상 겹침" 기준은 공연에 쓰지 않는다. 처음 적용했을 때 음악제 이름이 같은 같은 날 다른 공연("포항국제음악제, …")을 합쳐 버렸다. ## 확인 방법 ```bash cd backend npm run lint && npm run test docker exec -w /app wandergo-backend npx jest --config ./test/jest-e2e.json test/kopis-sync.e2e-spec.ts test/place.e2e-spec.ts test/festival.e2e-spec.ts # 개발 DB 반영(키 필요) docker exec wandergo-backend npm run place:sync -- tour-kor --skip-details docker exec wandergo-backend npm run place:sync -- kopis ``` - 린트 Warning 0, 단위 테스트 235개 통과(새로 8개 — 좌표 2 · 사진 주소 2 · 제목 정리 2 · 공연 중복 기준 2) - e2e(KOPIS·장소·행사) 38개 통과 — 일정변경 중복은 숨기고, 음악제 이름만 같은 다른 공연은 남긴다 - 개발 DB 에 반영해 확인했다 - `tour-kor --skip-details`: 숨김 4(시·도 불일치 1, 실제 위치 아님 3), 관광공사 사진 1,055곳 https (http 로 남은 4곳은 숨긴 장소) - `kopis`: 남진 콘서트 1건만 남고 제목 정리, 포항국제음악제 11/10 공연 2건 모두 노출 - API: 김광석길 함께 가기 좋은 곳에서 대구올레 코스가 빠졌다. "오천서원" 검색 0건 ## 영향 범위 - [x] backend - [ ] frontend - [ ] flutter - [ ] docker / 인프라 - [ ] 규칙 문서(.claude/) > 공유 계약 변경 없음(동기화 규칙만 바뀌었다). 설계 문서 `docs/design/place-db.md` 에 세 규칙과 사례를 적었다. ## 체크리스트 - [x] 린트/분석 통과 (Warning 0) · 변경 영역 테스트 통과 - [x] 주석 한국어, 매직 넘버·하드코딩 문자열 없음 - [x] 사용자 노출 실패는 모두 에러 코드와 함께 처리 — 해당 없음 - [x] 에러 코드를 바꿨다면 `npm run sync:error-codes` 실행 후 생성 파일까지 커밋 — 해당 없음 - [x] 민감정보 미커밋 - [x] 로그에 비밀번호·토큰·요청 본문 전체가 남지 않음 🤖 Generated with [Claude Code](https://claude.com/claude-code)
ttipo added 3 commits 2026-11-05 13:41:14 +09:00
관광공사 원본 좌표가 실제 위치가 아닌 장소가 거리·지도에 엉뚱하게 나왔다(2026-11-04 회귀 점검).
- 오천서원: 주소는 대구 수성구인데 좌표는 포항이라 대구 목록에 70km 떨어진 곳으로 나왔다
- 대구올레 팔공산 3·4·5코스: 주소·좌표 모두 운영 사무실(수성구)이라 김광석길에서 '도보 7분'으로 보였다

좌표가 주소(없으면 법정동 코드)의 시·도 밖이면 받지 않는다(geo.ts isInSido 재사용).
시·도 검사로 못 거르는 곳은 확인한 contentid 목록(TOUR_WRONG_LOCATION_IDS)으로 받지 않는다.
이미 있던 장소는 목록을 끝까지 받은 뒤 숨겨진다. 관광공사 장소 1,174곳에 적용해 이 4곳만 걸리는 것을 확인했고,
개발 DB 는 tour-kor --skip-details 로 반영했다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
관광공사 장소 사진 1,059건 중 279건이 http 였다. 같은 서버(tong.visitkorea.or.kr)가 https 로도 주므로
저장할 때 https 로 바꾼다(장소·행사 모두). 앱은 http 사진도 받지만 웹(https 페이지)에서는 혼합 콘텐츠로 막힌다.
확인하지 않은 다른 서버의 주소는 그대로 둔다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fix(backend): KOPIS 에 일정변경으로 다시 등록된 같은 공연을 하나로 합침
CI / Backend (lint · test · e2e · build) (pull_request) Successful in 12m7s
CI / Frontend (lint · type-check · test) (pull_request) Successful in 10m52s
CI / 에러 코드 SSOT 동기화 검사 (pull_request) Successful in 11m21s
CI / Frontend (lint · type-check · test) (push) Has been cancelled
CI / 에러 코드 SSOT 동기화 검사 (push) Has been cancelled
CI / Backend (lint · test · e2e · build) (push) Has been cancelled
90d41f0e6d
KOPIS 는 일정이 바뀐 공연 제목에 "[일정변경]" 을 붙이고 새 id 로 다시 등록한다. 그래서 같은 공연장·같은 날
같은 공연이 두 번 보였다(2026-11-04 회귀 점검: 고령 남진 콘서트).
- 제목 앞의 "[일정변경]" 은 뗀다(화면에는 바뀐 날짜가 이미 보인다)
- 같은 공연장·같은 기간·같은 제목이면 먼저 등록된 것만 남기고 나머지는 숨긴다

문화포털 전시에 쓰는 "제목 6글자 이상 겹침" 기준은 공연에 쓰지 않는다. 처음 적용했을 때 음악제 이름을 앞에 붙인
같은 날 다른 공연("포항국제음악제, …" 두 공연)을 합쳐 버려서, 제목이 같을 때만 합치게 했다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ttipo merged commit 90d41f0e6d into main 2026-11-05 15:34:16 +09:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ttipo/wandergo#6