๐Ÿ’ ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต์„ ํ†ตํ•œ ์ฐจํŠธ ๋ฐ ํƒญ๊ธฐ๋Šฅ ๊ตฌํ˜„

Somiยท2021๋…„ 7์›” 31์ผ
5
post-thumbnail

ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ์™€ ๋‘๊ฐœ์˜ ๊ธฐ๋Šฅ๋“ค

๊ตฌํ˜„ํ•œ ๊ธฐ๋Šฅ์€ ์œ„์™€ ๊ฐ™์€ ๋„๋„› ์ฐจํŠธ!

๊ทธ๋Ÿฐ๋ฐ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋Š” ์–ด๋–ป๊ฒŒ ๋“ค์–ด์˜ค๋ฉฐ, ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐ€๊ณตํ•ด์„œ, ์–ด๋–ป๊ฒŒ ๋ถ„๋ฆฌํ•ด์„œ ํƒญ์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์„๊นŒ? ์ฐจํŠธ์™€ ์ฐจํŠธ์„ค๋ช… ๋ถ€๋ถ„๋งŒ ์ƒ๊ฐํ•ด๋„ ๋จธ๋ฆฌ๊ฐ€ ์•„ํ”ˆ๋ฐ, ํƒญ๊ธฐ๋Šฅ๊นŒ์ง€ ๊ตฌํ˜„ํ•˜๋ ค๋‹ˆ ๋จธ๋ฆฌ๊ฐ€ ์•„ํŒŒ์™”๋‹ค.

์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™์•˜๋‹ค.

 "investStatus": {
      "totalInvest": 1485000,
      "complete": 1193824,
      "delay": 11531,
      "invest": 209781,
      "loss": 81395,
      "normal": 182446,
      "overdue": 4087,
      "nonperform": 11717
    }

์ด๊ฑธ ์–ด๋–ป๊ฒŒ ๊ฐ€๊ณตํ•˜์ง€!?!??!?!

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

์ผ๋‹จ ๋„๋„›์ฐจํŠธ ๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด๋ณด์ž

์ผ๋‹จ Props๋กœ ๋„˜๊ฒจ๋ฐ›์„ ๋ฐ์ดํ„ฐ๊ธฐ์— ๊ตฌ์กฐ๋ถ„ํ•ด ํ• ๋‹น์„ ํ•ด์ค€๋‹ค.

// ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น
  const {
    totalInvest,
    complete,
    delay,
    invest,
    loss,
    normal,
    overdue,
    nonperform,
  } = investStatus;

๊ทธ๋ฆฌ๊ณ  1๋ฒˆ ํƒญ๊ณผ 2๋ฒˆ ํƒญ์— ๋“ค์–ด๊ฐˆ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฆฌํ•ด์•ผํ–ˆ๋‹ค.
์ผ๋‹จ ํƒญ๋ณ„๋กœ ๋ฌถ์ผ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜๋ˆ  ๊ฐ์ฒด๋กœ ๊ด€๋ฆฌ๋ฅผ ํ•ด์ค€๋‹ค.

//์ „์ฒดํˆฌ์ž์•ก์™€ ํˆฌ์ž์ค‘๊ธˆ์•ก ๋ฐ์ดํ„ฐ ๋‚˜๋ˆ ์ฃผ๊ธฐ(ํƒญ์œผ๋กœ ๋ถ„๋ฆฌ๋จ)
  const selectedData = {
    total: { invest, complete, loss },
    investing: { normal, delay, overdue, nonperform },
  };

๋‹ค์Œ์œผ๋กœ ์„ ํƒ๋œ ํƒญ์— ๋”ฐ๋ฅธ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์„ ์œ„ํ•ด entries๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค.

// ์„ ํƒ๋œ ํƒญ์— ๋”ฐ๋ฅธ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ(๋””๋ฒจ๋กญ ํ•  ์ˆ˜ ์žˆ์„์ง€ ๊ถ๊ธˆ...)
  const selectedDataList = currentData
    ? Object.entries(selectedData.total)
    : Object.entries(selectedData.investing);

๊ฐ ๋‹จ์–ด๋Š” ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น์„ ํ•ด์คฌ๊ธฐ๋•Œ๋ฌธ์— ์‚ฌ์‹ค ํ‚ค์™€ ๋ฐธ๋ฅ˜๊ฐ’์œผ๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋Š” ๊ฐ์ฒด์ด๋‹ค. ๋”ฐ๋ผ์„œ entries๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด [ํ‚ค, ๋ฐธ๋ฅ˜] ํ˜•ํƒœ์˜ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜์ด ๋œ๋‹ค.(๋‚˜๋Š” ํƒญ ํด๋ฆญ์‹œ state๊ฐ’์„ ๋ถˆ๋ฆฌ์–ธ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋Š” ํ˜•ํƒœ๋กœ ํ•จ์ˆ˜๋ฅผ ์งฐ๊ธฐ์— ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.) ๊ทธ ๊ฐ’์€ ์•„๋ž˜์˜ ํ˜•ํƒœ์™€ ๊ฐ™๋‹ค.

