MSG-490 feat: [웹] AI 경로추천 실보행 경로 — walk-paths 점진 렌더·세그먼트 폴백·실거리 표기 - #106
Conversation
…-paths # Conflicts: # docs/STATUS.md # docs/decisions/DECISIONS.md
|
Claude finished @gyuhochoime's task in 5m 1s —— View job ✅ 코드 리뷰 완료작업 목록
결과: 🔴(반드시 수정) 없음. |
|
React Doctor found no new issues. 🎉 Reviewed by React Doctor for commit |
| ordered.slice(1).forEach((to, index) => { | ||
| const from = ordered[index]; | ||
| const segment = segments[index]; | ||
| if (segment?.resolved === true && segment.path !== null) { |
There was a problem hiding this comment.
🟡 권장: segment.resolved === true인데 segment.path가 빈 배열([])인 경우를 방어하지 않습니다.
route-legs.ts:117-120의 동일한 판정 지점은 resolved === true여도 distanceMeters !== null까지 함께 확인해 방어적으로 폴백합니다:
const walked =
segment?.resolved === true && segment.distanceMeters !== null
? segment.distanceMeters
: null;반면 여기는 segment.path !== null만 확인하고 길이는 보지 않습니다. 서버가 resolved: true인데 path: []를 내려주는 경우(계약 위반이지만 완전히 배제할 수는 없음) for...of가 아무것도 push하지 않아 해당 구간이 통째로 빠지고, 앞뒤 구간이 직접 이어지며 지도에 눈에 띄는 "끊김/직선 점프"가 생깁니다. 다른 모든 폴백 경로(미해결, 개수 불일치 등)는 "무조건 뭔가 그려진다"를 보장하는데 이 경로만 예외입니다.
제안:
if (segment?.resolved === true && segment.path !== null && segment.path.length > 0) {
for (const { lat, lng } of segment.path) pushPoint(path, { lat, lng });
return;
}확신은 못 하지만(서버가 실제로 이 값을 보낼지는 추측), route-legs.ts와의 방어 수준을 맞추는 게 안전할 것 같습니다.
| /** 마지막 점과 같은 좌표는 싣지 않는다 — 세그먼트 접점 중복 1개를 합치는 자리 (Q8) */ | ||
| const pushPoint = (path: LatLng[], point: LatLng) => { | ||
| const last = path[path.length - 1]; | ||
| if (last && last.lat === point.lat && last.lng === point.lng) return; |
There was a problem hiding this comment.
🟢 사소한 제안 (추측): pushPoint의 접점 중복 제거가 부동소수점 완전 일치(===)에 의존합니다.
세그먼트 경계(이전 세그먼트의 마지막 좌표 vs 다음 세그먼트의 시작 좌표, 또는 resolved→unresolved 전환 시 from 좌표)가 실수 연산을 거쳐 미세하게 달라지면(예: 서버가 TMap 스냅 좌표를 돌려주는 경우) 중복 제거가 실패해 두 점이 겹치듯 아주 가깝게 찍히는 정도의 영향이라 실사용상 육안으로는 거의 티가 안 날 수 있습니다. 다만 요청 좌표를 그대로 에코하는 것이 아니라 서버가 도로에 스냅한 좌표를 돌려주는 계약이라면, 접점에서 미세한 지그재그가 남을 수 있습니다. S7 검증에서 실측으로 확인된 부분이라 실제로는 문제없을 가능성이 높다고 봅니다 — 참고용으로만 남깁니다.
🔍 코드 리뷰 요약 — MSG-490 walk-paths 실보행 경로전체 평가: 완성도가 높은 PR입니다. 잘한 점
발견한 이슈 (인라인 코멘트 참고)
확인했으나 문제없다고 판단한 부분 (추측 아님, 직접 추적 확인)
전반적으로 프로덕션 반영에 무리가 없어 보이는 PR입니다. 위 🟡 항목은 서버 계약이 실제로 깨질 가능성이 낮다면 선택적으로 반영해도 무방합니다. |
|
리뷰 반영 (e89a925)
근거 상세는 |
|
Claude finished @gyuhochoime's task in 2m 7s —— View job 🔍 코드 리뷰 완료 — MSG-490 walk-paths (후속 커밋 e89a925)작업 목록
이번 트리거는 이전 리뷰 이후 추가된 커밋 ✅ 이전 🟡 지적 사항 — 정확히 반영 확인
if (
segment?.resolved === true &&
segment.path !== null &&
segment.path.length > 0
) {
🟢 이전 지적 사항 — 기각 근거 확인 (문제없음)접점 부동소수점 dedup( 재검토 결과
|
🎫 관련 티켓
📌 작업 내용
경로 추천 결과의 지점 사이 선을 직선에서 실제 걷는 길로 교체합니다 (
POST /api/routes/walk-paths).resolved:true세그먼트만path좌표열로 교체, 커넥터 "도보 약 Nm"도 서버distanceMeters로 갱신(같은formatWalkDistance규칙)resolved:false·요청 실패(400/503/네트워크/401)는 직선·직선 거리 유지의 조용한 폴백 — 에러 UI 0,retry: falsestaleTime/gcTime: Infinity가 세션 유지 + 섹션 왕복 재요청 0회를 겸함(로그아웃 시QueryProvider.clear()로 세션 경계 일치)route-line-walkpath실측이#34C7594px 실선 = 현재 직선 스타일과 동일 →MapCanvas·map-overlay-store·MapShell·RouteWalkConnector미접촉.alignWalkSegments(개수 불일치 시 통째 폐기 +originOffset)를 legs·overlay가 공유해 "거리는 실거리·선은 직선" 불일치 차단MSG-488.md§4-2) — 승인된 표 이탈 1건만(use-ai-route-overlay-publish.ts, 489도 미접촉). 489 머지(0477869)를 이 브랜치에 머지 완료 — 코드 충돌 0, 문서 2개만 append 경합 해소, 머지 후 전 게이트 재통과✅ 체크리스트
pnpm lint/pnpm typecheck/pnpm --filter web test run통과docs/STATUS.md·docs/spec/MSG-490.md·docs/decisions/DECISIONS.md🔍 검증 요약
최종 판정: 수용 기준 25개 전건 통과 (로직 17 + 화면 8), 실패 0, 확인불가 0
nose.baseline.json0줄openapi-ts후 diff 0줄 (웨이브 0 스냅샷에 walk-paths 기포함, 재생성 0회)pnpm build로직 (L1~L17 + R6) — 전건 통과. 검증자가 뮤테이션 검증(구현을 일부러 깨뜨려 테스트가 FAIL하는지)을 수행: 최초 회차에서 L14(
enabled가드)·L15(retry: false)가 뮤테이션에도 통과해 테스트가 회귀를 못 잡는 것을 적발 → 재작업 1회(프로덕션 0줄, 테스트 단정만 교체) 후 재검증에서 뮤테이션 A/B/B2 각각 해당 케이스만 국소 FAIL 확인.화면 (S1~S8, 3-A 브라우저 실측) — 전건 통과:
resolved:false조작 → 단일 폴리라인에 직선·도로 구간 공존[role="alert"]0·재시도 0stroke:#34C759; stroke-width:4px실선 path 정확히 1개segments길이 N−1 3회 일치(6→5·7→6·8→7)resolved:true존재) 확인 후 판정codex 리뷰(push 전): P2 1건("walk 도착 시 clear→재게시 깜빡임") — 기각. S1 실측(빈 상태 0회) + React 18 배칭(cleanup·setup 같은 flush, 한 커밋) + 488 선례(
selectedOrder변경마다 동일 패턴, 잔상 0)로 반증. 근거는docs/spec/MSG-490.md작업 로그.💡 추가 논의할 사항
resolved:false를 돌려줍니다("도보 약 0m" 표기 — 사양). 실거리/추정 구분 표기(Q2, 디자인에 변형 노드 없음) 후속 논의 시 실측 근거.originOffset파라미터·L7 테스트가 예비 기반입니다(origin 좌표 보관부터 필요).🤖 Generated with Claude Code
https://claude.ai/code/session_012uAZNzH4J6LYbwRSqGLxnf