D3.js로 네트워크 그래프 그리기

D3.js란?

d3/API.md at main · d3/d3

d3.forceSimulation

const simulation = d3
  .forceSimulation(nodes)
  .force('charge', d3.forceManyBody().strength(-200).distanceMax(200))
  .force('center', d3.forceCenter(centerX, centerY))
  .force(
    'link',
    d3.forceLink(links).id((d) => d.key),
  )
  .on('tick', () => {
		drawNodes(); // node 그리기
		drawLinks(); // link 그리기
  });

nodes, links 그리기

react에서 D3.js 사용하기

function Graph({ nodes, links }) {
	const linkRef = useRef<SVGGElement | null>(null);
  const nodeRef = useRef<SVGGElement | null>(null);
	
	const drawLinks = useCallback(() => {
		/* link 그리기 */
	}, [linkRef])
	const drawNodes = useCallback(() => {
		/* node 그리기 */
	}, [nodeRef])

	useEffect(() => {
		const simulation = d3
	    .forceSimulation(nodes)
	    .force(
	      'link',
	      d3.forceLink(links)
	    )
	    .on('tick', () => {
				drawNodes();
				drawLinks();
	    });

		return () => simulation.stop(); // unmount시 simulation 멈춤
	}, [links, nodes, drawLinks, drawNodes])

	return (
    <div>
      <svg>
        <g ref={linkRef}>
					<line stroke="white 1px" />
				</g>
        <g ref={nodeRef}>
					<path fill="yellow" />
				</g>
      </svg>
    </div>
  );
}

Web Worker로 성능 개선하기

Web Worker란?