차트와 그래프 구현하기, D3.js와 리액트의 연동을 통한 커스텀 그래프

리액트(React)는 사용자 인터페이스를 구축하기 위한 강력한 자바스크립트 라이브러리로, 컴포넌트 기반의 아키텍처를 통해 재사용 가능한 UI를 쉽게 만들 수 있습니다.
이와 함께 D3.js는 데이터를 기반으로 동적인 시각화를 가능하게 하는 자바스크립트 라이브러리입니다.
이번 강좌에서는 리액트와 D3.js를 사용하여 커스텀 차트와 그래프를 생성하는 방법에 대해 자세히 다룰 것입니다.
우리는 간단한 바 차트를 예로 들어 D3.js의 힘을 활용하여 데이터를 시각적으로 표현하는 방법을 알아보겠습니다.

1. 프로젝트 설정

먼저 리액트 프로젝트를 설정해야 합니다. Create React App을 사용하여 새로운 프로젝트를 생성할 수 있습니다. 다음 명령어를 사용하세요.

npx create-react-app my-d3-app

그 후, D3.js를 프로젝트에 추가합니다. 아래 명령어를 실행하여 D3.js를 설치합니다.

npm install d3

2. 기본 구조 만들기

우선, 기본적인 리액트 컴포넌트 구조를 만들어보겠습니다. src 폴더 안에 BarChart.js 파일을 생성하고 다음 코드를 작성합니다.


import React from 'react';
import * as d3 from 'd3';

const BarChart = ({ data }) => {
    const ref = React.useRef();

    React.useEffect(() => {
        const svg = d3.select(ref.current);
        const margin = { top: 20, right: 30, bottom: 40, left: 40 };
        const width = 500 - margin.left - margin.right;
        const height = 300 - margin.top - margin.bottom;

        svg.attr('width', width + margin.left + margin.right)
           .attr('height', height + margin.top + margin.bottom)
           .append('g')
           .attr('transform', `translate(${margin.left},${margin.top})`);

        // X축과 Y축의 스케일 설정
        const x = d3.scaleBand()
            .domain(data.map(d => d.name))
            .range([0, width])
            .padding(0.1);

        const y = d3.scaleLinear()
            .domain([0, d3.max(data, d => d.value)])
            .nice()
            .range([height, 0]);

        // 막대그래프 추가
        svg.select('g')
            .selectAll('rect')
            .data(data)
            .enter()
            .append('rect')
            .attr('x', d => x(d.name))
            .attr('y', d => y(d.value))
            .attr('width', x.bandwidth())
            .attr('height', d => height - y(d.value))
            .attr('fill', 'orange');

        // X축 추가
        svg.append('g')
            .attr('transform', `translate(0,${height})`)
            .call(d3.axisBottom(x));

        // Y축 추가
        svg.append('g')
            .call(d3.axisLeft(y));
    }, [data]);

    return ;
};
export default BarChart;

3. 메인 컴포넌트에서 그래프 사용하기

이제 App.js 파일을 수정하여 BarChart 컴포넌트를 사용할 수 있도록 하겠습니다.


import React from 'react';
import BarChart from './BarChart';

const data = [
    { name: 'A', value: 30 },
    { name: 'B', value: 80 },
    { name: 'C', value: 45 },
    { name: 'D', value: 60 },
    { name: 'E', value: 20 },
    { name: 'F', value: 90 },
    { name: 'G', value: 55 },
];

function App() {
    return (
        

리액트와 D3.js를 이용한 바 차트

); } export default App;

4. D3.js와 리액트의 연동 이해하기

D3.js를 리액트와 연동하는 것은 비동기 데이터 처리를 하는 데 중요한 역할을 합니다.
리액트는 상태(state) 관리와 컴포넌트 생명주기(lifecycle)에 대한 알고리즘을 가지고 있지만, D3.js는 DOM을 직접 조작하는 특징이 있습니다.
따라서, D3.js의 시각화 요소는 리액트의 생명주기를 고려하여 추가해야 합니다.

위의 예에서 useEffect 훅은 컴포넌트가 렌더링될 때마다 D3.js의 시각화를 업데이트합니다.
이는 데이터가 변경될 때마다 새로운 그래프를 그릴 수 있도록 보장합니다.

5. 스타일링과 사용자 경험 향상

D3.js에서 시각화는 기본적으로 DEBUG 용도로 사용되고, 최종적으로 전달되는 데이터에 대해 매우 적은 수준의 스타일링을 합니다.
따라서, 사용자 경험을 향상시키기 위해 CSS를 통해 차트의 스타일을 개선할 수 있습니다.
예를 들어, 그래프의 색상, 글꼴, 및 여백을 조절하여 더욱 눈에 띄게 만들 수 있습니다.

스타일 추가 예시



6. 여러 종류의 차트 생성하기

D3.js의 힘을 이용하면 다양한 유형의 그래프를 생성할 수 있습니다.
위에서 확인한 바 차트 외에도, 선 그래프, 원형 차트 등을 쉽게 구현할 수 있습니다.
각 그래프의 구현 방법은 D3.js의 다양한 기능을 이용하여 내장된 메서드를 활용하거나 커스텀 메서드를 작성하여 지원합니다.

7. 데이터 바인딩 및 동적 데이터 처리

D3.js의 강력한 기능 중 하나는 데이터 바인딩(data binding)입니다.
리액트의 상태(state) 관리와 D3.js의 데이터 바인딩을 결합하여, 동적인 데이터를 처리할 수 있습니다.
예를 들어, 사용자가 입력한 데이터를 기반으로 그래프를 업데이트 할 수 있습니다.

동적 데이터 처리 예시


const [data, setData] = React.useState(initialData);

// 데이터를 업데이트하는 함수
const handleDataUpdate = (newData) => {
    setData(newData);
};

// 컴포넌트 안에서  사용

8. 리액트의 상태 관리 라이브러리와 D3.js 통합

리액트에서는 전역 상태 관리를 위해 Redux와 같은 라이브러리를 사용할 수 있습니다.
이와 같은 라이브러리를 활용하여 D3.js와 연동하면 더욱 복잡한 데이터 시각화를 구현할 수 있습니다.
특히, Reselect나 Redux-Saga와 같은 미들웨어를 사용하면 이점을 극대화할 수 있습니다.

9. 최적화 및 성능 향상

D3.js와 리액트를 함께 사용할 때, 성능 최적화가 중요합니다.
줄어든 DOM 업데이트 및 불필요한 재렌더링을 피하는 것이 핵심입니다.
React.memo 또는 useMemo와 같은 리액트의 내장 최적화 기능을 활용하여 성능을 개선할 수 있습니다.


const BarChart = React.memo(({ data }) => {
    // 시각화 로직...
});

10. 결론

D3.js와 리액트를 사용하여 커스텀 그래프와 차트를 구현하는 방법을 알아봤습니다.
이 조합은 데이터 시각화를 매우 강력하게 만들어 줄 수 있으며, 다양한 시나리오에서 활용될 수 있습니다.
이제 여러분은 이 강좌를 바탕으로 여러분의 데이터에 맞는 다양한 시각화 도구를 개발할 수 있습니다.

11. 참고 자료