React와 D3.js는 각각의 강점을 가진 라이브러리로, 함께 사용하면 강력한 데이터 시각화 솔루션을 만들 수 있습니다.
1. React와 D3.js의 역할 구분
React는 UI 컴포넌트와 상태 관리를 담당하며, D3.js는 복잡한 수학적 계산과 데이터 기반 변환을 처리합니다. React가 DOM을 관리하는 반면 D3는 데이터 시각화에 필요한 계산과 좌표 설정에 집중하도록 역할을 분담하는 것이 핵심입니다.
2. React에서 D3.js 활용하기
실무에서는 D3의 DOM 조작 기능을 최소한으로 사용하고, React의 JSX로 SVG 요소를 렌더링하면서 D3는 스케일, 축, 레이아웃 계산에 집중하게 합니다. 이렇게 하면 React의 선언적 UI 유지와 D3의 강력한 데이터 처리 능력을 모두 살릴 수 있습니다.
3. 간단한 예제: 바 차트 구현
다음은 React와 D3를 결합해 바 차트를 만드는 기본 코드 예제입니다.
import React from 'react';
import * as d3 from 'd3';
const BarChart = ({ data, width, height }) => {
const margin = { top: 20, right: 30, bottom: 30, left: 40 };
const x = d3.scaleBand()
.domain(data.map(d => d.name))
.range([margin.left, width - margin.right])
.padding(0.1);
const y = d3.scaleLinear()
.domain([0, d3.max(data, d => d.value)])
.nice()
.range([height - margin.bottom, margin.top]);
return (
<svg width={width} height={height}>
{data.map(d => (
<rect
key={d.name}
x={x(d.name)}
y={y(d.value)}
height={y(0) - y(d.value)}
width={x.bandwidth()}
fill="teal"
/>
))}
<g
transform={`translate(0,${height - margin.bottom})`}
fill="none"
fontSize={10}
fontFamily="sans-serif"
textAnchor="middle"
>
{data.map(d => (
<text key={d.name} x={x(d.name) + x.bandwidth() / 2} y={15}>
{d.name}
</text>
))}
</g>
<g
transform={`translate(${margin.left},0)`}
fill="none"
fontSize={10}
fontFamily="sans-serif"
textAnchor="end"
>
{y.ticks(5).map(tickValue => (
<g key={tickValue} transform={`translate(0,${y(tickValue)})`}>
<line x2={-6} stroke="black" />
<text x={-9} dy="0.32em">{tickValue}</text>
</g>
))}
</g>
</svg>
);
};
export default BarChart;4. 실무 팁
- React 컴포넌트가 업데이트 될 때마다 D3가 DOM을 직접 조작하지 않도록 주의하세요.
- 데이터 변경에 따라 스케일과 레이아웃을 D3로 계산하고, React는 JSX 렌더링에 집중합니다.
- 복잡한 시각화는 React 훅(예: useEffect)을 활용해 D3 작업을 격리해도 좋습니다.
이처럼 React와 D3.js를 적절히 분리해 사용하면 견고하고 유지 보수가 쉬운 데이터 시각화 컴포넌트를 만들 수 있습니다.
'React' 카테고리의 다른 글
| React에서 비동기 데이터 다중 병합 처리하기 (0) | 2026.05.30 |
|---|---|
| React 앱에서 이미지 필터 효과 적용하기 (0) | 2026.05.30 |
| React에서 오디오 플레이어 컴포넌트 만들기 (0) | 2026.05.29 |
| React 앱에서 테마 변경 기능 다중 지원하기 (0) | 2026.05.29 |
| React에서 사용자 프로필 편집 페이지 제작하기 (0) | 2026.05.29 |