//currentData๊ฐ€ total(true)์ผ๋•Œ
[
  [ 'invest', 209781 ],
  [ 'complete', 1193824 ],
  [ 'loss', 81395 ]
]
//currentData๊ฐ€ investing(false)์ผ๋•Œ
[
  [ 'normal', 182446 ],
  [ 'delay', 11531 ],
  [ 'overdue', 4087 ],
  [ 'nonperform', 11717 ]
]

entries๊ฐ€ ์ด๋ ‡๊ฒŒ๋‚˜ ์œ ์šฉํ•˜๋‹ต๋‹ˆ๋‹ค.(ํ›„ํ›„)

์‹ ๋‚œ๋‹ค. ์ด์ œ ๋งต์œผ๋กœ ๋Œ๋ ค์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๋Š” ์œ„์น˜์— ๋„ฃ์–ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด๋œ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ, ์ฐจํŠธ๋ฐ์ดํ„ฐ๋Š” ๋ณดํ†ต ํ•จ์ˆ˜๋ฅผ ๋”ฐ๋กœ ๋‹ค๋ฅธ ํŒŒ์ผ์— ๋ถ„๋ฆฌํ•ด์„œ ๊ด€๋ฆฌํ•˜๋Š”๊ฒŒ ๋” ์ข‹๊ธฐ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฅธ ํŒŒ์ผ์— ๋„ฃ๊ณ  ์ด๋ฅผ ์ž„ํฌํŠธํ•ด์™€์„œ ์‚ฌ์šฉํ•œ๋‹ค.

export const makeChartData = rawData => {
  const result = {
    datasets: [
      {
        labels: rawData.map(([name, value]) => name),
        data: rawData.map(([name, value]) => value),
      },
    ],
  };

  return result;
};

๋‹ค์‹œ ์›๋ž˜ jsํŒŒ์ผ์— ๋Œ์•„์™€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ ์šฉํ•œ๋‹ค.

// ์ฐจํŠธ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ
  const chartData = makeChartData(selectedDataList);

๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์ง !ํ•˜๊ณ  ๋„๋„› ์ฐจํŠธ๊ฐ€ ์™„์„ฑ์ด ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.(๋‘๊ทผ๋‘๊ทผ)

์ด์ œ ์ฐจํŠธ ์บก์…˜์„ ๋งŒ๋“ค์–ด๋ณด์ž

์œ„์— ๋งŒ๋“ค์–ด๋‘” ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ž˜๋„ ์“ธ ์ˆ˜ ์—†์—ˆ๋˜ ๊ฒƒ์ด... ๊ณผ๊ฑฐ์˜ ๋‚ด๊ฐ€ HTML๊ตฌ์กฐ๋ฅผ ์ด๋ ‡๊ฒŒ ์งฐ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค...

<ChartDesc>
      <DescContent>
        <Circle className="fas fa-circle"/>
        <ChartTitle>title</ChartTitle>
        <ChartValue>1,000,000์›</ChartValue>
      </DescContent>
    ))}
</ChartDesc>

์ฆ‰, ์›, ๋ฐ์ดํ„ฐ ํ‚ค, ๋ฐ์ดํ„ฐ ๋ฐธ๋ฅ˜๋ฅผ ๋งต์œผ๋กœ ๋Œ๋ ธ๊ธฐ์— ๋˜ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ–ˆ์–ด์•ผํ–ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๋Œ€๋กœ Map์„ ๋Œ๋ฆฌ๋ฉด ์›ํ•˜๋Š” ๋ฐ”์™€ ๋‹ค๋ฅด๊ฒŒ ์˜์–ด๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ํ‘œํ˜„๋  ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ƒ์ˆ˜๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด ์ด๋ฆ„์„ ๋ฐ”๊ฟ” ๋งต์„ ๋Œ๋ ค์•ผ ํ•œ๋‹ค.

const NAME_MATCH = {
  totalInvest: '๋ˆ„์  ํˆฌ์ž ์›๊ธˆ',
  complete: 'ํˆฌ์ž์™„๋ฃŒ',
  delay: '์ƒํ™˜์ง€์—ฐ',
  invest: 'ํˆฌ์ž์ค‘',
  loss: '์†์‹ค',
  normal: '์ •์ƒ',
  overdue: '์—ฐ์ฒด',
  nonperform: '๋ถ€์‹ค',
};

