From f17ba9e37a535cbc1b915f2867f7b13291f59859 Mon Sep 17 00:00:00 2001 From: joungmin Date: Tue, 16 Jun 2026 06:25:47 +0900 Subject: [PATCH] =?UTF-8?q?feat(map):=20#363=20=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EC=A7=80=EB=8F=84=20SDK=20=EA=B5=AD=EB=82=B4(=EB=84=A4?= =?UTF-8?q?=EC=9D=B4=EB=B2=84)/=ED=95=B4=EC=99=B8(=EA=B5=AC=EA=B8=80)=20?= =?UTF-8?q?=EB=B6=84=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MapView dispatcher: NAVER 키 + KR bbox 좌표 → NaverMapView - NaverMapView 신규 (네이버 v3 직접 wrapper, Supercluster 재사용) - GoogleMapView 신규 (기존 MapView 내용 rename) - MapView.types.ts 공용 타입 + isKoreaCoord 헬퍼 - Dockerfile/deploy.sh: NEXT_PUBLIC_NAVER_MAP_CLIENT_ID build-arg - 키 미설정 시 GoogleMap fallback (회귀 0) Refs: #363 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.7 --- CHANGELOG.md | 10 + deploy.sh | 3 + docs/design/363-map-sdk-branch/README.md | 84 +++++ frontend/Dockerfile | 1 + frontend/src/components/GoogleMapView.tsx | 395 ++++++++++++++++++++ frontend/src/components/MapView.tsx | 433 ++-------------------- frontend/src/components/MapView.types.ts | 29 ++ frontend/src/components/NaverMapView.tsx | 225 +++++++++++ 8 files changed, 774 insertions(+), 406 deletions(-) create mode 100644 docs/design/363-map-sdk-branch/README.md create mode 100644 frontend/src/components/GoogleMapView.tsx create mode 100644 frontend/src/components/MapView.types.ts create mode 100644 frontend/src/components/NaverMapView.tsx diff --git a/CHANGELOG.md b/CHANGELOG.md index 61fd2a4..fa5fab7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,16 @@ ## 2026-06-16 +### 🗺️ #363 메인 지도 SDK 국내(네이버)/해외(구글) 분기 (v0.1.52) +- MapView를 dispatcher로 전환: 좌표가 KR bbox + NAVER_MAP_CLIENT_ID 설정 시 NaverMapView, 그 외 GoogleMapView +- NaverMapView 신규 (네이버 v3 직접 wrapper, Supercluster 재사용, 마커/클러스터/flyTo) +- GoogleMapView 신규 (기존 MapView 내용 rename) +- MapView.types.ts 공용 (MapBounds/FlyTo/MapViewProps + isKoreaCoord) +- Dockerfile + deploy.sh: NEXT_PUBLIC_NAVER_MAP_CLIENT_ID build-arg 추가 +- 키 미설정 시 GoogleMap fallback (회귀 0) +- 설계서: docs/design/363-map-sdk-branch/README.md +- Refs: #363 + ### 🗺️ 식당 상세 지도 링크 국내/해외 분기 (v0.1.51) - 좌표 기반 한국 판정 (WGS84 KR bbox 33~38.7°N, 124~132°E) - 국내: 네이버 지도 primary + Google Maps 보조 (네이버 URL은 신 도메인 /p/search/) diff --git a/deploy.sh b/deploy.sh index 1817b3d..3357092 100755 --- a/deploy.sh +++ b/deploy.sh @@ -62,15 +62,18 @@ if [[ "$TARGET" == "all" || "$TARGET" == "frontend" ]]; then # Read build args from env or .env file MAPS_KEY="${NEXT_PUBLIC_GOOGLE_MAPS_API_KEY:-}" CLIENT_ID="${NEXT_PUBLIC_GOOGLE_CLIENT_ID:-}" + NAVER_MAP_ID="${NEXT_PUBLIC_NAVER_MAP_CLIENT_ID:-}" if [[ -f frontend/.env.local ]]; then MAPS_KEY="${MAPS_KEY:-$(grep NEXT_PUBLIC_GOOGLE_MAPS_API_KEY frontend/.env.local 2>/dev/null | cut -d= -f2)}" CLIENT_ID="${CLIENT_ID:-$(grep NEXT_PUBLIC_GOOGLE_CLIENT_ID frontend/.env.local 2>/dev/null | cut -d= -f2)}" + NAVER_MAP_ID="${NAVER_MAP_ID:-$(grep NEXT_PUBLIC_NAVER_MAP_CLIENT_ID frontend/.env.local 2>/dev/null | cut -d= -f2)}" fi docker build --platform "$PLATFORM" \ --build-arg NEXT_PUBLIC_GOOGLE_MAPS_API_KEY="$MAPS_KEY" \ --build-arg NEXT_PUBLIC_GOOGLE_CLIENT_ID="$CLIENT_ID" \ + --build-arg NEXT_PUBLIC_NAVER_MAP_CLIENT_ID="$NAVER_MAP_ID" \ -t "$REGISTRY/frontend:$TAG" \ -t "$REGISTRY/frontend:latest" \ frontend/ diff --git a/docs/design/363-map-sdk-branch/README.md b/docs/design/363-map-sdk-branch/README.md new file mode 100644 index 0000000..17bd618 --- /dev/null +++ b/docs/design/363-map-sdk-branch/README.md @@ -0,0 +1,84 @@ +# 설계서: 메인 지도 탭 SDK 국내/해외 분기 (#363) + +> **상태**: Approved +> **작성**: [AI] Architect · **최종수정**: 2026-06-16 +> **추적성** — Redmine: #363 · 부모: v0.1.51 1단계(외부 링크 분기) · 관련: MapView.tsx, mobile nearby +> · 구현 파일: `frontend/src/components/MapView.tsx`(dispatcher), `frontend/src/components/GoogleMapView.tsx`(rename from 기존 MapView 내용), `frontend/src/components/NaverMapView.tsx`(신규), `frontend/src/lib/map-utils.ts`(공용 헬퍼) +> · 테스트: 본 범위 밖 (수동 — dev 브라우저 검증) + +## 1. 목적 (Why) + +현재 MapView는 `@vis.gl/react-google-maps` 단일 사용. 한국 식당은 네이버 지도가 지번/도로명/상호/길찾기에서 압도적으로 정확. 메인 지도 탭 자체를 국내/해외 분기. + +## 2. 범위 + +- 포함: MapView를 dispatcher로 전환, 좌표 기반 자동 분기(KR bbox), 네이버 키 미설정 시 GoogleMap fallback. +- 제외 (별도 후속): 사용자 강제 토글 UI, mixed 화면(한국+해외 동시) 최적화, 모바일 nearby도 동일 분기는 1차 적용 후 검토. + +## 3. 인수조건 + +- [ ] `NEXT_PUBLIC_NAVER_MAP_CLIENT_ID` 환경변수 설정 + 화면 중심이 KR bbox 안이면 NaverMap 렌더. +- [ ] 키 미설정 또는 화면이 KR 밖이면 GoogleMap 렌더 (현행 동일). +- [ ] Supercluster + 클러스터/단일 마커 표시, 클릭 → onSelectRestaurant 콜백 동일. +- [ ] flyTo, onBoundsChanged, 내 위치, 채널 색상 동일하게 동작. +- [ ] 빌드/타입 회귀 없음. + +## 4. 컨텍스트 & 제약 + +- 네이버 지도 v3: `https://oapi.map.naver.com/openapi/v3/maps.js?ncpClientId=` 스크립트 로드. +- 네이버 좌표계: 기본 WGS84 (`naver.maps.LatLng(lat, lng)`). +- 직접 wrapper 채택 (react-naver-maps 의존성 제거 — 메인터넌스 리스크). +- Supercluster는 SDK 독립이라 재사용. +- KR bbox: 위도 33~38.7, 경도 124~132. 화면 중심좌표가 안에 있으면 한국. + +## 5. 아키텍처 개요 + +``` +MapView (dispatcher) + │ + ├─ 화면 중심 좌표가 KR bbox AND 네이버 키 있음 → NaverMapView + │ ├─