ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Recharts] Nextjs에서 Recharts 맛보기
    조각조각/Etc 2024. 5. 15. 21:04
    📊 이번에 새롭게 시작하는 프로젝트에 차트 라이브러리가 필요했다. 차트 라이브러리를 선택하기에 앞서 고려해야 했던 점은 디자인팀 시안을 최대한 반영할 수 있도록 어느 정도 커스텀이 가능해야 했고, nextjs를 고려하여 svg로 제공이 돼야 했다. 팀원들과 여러 차트 라이브러리를 찾아보고, 논의한 끝에 Recharts를 사용하기로 결정했다.

     

    오늘의 결과물

    🤔 Recharts란?

    공식문서  https://recharts.org/en-US

     
    리액트 컴포넌트를 기반으로 데이터를 차트로 시각화해 주는 라이브러리이다.
     

    ⚙️ 설치하기

    npm install recharts

     

    📂 연습하기

    어떤 식으로 데이터를 전달해서 쓰는지 간단하게 확인하고 싶어서 유튜브 강의인 [ Build Charts in React With Recharts in 7 Minutes ] 을 따라서 진행해 봤다. 
     

    1. Area Chart(영역차트)

     
    1) components 폴더에 AreaChart.tsx 파일을 생성해 준다.
    2) app - page.tsx에 AreaChart.tsx 파일을 import 해준다.
    3) 사진과 같은 결과물이 나오려면 recharts에서 필요한 컴포넌트들을 가져와 prop을 넘겨 사용할 수 있다. 

    'use client';
    
    import {
      AreaChart,
      Area,
      ResponsiveContainer,
      XAxis,
      YAxis,
      CartesianGrid,
      Tooltip,
      Legend,
      TooltipProps,
    } from 'recharts';
    
    const AreaChartComponent = () => {
      return (
      	// 컴포넌트
      )
    }
    
    export default AreaChartComponent;

     
    이번 연습에서는 강의에서 제공한 Mock Data를 사용했다.

    더보기
    const productSales = [
     {
       name: 'Jan',
       product1: 4000,
       product2: 2400,
     },
     {
       name: 'Feb',
       product1: 3000,
       product2: 2210,
     },
     {
       name: 'Mar',
       product1: 2000,
       product2: 2290,
      },
     {
       name: 'Apr',
       product1: 2780,
       product2: 2000,
     },
     {
       name: 'May',
       product1: 1890,
       product2: 2181,
     },
     {
       name: 'Jun',
       product1: 2390,
       product2: 2500,
     },
    ];

    return문 안에서 import해온 컴포넌트들을 사용할 수 있다. 
    기본 구성은 아래와 같다.

    const productSales = [{name: 'Jan', product1: 4000, product2: 2400}, ...];
    
    const AreaChartComponent = () => {
      return (
      <ResponsiveContainer>
        <AreaChart width={400} height={400} data={productSales}>
          <Area type="monotone" dataKey="product1" stroke="#8884d8" fill="#3b82f6" stackId="1" />
          <Area type="monotone" dataKey="product2" stroke="#7c3aed" fill="#8b5cf6" stackId="1" />
        </AreaChart>
      </ResponsiveContainer>
      );
    };
    • ResponsiveContainer : 차트를 반응형으로 만들어주는 컨테이너
    • AreaChart : 영역 차트를 그리기 위한 컴포넌트로 차트의 너비, 높이 등을 조절 가능
      • data : 시각화하고자 하는 데이터 값을 전달
    • Area : 영역 차트를 그리기 위한 핵심 요소로 영역 차트가 사용할 데이터의 키를 지정 가능
      • type : 데이터를 곡선으로 표시
      • stroke : 데이터 점들을 연결하는 선의 색상을 지정
      • fill : 연결된 선 아래의 영역을 채우는 색상을 지정
      • stackId : 동일한 stackId를 가진 Area 컴포넌트들은 함께 누적되어 표시

     
    또한 추가적으로 차트를 커스텀할 수 있는 기능들이 더 존재하는데, 이번 파트에서는 Grid 추가와 툴팁까지 다뤄보았다.

     

    ✏️ Grid 추가 및 X, Y축 데이터 표시

    <YAxis />
    <XAxis dataKey="name" />
    <CartesianGrid strokeDasharray="5 5" />
    • YAxis : 차트의 Y축 정의
    • XAxis : 차트의 X축 정의
    • CartesianGrid : 차트에 Grid 추가
      • strokeDasharray : 선 스타일 설정

     

    ✏️  툴팁 추가

    기본으로 제공하는 툴팁 스타일이 현재 커스텀한 차트 스타일과 전혀 어울리지 않는 것을 볼 수 있는데, 이 툴팁 또한 커스텀을 해줄 수 있다는 사실! 이런 점에서 굉장히 자유도가 높은 라이브러리라는 것을 알 수 있다.

    (좌) 기본 툴팁 스타일 / (우) 커스텀 된 툴팁 스타일

     

    <Tooltip content={<CustomTooltip />} />
    <Legend />
    • Tooltip : 마우스를 올렸을 때 데이터에 대한 정보를 표시
      • content : 커스텀 툴팁 컴포넌트를 전달
    • Legend : 차트의 범례를 추가하여 각 데이터를 쉽게 식별할 수 있도록 도움을 줌

     
    CustomTooltip에서 원하는 스타일을 지정해 줄 수 있다.

    😇 이때 타입스크립트를 이용하면 payload 타입 지정을 어떻게 해야 할지 모르는 상황이 발생할 수 있다. 다행히 prop의 타입까지도 recharts에서 제공해 준다. -> import { TooltipProps } from 'recharts';
    const CustomTooltip = ({
      active,
      payload,
    }: TooltipProps<number, string>): JSX.Element | null => {
      if (active && payload && payload.length) {
        const item = payload[0].payload;
        const { name, product1, product2 } = item;
        return (
          <div className="p-4 bg-slate-900 flex flex-col gap-4 rounded-md">
            <p className="text-medium text-lg">{name}</p>
            <p className="text-sm text-blue-400">
              Product 1:
              <span className="ml-2">{product1}</span>
            </p>
            <p className="text-sm text-blue-400">
              Product 2:
              <span className="ml-2">{product2}</span>
            </p>
          </div>
        );
      }
      return null;
    };

     

    • payload 데이터 안에 객체로 넘겨준  key: value 데이터 값들이 들어가 있다.

     

    2.  Bar Chart, Line Chart

    Area Chart와 동일하게 Bar Chart와 Line Chart도 각 차트에 해당하는 컴포넌트만 변경해서 불러와주면 된다.(Chart 컴포넌트를 제외하고는 코드가 동일하기 때문에 코드를 따로 첨부하지 않았다.)

     

    📚 느낀 점

    오늘 강의를 따라 해 본 건 정말 찍먹 수준인 느낌이라 Recharts의 기본 사용법은 이렇구나 정도만 체험한 느낌이었다. 다만, 자유도가 높아서 디자인적으로 퀄리티를 높일 수 있다는 점이 너무 만족스러웠다. 앞으로 실제 데이터를 받아와서 원하는 결과를 얻기 위해 가공하는 과정에서 굉장히 많은 고난을 만날 것으로 예상되긴 하지만🥹 지금 경험 안 해보면 또 언제 해볼까 싶어서 이 상황을 겸허히 받아들이기로 마음을 먹어본다. 다음 포스팅 때는 좀 더 친해져있길,,


    참고

    [유튜브] Build Charts in React With Recharts in 7 Minutes - CodeSnaps(링크)
     

    💬 본 포스팅은 공부 기록용으로 정확하지 않은 정보가 존재할 수 있습니다. 발견하신다면 알려주세요!

    '조각조각 > Etc' 카테고리의 다른 글

    [Storybook] Storybook 설치(React)  (0) 2024.05.08
    [CSS] CSS 변수 규칙  (0) 2024.04.13
Designed by Tistory.