Back to software-development
software-development 1 min read 45 lines

d3-layout-debugging

D3.js 레이아웃 전환 시 발생하는 흔한 버그와 해결법 — forceLink mutation, .call(null) chain 끊김, zoom 보존 등

D3.js Layout Debugging

핵심 레슨: D3 selection chain에서 .call(null)은 에러 발생

D3 selection의 .call() 메서드에 null을 전달하면 TypeError가 발생하고, 이후의 전체 chain이 실패합니다.

// ❌ BAD — null이면 chain 끊김
nodeGroups.call(layout === 'force' ? d3.drag() : null)

// ✅ GOOD — 조건부로 call
if (layout === 'force') {
nodeGroups.call(d3.drag())
}

forceLink mutation 문제

d3.forceLink()가 links 배열의 source/target을 in-place로 id에서 node 객체로 변경합니다. 레이아웃 전환 시 원본 데이터가 망가집니다.

// ❌ BAD — 원본 links를 직접 전달
const linkForce = d3.forceLink(originalLinks).id(d => d.id)

// ✅ GOOD — 복사본 사용
const linkCopy = JSON.parse(JSON.stringify(links))
const linkForce = d3.forceLink(linkCopy).id(d => d.id)

SVG 전체 지우기 시 주의사항

svg.selectAll('*').remove(), zoom behavior, 필터 등을 모두 지웁니다. 렌더링 함수에서 매번 재생성해야 합니다.

GitHub API Rate Limit

  • 비인증: 시간당 60회
  • PAT 토큰: 시간당 5,000회
  • Rate limit 리셋은 엄격히 1시간 후
  • gh api rate_limit으로 확인 가능
  • Vercel 서버 IP와 로컬 gh CLI는 별도 할당량

Related Skills / 관련 스킬

plan

Hermes 플랜 모드 — 컨텍스트 검사, 마크다운 계획 작성, 실행하지 않음

requesting-code-review

사전 커밋 검증 파이프라인 — 정적 보안 스캔, 린팅, 테스트 실행

subagent-driven-development

독립 태스크별 delegate_task 분배 — 2단계 리뷰(사양 준수 + 코드 품질)

systematic-debugging

4단계 근원 원인 조사 — 버그/테스트 실패/예상치 못한 동작 분석