November 28, 2020
๋ถ์คํธ์บ ํ ํ์ต์คํ๋ฆฐํธ ๋ง์ง๋ง ๋ฏธ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ฐจํธ๋ฅผ ๊ตฌํํ๋ ๋ด์ฉ์ด ์์๋ค. canvas ์ svg ์ค์ ์ ํํด์ ๊ตฌํํ๋ ๊ฒ์ด์๋๋ฐ ์ด๋ฒ ๊ธฐํ์ ๋๋ค ์จ๋ณด๊ณ ์ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ง๋ค์ด๋ณด์! ๋ผ๋ ๊ฐ์ธ์ ์ธ ์์ฌ์ด ์๊ฒผ๋ค. ๊ทธ๋ ๊ฒ Interactive-chart ๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์์ ์๋ฃํ์๊ณ ๋ง๋ค๋ฉด์ ์ต๋ํ ๊ฒ์ ๊ณต์ ํด๋ณด๊ณ ์ ํ๋ค.
์ง์๋ณด๋ค๋ ๊ฒฝํ์ ์์กดํ๋ฏ๋ก ์ ๋ณด๊ฐ ์ฃผ๊ด์ ์ผ ์ ์์ต๋๋ค. ํ๋ฆฐ ์ ๋ณด ์ ๋ณด๋ ์ธ์ ๋ ํ์์ ๋๋ค!
canvas์ svg์ ์ฐจ์ด์ ๊ณผ ๊ฐ๊ฐ ์ด๋ค ๊ฒฝ์ฐ์ ์จ์ผํ๋์ง๋ ์ธํฐ๋ท์ ์ ๋ง ๋ง์ด ํผ์ ธ์์ง๋ง ๊ธ ์๋์๋ ์ธ๊ธํ๋ฏ, ๊ฒฝํ์ผ๋ก ์์กดํด์ ๋ด ์๊ฐ์ ์ ์ด๋ณด๋ คํ๋ค.
๋จผ์ canvas๋ ํ๋์ image์ด๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ค์ผํ ๋ฐ์ดํฐ๊ฐ ์~์ฒญ ๋ง๊ฑฐ๋ ์ธํฐ๋์ ์ด ์์ฃผ ๋ฐ์ํ ๊ฒฝ์ฐ ์ ํฉํ๋ค. ์๋ฅผ๋ค์ด, ์ฃผ์์ฐจํธ์ฒ๋ผ ๋ช๋ ์น ๋ฐ์ดํฐ๊ฐ ํ๋ฉด์ ๋ค ํ์๋์ด์ผํ ๊ฒฝ์ฐ, ๋ช ์ฒ๊ฐ์ element๋ฅผ ๋ง๋๋ ๊ฒ๋ณด๋ค ํ๋์ ์๋ฆฌ๋จผํธ์ ํฝ์ ๋ก ํ์ํ๋ ๊ฒ์ด ํจ์จ์ ์ผ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ svg์ ๊ฒฝ์ฐ, ๋ฒกํฐ๊ทธ๋ํฝ์ด๊ธฐ ๋๋ฌธ์ ์๋ฆฌ์ด์ฑ์ด ์ผ์ด๋์ง ์๋๋ค. ๊ทธ๋์ ์์ด๋ ๊ณก์ ๊ฐ์ ๋ํ์ ๊ทธ๋ฆด ๋ ์ ํฉํ๊ณ , JavaScript๋ก element๋ฅผ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ ์์์ ๋ฐ๊พธ๊ฑฐ๋ ํฌ๊ธฐ๋ฅผ ํค์ฐ๊ฑฐ๋ ๋ณํ ์์ ์ ํ๊ธฐ๋ ์ฉ์ดํ๋ค.
๋๋ ์ด๋ฌํ ํน์ฑ์ ๋ฐ์ํด ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๋ณด์ฌ์ฃผ๋ Line Chart์๋ canvas
๋ฅผ, ์นดํ
๊ณ ๋ฆฌ๋ณ ํผ์ผํธ๋ฐ์ดํฐ๋ฅผ ์ํ์ผ๋ก ๋ณด์ฌ์ฃผ๋ Pie Chart์๋ svg
๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์๋ค.
์ฐ์ Line Chart๋ฅผ ๊ฐ์ฒด๋ก ์ถ์ํ์ํค๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ canvas์ ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ ๊ณผ์ ๋ค์ ๋ฉ์๋๋ก ํ๋ํ๋ ๋ง๋ค์ด์ฃผ์๋ค.
export default class Line {
constructor(chartProps: ChartProps) {
this.initProps(chartProps)
this.insertHTML()
this.initElement()
this.initStyle()
this.initChart()
this.initMinimap()
this.drawChart(this.moveX)
this.drawMinimap(this.moveX)
this.addEventListener()
}
...
}
Line Class๊ฐ ์ธ์คํด์คํ๋๋ฉด ๋๊ธฐ์ ์ผ๋ก ์ด 9๋ฒ์ ๋ฉ์๋๋ฅผ ์คํํ๊ฒ ํ์๋ค. ์ฒ์๋ถํฐ ์ด๋ ๊ฒ ์ค๊ณํ ๊ฑด ์๋๊ณ , ์ฝ๋๊ฐ ๊ธธ์ด์ง๋ฉด์ ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ฒ ๋ฉ์๋๋ก ์ญํ ์ ๋๋ ์ฃผ์๋ค.
์ ์ ๋ฉ์๋ ๋ด์ ์ฝ๋๋ ๊ธธ์ด์ก๋๋ฐ, ๋ฉ์๋๋ฅผ ํ๋ฉด์ ๋ณด์ด์ง ์๋๋ก ์ ์ด๋ ์๊ฐ ์๋ vscode ์ ๊ธฐ๊ธฐ๋ฅ์ ์ด์ฉํ๋๊น ๊ทธ๋ค์ง ์์ ์ด ์ด๋ ต์ง๋ ์์๋ค.
Props๋ฅผ ๊ฐ์ ธ์ ์ฐจํธ ๋ฐ์ดํฐ์ ๋ง๊ฒ ๋ณํ
initProps์์๋ Props์ ๋์ด์จ ์ ๋ณด๋ค์ ์ค์ ์ฐจํธ field๋ก ๋ฃ์ด์ฃผ๋ ๋จ๊ณ๋ก, selector๋ช ์ด๋, ์ฐจํธ์ด๋ฆ, Props ์ ๋์ด์จ data๋ฅผ ์ฐจํธ๊ฐ ๊ทธ๋ฆฌ๊ธฐ ์ฌ์ด ๋ฐ์ดํฐํ์์ผ๋ก ๋ณํํด์ field์ ์ ์ฅํด์ฃผ์๋ค.
ํ์ํ element ์์ฑ ๋ฐ ์ฝ์
ํ์ํ ์๋ฆฌ๋จผํธ๋ค์ ๋ฌธ์์ด๋ก root ์๋ฆฌ๋จผํธ์ ์ฝ์ ํด์ฃผ์๋ค. ์๋ฆฌ๋จผํธ๋ค์ ๋์ค์ ์ธํฐ๋์ ์ ์ํด์ ๊ณ ์ ์ selector๋ฅผ ๊ฐ์ ธ์ผํ๋๋ฐ Props๋ก ๋์ด์จ root ์ ํ์ ์ด๋ฆ๊ณผ ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ์ด์ฉํด์ ๊ณ ์ ์ selector๋ฅผ ๋ง๋ค์ด์ฃผ์๋ค.
element์ ์ ๊ทผํด์ this.elements์ ์ ์ฅ
๋์ค์ element์ ์ ๊ทผํ๊ธฐ ์ฝ๊ณ ๋ค์ ํ์ํ๋ ๋ถํ์ํ ์์ ์ ํ๊ธฐ ์ซ์ด์ ํ๊บผ๋ฒ์ elements์ ์ ์ฅํด์ฃผ์๋ค.
element๋ค์ ์คํ์ผ ๋ถ์ฌ
element ์คํ์ผ์ ๋ชจ๋ ์ธ๋ผ์ธ ์คํ์ผ๋ก ์ ์ฉํด์ฃผ์๋ค. ์ฐ์ ์ ์ ํ์๊ฐ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ์ ํ์ ์ด๋ฆ์ ๋ง๊ฒ ๋ง๋ค์ด์ง๊ธฐ ๋๋ฌธ์ CSS๋ก ์์ ํ๊ธฐ ์ ๋งคํ๊ณ , ์ธ๋ผ์ธ์ผ๋ก ํ๋ฉด ์ ํ์ ์ค๋ณต์ผ๋ก ์ธํ ์๋ฌ๊ฐ ๋ฐ์ํ ํ๋ฅ ๋ ์ ์ด์ element.style์ ์ด์ฉํด์ ์คํ์ผ์ ์ ์ฉํด์ฃผ์๋ค.
์ฐจํธ, ๋ฏธ๋๋งต ๊ด๋ จ ํฌ๊ธฐ ์ ๋ณด ์ด๊ธฐํ
canvas ์๋ฆฌ๋จผํธ์ width, height๋ฅผ ์ง์ ํด์ฃผ๋ ์์ ๊ณผ canvas์ ์ค์ ํฌ๊ธฐ (DOM ํฌ๊ธฐ)๋ฅผ ๊ณ์ฐํด์ ์ ์ฅํด์ฃผ๋ ์์ ์ ์ํํ์๋ค.
์ค์ ๋๋ก์
canvas.getContext(โ2dโ)๋ฅผ ์ด์ฉํด์ ์ค์ ๋ก ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ ๋ฉ์๋.
์ฐจํธ ์ด๋ฒคํธ๋ฆฌ์ค๋ ์ถ๊ฐ
๋ง์ฐ์ค ์ด๋๋ถํฐ ๋๋๊ทธ๊น์ง ์ฌ์ฉํ๋ ๋ชจ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ฌ๊ธฐ์ ๋ฑ๋กํด์ฃผ์๋ค.
9๋จ๊ณ๋ก ๋๋๊ธดํ์ง๋ง ์ฝ๋๊ฐ ๊ธธ์ด์ง๊ณ ๋ฉ์น๊ฐ ์ปค์ง๋ฉด์ ์ฝ๋๋ฅผ ์์ ํ๊ธฐ ๋ถํธํด์ก๋ค. ๊ทธ๋๋ ์ปค๋ฒํ ์ ์๋ ์์ค์ ์์ ์ด์ด์ ํ๋์ ํ์ผ๋ก ์์ ์ ํ๊ธด ํ์ง๋ง, draw๋ถ๋ถ์ด๋ event๋ถ๋ถ์ ๋ฐ๋ก ํ์ผ์ ๋ถ๋ฆฌํด์ ๊ด๋ฆฌํ๋ ๊ฒ ์ข์ ๊ฒ ๊ฐ๋ค.
๋ํ, ์์๋ค๋ ์ ์ญ์ผ๋ก ๋นผ์ฃผ๋ฉด ๋ ์ข์ ํ ๋ฐ, ๋ฉ์๋ ๋ด์์ ์ ์ธํ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ณณ๊ณณ์ ๋งค์ง๋๋ฒ๋.. ์์ง ์กด์ฌํ๋ค. ๐
๐ drawChart ๋ฉ์๋์์ ๋ณ์๋ค์ด ์ ์ธ๋๊ณ ์๋ค..(ใ )
ํ๋ก์ ํธ ์ ์ฒด ๋ฐ๋๋ผ์ธ์ด 2์ฃผ์๊ณ , ๊ทธ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊น์ง ๋ง๋ค์ด์ ์ ์ฉ๊น์ง ํ์ด์ผํด์, ๊ตฌํ์์ฃผ๋ก ์งํํ๊ณ ์ฑ๋ฅ์ ํ๋๋ ๊ณ ๋ ค๋ฅผ ๋ชปํ๋ค. (ใ ใ x100) ๊ทผ๋ฐ ๊ตฌํ์์ฒด๊ฐ ๋ชฉํ์๊ณ , ๋ด๊ฐ ์๊ฐํ ๋์์ธ ๊ทธ๋๋ก ๋ง๋ ๊ฒ ๊ฐ์์ ๋ง์กฑํ๋ค!
์ด๋ฒ์ Line Chart๋ฅผ ๋ง๋ค๋ฉด์ canvas์ ๋ํด์๋ ๋ ๋ง์ด ์๊ฒ ๋์ด์ ์ข์๋ค.
canvas๋ ์ด๋ฏธ์ง์ธ์ง๋ผ ์ค์ ํฌ๊ธฐ์ ํด์๋๊ฐ ๋ณ๋๋ก ์กด์ฌํ๋ค. canvas์ width,height ์์ฑ์ ํด์๋๋ฅผ ์๋ฏธํ๊ณ , canvas ์๋ฆฌ๋จผํธ์ style๊ฐ์ width๋ ์ค์ ํฌ๊ธฐ๋ฅผ ์๋ฏธํ๋ค. ๊ธฐ๋ณธ ํด์๋๋ 300 x 150์ด๋ฉฐ, ๊ณ ํด์๋์ ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ ค๋ฉด ๋ณ๋๋ก width, height๋ฅผ ๋ถ์ฌํด์ฃผ์ด์ผํ๋ค.
svg๋ ํ ์คํธํด๋ดค๋๋ฐ ๋ฒกํฐ๋ผ ๊ทธ๋ฐ์ง width์ style.width๊ฐ ์ค๋ฒ๋ผ์ด๋ฉ ๋๋ฉด์ ํ๋๋ง ์ ์ฉ๋์๋ค.
DOM์ ๊ฒฝ์ฐ translate๋ scale๊ฐ์ ์ ๋๋ฉ์ด์ ์์ ์ ํ๋ฉด ์ ํ๋ ์๋ฆฌ๋จผํธ๋ง ๋ณํํ๊ณ ๋ฐฐ๊ฒฝ(๋๋จธ์ง ์๋ฆฌ๋จผํธ๋ค)์๋ ์ํฅ์ ์ฃผ์ง ์๋๋ค. ์ฆ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ณ๊ฒฝ๋ ์๋ฆฌ๋จผํธ๋ง ๋ณ๊ฒฝ๋๋๋ก ์๋์ผ๋ก ํด์ฃผ์ง๋ง, canvas๋ ์ ๋๋ฉ์ด์ ํ ๊ฒฝ์ฐ, ๋ฐฐ๊ฒฝ์ ๋ฎ์ด์์ ์ํฅ์ ์ค๋ฒ๋ฆฐ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฐฐ๊ฒฝ์ ๊ธฐ์ตํด์ ๋ค์ ๊ทธ๋ ค์ค๋ค๋์ง ํด์ค์ผํ๋ค.
์ค์ ๋ก canvas API์๋ save, restore๋ก ์ํ๋ฅผ ์คํ์ผ๋ก ์ ์ฅํด๋ ์ ์๋ค.
์ด๋ฒ Line Chart์ ๊ฒฝ์ฐ ๋น๋ก์์ด ๋๊ฒ ๋ง์ด ์ฐ์๋ค. ์๋ฅผ๋ค์ด, ์ฐจํธ๋ฅผ ํด๋ฆญํ๊ณ ๋ง์ฐ์ค๋ฅผ ์กฐ๊ธ ์์ง์์ ๋, ์ค์ ๋ง์ฐ์ค๊ฐ ์์ง์ธ ๊ฑฐ๋ฆฌ๋ฅผ ์ค์ ์ฐจํธ์ ํด์๋์ ๋น์จ๋ก ๋ฐ๊ฟ์ค์ผํ๊ณ , ๋ฏธ๋๋งต๋ ๋ฐ๊ฟ์ค์ผํด์ ๋ฏธ๋๋งต์ ํด์๋์ ๋น์จ๋ก๋ ๋ฐ๊ฟ์ค์ผํ๋ค. ๊ทผ๋ฐ ์ฐจํธ์ ๋ฏธ๋๋งต์ ๋ชจ๋ canvas ๋ด๋ถ์ ์์ฒด ํจ๋ฉ์ ๊ฐ์ง๊ณ ์์ด์ ์๋ค๋ค๋ ๋ค ๊ณ์ฐํด์ฃผ์ด์ผํ๋ค.
์ฐจํธ์ ๋ฏธ๋๋งต์ด ์๋ก ๋ฐ์ธ๋ฉ๋์ด์์ด์ ์ฐจํธ์์ ์ผ์ด๋ ์ด๋ฒคํธ๋ ๋ฏธ๋๋งต์๋ ์ ์ฉ๋๊ณ , ๋ฏธ๋๋งต์ ์ ์ฉ๋ ์ด๋ฒคํธ๋ ์ฐจํธ์๋ ์ ์ฉ๋๋ค.
์ฒ์์๋ ํ๋ํ๋ ๊ณ์ฐํ๋ค๊ฐ ๋ด ๋จธ๋ฆฌ์ ํ๊ณ๋ฅผ ๋๋ผ๊ณ ๋ฐ๋ก ์ ํธํจ์๋ก ๋นผ์ ๊ณ์ฐ์ด ํ์ํ ๋๋ง๋ค ํจ์๋ฅผ ๋ถ๋ฌ์ ์จ์ฃผ์๋ค. ์ญ์, ๋ฐํด๋ฅผ ๊ณ์ ๋ฐ๋ช ํ ํ์๊ฐ ์๋๋ฐ ๊ดํ ๊ณ ์์ ๊ณ์ ํ์๋ ๊ฒ ๊ฐ์๋ค.ใ
// ์ง์ ๋ง๋ค์ด๋ณธ resize utils
export const trueLengthToCanvasLength = (trueLength, canvasSize, trueSize) => {
return (trueLength * canvasSize) / trueSize
}
export const canvasLengthToTrueLength = (
canvasLength,
canvasSize,
trueSize
) => {
return (canvasLength / canvasSize) * trueSize
}
export const chartLengthToMinimapLength = (
chartLength,
chartSize,
minimapSize,
visibleRatio
) => {
return chartLength * (minimapSize / chartSize) * visibleRatio
}
export const minimapLengthToChartLength = (
minimapLength,
chartSize,
minimapSize,
visibleRatio
) => {
return ((minimapLength / minimapSize) * chartSize) / visibleRatio
}
๊ณ์ ์ํ์ ์ธ ๊ณ์ฐ์ ํ ํ์์์ด, ์ ํธํจ์๋ฅผ ๋ง๋ค์ด๋๋ฉด ํจ์๋ช ๊ณผ ํ๋ผ๋ฏธํฐ๋ง ์ ์ ํ ๋ฃ์ด์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
๋ง์ฐ์คํฌ์ธํฐ์๋ฐ๋ผ ์ด๋ํ๋ x์ถ, y์ถ ์ ์ ๊ณผ ํ์ฌ ๋ง์ฐ์คํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์ (vertext)์ ๋ํ ์ ๋ณด๋ canvas๋ฅผ ์ด์ฉํ์ง ์๊ณ DOM element๋ฅผ ์ด์ฉํด์ ๋ง๋ค์๋ค. ์ฌ์ค ์ ๋ถ๋ค canvas๋ก ํํํ ์๋ ์์ง๋ง, ์ค์ ์ฐจํธ๋ canvas๋ก๋ง ํํํ๊ณ , ๊ทธ์ธ์ tooltip์ ๋ฐ๋ก DOM element๋ก ๋ง๋๋ ๊ฒ ์ญํ ๋ ๋๋ ์ ์๊ณ , ๊ตฌํํ๊ธฐ์๋ ๋ ์์ํ ๊ฒ ๊ฐ์๋ค.
์์ ๋์ ํ๋ก์ ํธ๋ฅผ ๋ณต๊ธฐํ๋ฉด์ ์ ์ผ ๋ง์ด ๋๊ผ๋ ์ ์ ์๊ฐ์ด ์ง๋๋ฉด ๋ด๊ฐ ์ด ์ฝ๋๋ ๊น๋จน๋๋ค๋ ์ ์ด์๋ค..!! ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค ๋๋ ๊ธฐ๊ฐ๋ ์งง๊ฒ ์ก๊ณ ๋ชจ๋ ์ ์ ์ด ๊ฑฐ๊ธฐ์ ๋ชฐ์ ์ด ๋์ด์์ด์ ํ๋ฃจ๊ฐ ์ง๋์ ๋ค์ ์ฝ๋๋ฅผ ๋ด๋ ๋ค ์ดํดํ๊ณ , ๋ฒ๊ทธ๋ฅผ ์์ ํ ๋๋ ์ด๋ ๊ณ ์ณ์ผํ ์ง ๋ฐ๋ก๋ฐ๋ก ๋์๋๋ฐ, ๋๋ฌ์ด ์ง๋ ์ง๊ธ๋ณด๋๊น ๋ด๊ฐ ์ง ์ฝ๋์์ด๋ ์ฝ๋๋ฐ ์๊ฐ์ด ๊ฝค ๊ฑธ๋ ธ๋ค. ์ฝ๋๋ฅผ ์ ๋ชป์ง์ ๊ทธ๋ฐ ๊ฒ์ผ์๋ ์๋๋ฐ ์ด์จ๋ ์ธ๊ฐ์ ๋ง๊ฐ์ ๋๋ฌผ์ด๋๊น ํ๋ก์ ํธ์งํ ์ค์ด๋ ํน์ ๋ง๋ฌด๋ฆฌํ๋ ์์ ์, ๊ผญ ๋ณต๊ธฐํ๋ฉด์ ๋ฌธ์ํํด๋๋ ๊ฒ ์ข๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
์ ๋ฐฐ๊ฐ๋ฐ์๋ถ๋ ํ๋ก์ ํธ๋ฅผ ํ ๋, ์ธ์์ธ๊ณ๋ฅผ ์ผ๋์ ๋๊ณ ์์ ํ๋ ๊ฒ์ด ์ข๋ค๊ณ ๋ง์ํด์ฃผ์ จ๋๋ฐ ๊ทธ ๋ง์์ ์๋๋ฅผ ํ์คํ ์ดํดํ ์ ์์๋ค.
ํ๋ก์ ํธ ๋ณต๊ธฐ, ๋ฌธ์์ ๋ฆฌ๋ ํ์ธ์ด ์๋์ฌ๋ ๋ฏธ๋์ ๋์๊ฒ๋ก์ ์ธ์์ธ๊ณ๋ฅผ ์ํด์๋ ๊ผญ! ํด์ฃผ์. ๐
๊ธํ๊ฒ ๋ง๋ค์ด์ ์์ฌ์ด์ ๋ ๋ง๊ณ ๊ฐ์ ์ ๋ ๋๋ฌด๋๋ฌด ๋ง์ด ๋ณด์ด์ง๋ง, ๊ธฐ์กด์ ์๋ ์ฐจํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ง์ canvas์ svg๋ฅผ ์ฌ์ฉํด์ ์ฐจํธ๋ฅผ ๋ง๋ ๊ฒฝํ์ canvas, svg์ ๋ํ ๊ณตํฌ(?)๋ฅผ ์ค์ฌ์ฃผ์๊ณ , ์์ผ๋ก canvas๋ svg๋ฅผ ์ธ ์ผ์ด ์์ ๋, ํฐ ๋์์ด ๋ ๊ฒ ๊ฐ๋ค!!
PS. ์ด๋ฒ ๊ธ์์๋ canvas๋ฅผ ์ด์ฉํ Line Chart๋ง ๋ค๋ค์ง๋ง, ๋ค์์๋ svg๋ฅผ ์ด์ฉํ Pie Chart์ ๋ํด์ ๋ฐฐ์ด ๋ด์ฉ์ ์ ๋ฆฌํด๋ด์ผ๊ฒ ๋ค.! (๋ณต๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ๋ฏธ๋ฆฌ ํด๋์!๐)