(์ต๊ทผ์ ๋ง๋ ์ฝ์ธ๊ฑฐ๋์ ํด๋ก ์ฝ๋ฉ)
์ต๊ทผ ๋ฆฌ์กํธ(+ํ์
์คํฌ๋ฆฝํธ) ๊ณต๋ถ๋ฅผ ์์ํ์ต๋๋ค.
์ฌํ๊น์ง HTML, SCSS, JS ์ด๋ ๊ฒ 3๊ฐ๋ก ๋ถ๋ฆฌํด์ ๋งํฌ์
โ์คํ์ผโ์คํฌ๋ฆฝํธ ์์ผ๋ก ์์
ํ์๋๋ฐ
์ด์ ๋ ์ปดํฌ๋ํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ํ์ผ ์์ ๋งํฌ์
๋ถํฐ ์คํ์ผ, ์คํฌ๋ฆฝํธ๊น์ง ๋ค ์์ฑํ๋.. ํธํ ๋ฏ ํ๋ฉด์ ๋ถํธํ๋ค์ใ
ใ
์ํผ ๋ฆฌ์กํธ ํด๋ก ์ฝ๋ฉ์ ํ๋ค๊ฐ APEXCHART๋ผ๋ ๋ฉ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์๊ฒ ๋์ด์ ์ ๋ฆฌ ๊ฒธ ๋ธ๋ก๊ทธ์ ๊ณต์ ํด๋ด
๋๋ค.
์ฌ์ดํธ ๋ฐ๋ก๊ฐ๊ธฐ : https://apexcharts.com/
APEXCHART๋ ๋ฐ์ดํฐ๋ฅผ ์๊ฐํ ํด์ฃผ๋ ์ฐจํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค.
์ ๊ทธ๋ํ, ๊ฑฐํํ, ํ์๋ผ์ธ, ํํธ๋งต๊น์ง ๋ค์ํ ์คํ์ผ๋ค์ด ์๊ณ , ๋ฐ์ํ์ ์ปค์คํ
๊ธฐ๋ฅ๊น์ง ๊ตฌํ๋์ด ์์ต๋๋ค.
MIT ๋ผ์ด์ผ์ค๋ฅผ ๋ฐ์ ์คํ ์์ค๋ผ์ ์์ฉ ์ดํ๋ฆฌ์ผ์ด์
์์๋ ๋ฌด๋ฃ๋ก ์ฌ์ฉํ ์ ์๋ค๊ณ ํฉ๋๋ค~๐
์ ๊ฐ์ ์ด๋ณด๋ค๋ ์ฝ๊ฒ ๋ค๋ฃฐ ์ ์๋ค๋ ์ฅ์ ์ด ์์ด์๐
(๋ฐ๋ชจ ํ์ด์ง์ ๋ค์ด๊ฐ๋ฉด ์ด๊ฒ๋ณด๋ค ํจ์ฌ ๋ง์ ์คํ์ผ๋ค์ ๋ณด์ค ์ ์์ต๋๋ค.)
์ฐธ๊ณ ๋ก ์ด ํฌ์คํธ์์๋ candlestick(์ฃผ์ ์ฐจํธst) ์คํ์ผ์ ์ฌ์ฉํ์ต๋๋ค^^
npm ์ค์น ใฑใฑ
npm install apexcharts --save
ํ์ผ์ ์ํฌํธ ํด์ฃผ์ธ์
import ApexChart from 'apexcharts'
return (
<div>
<ApexChart />
</div>
)
๊ทธ๋ฅ ์ปดํฌ๋ํธ์ฒ๋ผ ์ฐ๋ฉด ๋ฉ๋๋ค. ์ฐธ ์ฝ์ฃ ?
APEXCHART๋ ์น์ ํ๊ฒ๋ ์ฌ๋ฌ ์์ ์ฝ๋๋ฅผ ์ ๊ณตํ๊ณ ์์ต๋๋ค.
๋ฐ๋ชจ ํ์ด์ง์ ๋ค์ด๊ฐ๋ฉด ์ฌ๋ฌ ์ ํ์ ์ฐจํธ๋ค์ด ๋์ค๋๋ฐ ๊ฑฐ๊ธฐ์ ๋ง์ ๋๋ ๊ฑฐ ๊ณจ๋ผ์ ์ฐธ๊ณ ํ์๋ฉด ๋ฉ๋๋ค.
์ฐจํธ๋ฅผ ๋ง๋ค๋ ค๋ฉด ๋ฐ์ดํฐ๊ฐ ํ์ํฉ๋๋ค.
์ ๋ CoinPaprika API๋ฅผ ์ฌ์ฉํ๋๋ฐ์.
fetch()์ React Query๋ฅผ ์ด์ฉํด ์ต๊ทผ 2์ฃผ๊ฐ์ ์ฝ์ธ์ ๊ฐ๊ฒฉ ์ ๋ณด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ data์ ์ ์ฅํ์ต๋๋ค.
์ ๊ฐ ๊ฐ๊ณ ์จ ์ฝ์ธ ๋ฐ์ดํฐ์ ๋ชจ์ต(ํ์
)์
๋๋ค. ์ฃผ์๋ชป์ด๋ผ์ ๊ฐ ํญ๋ชฉ์ด ์ ํํ ๋ฌด์์ ๋ปํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ๋ค์.
์ํผ ๋์ถฉ ์ด๋ ๊ฒ ์๊ฒจ๋จน์์ต๋๋ค.
interface IHistorical {
time_open: string;
time_close: string;
open: number;
high: number;
low: number;
close: number;
volume: number;
market_cap: number;
}
(๋นํธ์ฝ์ธ์ ๊ฐ๊ฒฉ ๋ฐ์ดํฐ)
์ด์ ์ฌ๊ธฐ์ ๋ฌธ์ ๋ _์ด๋ป๊ฒ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํด์ ๋ฃ์๊น.. ์ธ๋ฐ
๊ณต์ ๋ฌธ์์ candlestick ํ์ด์ง๋ฅผ ๋ณด๋ฉด ๋ฐ์ดํฐ ํ์์ด ์ค๋ช
๋์ด ์์ต๋๋ค.
candlestick ์ ํ์์ ํ์ํ ์ ๋ณด๋ Timestamp(์๊ฐ)๊ณผ open, high, low, close ๊ฐ๊ฒฉ์
๋๋ค.
CoinPaprika API์์ ๋ฐ์์จ ๋ฐ์ดํฐ์ ๋ฑ ๋จ์ด์ ธ๋ง๋ค์ใ
ใ
์ ๋ ์ฌ๊ธฐ์ Single Array ๋ฐฉ์์ ํํ์ต๋๋ค.
map() ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ data ์์ ํ์ํ ํญ๋ชฉ๋ง ๊ณจ๋ผ์ array ์์ ๋ฃ์ด์ค ํ return ํด์คฌ์ต๋๋ค.
<ApexChart
type="candlestick"
series={[
{
data: data?.map((price) => {
return [
Date.parse(price.time_close),
price.open,
price.high,
price.low,
price.close,
];
}),
.
.
.
์๊ฐ ๊ด๋ จ ๋ฐ์ดํฐ๊ฐ yyyy-mm-ddThh:mm:ssZ ํ์์ ๋ฌธ์์ด์ด๋ผ์ Date.parse()๋ฅผ ์ด์ฉํด ํ์์คํฌํ๋ก ์ ํํด์คฌ์ต๋๋ค.
โจMDN Date.parse() https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Date/parse
https://apexcharts.com/docs/options/# ํ์ด์ง๋ฅผ ๋ณด๊ณ ์ํ๋ ๋ถ๋ถ์ ์ฐพ์์ ์ปค์คํ
ํ์๋ฉด ๋ฉ๋๋ค.
x์ถ, y์ถ, ์๊น, ํด๋ฐ ๊ฐ์ถ๊ธฐ, ํ
๋ง ์ค์ ๋ฑ ์ธ์ธํ ๋ถ๋ถ๊น์ง ์ปค์คํ
ํ ์ ์์ต๋๋ค.
์ ๊ฐ ๋ง๋ ๋ฒ์ ผ์ ์ด๋ ์ต๋๋น ์ฐธ๊ณ ๋ง ํด์ฃผ์ธ์ใ
<ApexChart
type="candlestick"
series={[
{
data:
data?.map((price) => {
return [
Date.parse(price.time_close),
price.open,
price.high,
price.low,
price.close,
];
}),
},
]}
options={{
theme: {
mode: "dark",
},
chart: {
type: "candlestick",
height: 350,
width: 500,
toolbar: {
show:false,
},
background: "transparent",
},
stroke: {
curve: "smooth",
width: 2,
},
yaxis: {
show: false,
},
xaxis: {
type: "datetime",
categories: data?.map((price) => price.time_close),
labels: {
style: {
colors: '#9c88ff'
}
}
},
plotOptions: {
candlestick: {
colors: {
upward: '#3C90EB',
downward: '#DF7D46'
}
}
}
}}
/>
๊ณต์ ๋ฌธ์์ ๋ฐ๋ชจ๊ฐ ๋๋ฌด ์ ๋์ด์์ด์ ์ค๋ช
ํ ๊ฒ ์๋ค์..ใ
ใ
์ต๊ทผ์ ํผ๋ธ๋ฆฌ์
๋ฉด์ ๋ ๋ค๋
์๋๋ฐ ์ง๋ฌธ์ ๋ง์ด ๋ฐ์ง ๋ชปํด์ ๋์ค์ ๋ค๋ฅธ ํ์ฌ ๋ฉด์ ์ง๋ฌธ๊ณผ ๊ฐ์ด ์ ๋ฆฌํด์ ์ฌ๋ฆด ์์ ์
๋๋ค.
์ฝ์ด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค~๐
์๋ ํ์ธ์! ๋ธ๋ก๊ทธ์ ๋ ธ๋ง๋ ์ฝ๋์์ ๊ฐ๋ฅด์ณ์ฃผ์ ๊ฑธ ์ ์ ๋ฆฌ ํด์ฃผ์ ์ ๋๋ถ์ ํํธ๋ฅผ ๋ง์ด ์ป๊ณ ๊ฐ์! :-) ์ด ๊ฒ์ํ ๊ธ ๋๋ถ๋ถ์ด ๋ ธ๋ง๋ ์ฝ๋ ์์ ๋ด์ฉ ํ๋ก์ฐ ํ์๋ฉด์ ๊ตฌํํ ํ๋ก์ ํธ์ธ ๊ฒ ๊ฐ์๋ฐ, ๋ญ๊ฐ ๋ด์ฉ์ ๋์ฝ ์ ์๋์ด ์ ๊ณตํด์ฃผ์ ์ ๋ณด์ ๋ํ ํฌ๋ ๋ง์ด ์๋ ๊ฒ ๊ฐ์ ์์ฝ๋ค์.