๊ตฌํํ ๊ธฐ๋ฅ์ ์์ ๊ฐ์ ๋๋ ์ฐจํธ!
๊ทธ๋ฐ๋ฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ์ด๋ป๊ฒ ๋ค์ด์ค๋ฉฐ, ์ด๋ฅผ ์ด๋ป๊ฒ ๊ฐ๊ณตํด์, ์ด๋ป๊ฒ ๋ถ๋ฆฌํด์ ํญ์ผ๋ก ๋๋ ์ ์์๊น? ์ฐจํธ์ ์ฐจํธ์ค๋ช ๋ถ๋ถ๋ง ์๊ฐํด๋ ๋จธ๋ฆฌ๊ฐ ์ํ๋ฐ, ํญ๊ธฐ๋ฅ๊น์ง ๊ตฌํํ๋ ค๋ ๋จธ๋ฆฌ๊ฐ ์ํ์๋ค.
์ฃผ์ด์ง ๋ฐ์ดํฐ๋ ์๋์ ๊ฐ์๋ค.
"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>
์ฌ์ค ํญ์ ์ด๋ป๊ฒ ๊ตฌํํ ์ง ์ ๋ง ๋ง๋งํด์ ๋ฌด์์ ๋ฉํ ๋์ ์ฐพ์๊ธฐ๋ ํ๋๋ฐ, ํ๋ฒ ๋ฐฉ๋ฒ์ ์๊ณ ๋๋ ์ ๋์ ํ์ง ์์์๊น ์ถ์๋ค! ํญ์ ์ซ์ง๋ง๊ณ ์ฉ๊ฐํ๊ฒ ์ฝ๋ฉํ์๊ณ ๋ง์๋จน์๋ค. ๊ทธ๋ฆฌ๊ณ ์ธ์ ๊ฐ ๋ฉํ ๋์ด ์ข์ ํ๋ก ํธ์๋ ์์ง๋์ด๋ ์ด๋ค ๋ฐ์ดํฐ๊ฐ ์๋ ์ ๊ฐ๊ณตํ ์ค ์๋ ์ฌ๋์ด๋ผ๊ณ ๋ง์ํ์ จ๋๋ฐ, ๊ทธ ๋ง์์ ์ธ์ ๋ ๋ง์์ ํ๊ณ ๊ฐ๋ฅํ ๋ฐ์ดํฐ์ ๋ณ๋์์ด ๊ทธ๋๋ก ๊ฐ์ ธ์ ์ ๋๊ฒ ๊ฐ๊ณตํ์ฌ ์ฐ๋ ์ฐ์ต์ ํด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ๋ค. ์ด๋ฒ ๊ธฐ๋ฅ๊ตฌํ์ ๊ทธ ์ฐ์ต์ ํ๋๋ฐ์ ์ต์ ์ด์๊ณ , ์ ๋ง ์ฌ๋ฏธ์๊ฒ ๊ตฌํํ ๊ฒ ๊ฐ๋ค. ์๋ฟ๋ฏ!!