(๋ชฐ๋ž๋Š”๋ฐ ์ฐธ๊ณ ๋กœ ์ƒ์ˆ˜๋ฐ์ดํ„ฐ๋Š” ๋ณดํ†ต ๋Œ€๋ฌธ์ž๋กœ ๋ณ€์ˆ˜๋ช…์„ ์ง€์ •ํ•ด์ค€๋‹ค๊ณ  ํ•œ๋‹ค.)

์ด๋ ‡๊ฒŒ ์ƒ์ˆ˜๋ช…์„ ๋งŒ๋“ค์—ˆ์œผ๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์ž˜ ํ•˜๋Š” ์ด๋ฆ„ ๋ฐ”๊ฟ”์ฃผ๊ธฐ๋ฅผ ํ•˜๋ฉด๋œ๋‹ค. ์ด๊ฒƒ๋„ ๋งต์„ ํ†ตํ•ด์„œ ๊ฐ€๋Šฅํ•˜๋‹ค.

const ConvertToChartData = selectedDataList.map(([name, value]) => [
    NAME_MATCH[name],
    value,
  ]);

๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ทธ ๊ฒฐ๊ณผ๊ฐ’์€ ๊ฐ๊ฐ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

[
  [ 'ํˆฌ์ž์ค‘', 209781 ],
  [ 'ํˆฌ์ž์™„๋ฃŒ', 1193824 ],
  [ '์†์‹ค', 81395 ]
],
[
  [ '์ •์ƒ', 182446 ],
  [ '์ƒํ™˜์ง€์—ฐ', 11531 ],
  [ '์—ฐ์ฒด', 4087 ],
  [ '๋ถ€์‹ค', 11717 ]
]

์ž ๊ทธ๋Ÿผ ๋งต์„ ์‹ ๋‚˜๊ฒŒ ๋Œ๋ ค์ฃผ๋ฉด ๋๋‚œ๋‹ค!

<ChartDesc>
    {ConvertToChartData.map(([title, totalValue], idx) => (
      <DescContent key={title}>
        <Circle className="fas fa-circle" color={idx}></Circle>
        <ChartTitle>{title}</ChartTitle>
        <ChartValue>{totalValue.toLocaleString()}์›</ChartValue>
      </DescContent>
    ))}
</ChartDesc>

๋Š๋‚€์ 

์‚ฌ์‹ค ํƒญ์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ• ์ง€ ์ •๋ง ๋ง‰๋ง‰ํ•ด์„œ ๋ฌด์ž‘์ • ๋ฉ˜ํ† ๋‹˜์„ ์ฐพ์•„๊ธฐ๋„ ํ–ˆ๋Š”๋ฐ, ํ•œ๋ฒˆ ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ ๋‚˜๋‹ˆ ์™œ ๋„์ „ํ•˜์ง€ ์•Š์•˜์„๊นŒ ์‹ถ์—ˆ๋‹ค! ํ•ญ์ƒ ์ซ„์ง€๋ง๊ณ  ์šฉ๊ฐํ•˜๊ฒŒ ์ฝ”๋”ฉํ•˜์ž๊ณ  ๋งˆ์Œ๋จน์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์–ธ์  ๊ฐ€ ๋ฉ˜ํ† ๋‹˜์ด ์ข‹์€ ํ”„๋ก ํŠธ์—”๋“œ ์—”์ง€๋‹ˆ์–ด๋Š” ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ์™€๋„ ์ž˜ ๊ฐ€๊ณตํ•  ์ค„ ์•„๋Š” ์‚ฌ๋žŒ์ด๋ผ๊ณ  ๋ง์”€ํ•˜์…จ๋Š”๋ฐ, ๊ทธ ๋ง์”€์„ ์–ธ์ œ๋‚˜ ๋งˆ์Œ์— ํ’ˆ๊ณ  ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ์— ๋ณ€๋™์—†์ด ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์™€ ์‹ ๋‚˜๊ฒŒ ๊ฐ€๊ณตํ•˜์—ฌ ์“ฐ๋Š” ์—ฐ์Šต์„ ํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ์ด๋ฒˆ ๊ธฐ๋Šฅ๊ตฌํ˜„์€ ๊ทธ ์—ฐ์Šต์„ ํ•˜๋Š”๋ฐ์— ์ตœ์ ์ด์—ˆ๊ณ , ์ •๋ง ์žฌ๋ฏธ์žˆ๊ฒŒ ๊ตฌํ˜„ํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ์™•๋ฟŒ๋“ฏ!!

0๊ฐœ์˜ ๋Œ“๊ธ€