Heap-Tracker๋ ์ ์ ๊ฐ ์ ๋ ฅํ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์ ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ฐจํธ๋ก ์๊ฐํํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ค.- ์ต๋, ์ต์ ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ฐ ๋ฐํ์ ์๊ฐ ๋ฑ ์ฌ๋ฌ ์ ๋ณด๋ฅผ ์ฐจํธ์ ํจ๊ป ์ ๊ณตํฉ๋๋ค.
-
- 1. ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ด๋ป๊ฒ ์ธก์ ํ๋๊ฑธ๊น?
- 2. ์ฌ์ฉ์ ์ฝ๋๋ฅผ ์คํํ๋ฉด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ธก์ ํ๋๋ฒ?
- 3. ๋ฉ๋ชจ๋ฆฌ ์ธก์ ๊ฐ ์ฐจํธ๋ก ํํ
- 4. ์ผ๋ ํธ๋ก ์ ์ ํํ ์ด์
- 5. ์ฐจํธ์ ํจํด ๋ฐ ์๊ด ๊ด๊ณ ํ์ ์ ์ํ UI/UX ๊ณ ๋ฏผ
- 6. ์ฐจํธ ํด๋์ค๋ฅผ ๊ฐ์ ๋ฐฉํฅ
| ๊ธฐ๋ณธ ํ๋ฉด | ๋ฉ๋ชจ๋ฆฌ ์ธก์ ํ ์ฐจํธ ํํ ํ๋ฉด |
|---|---|
![]() |
![]() |
| ๊ตฌ๋ถ | ๊ฐํ์ค | ์ ์ฌ์ฒ | ์ต์๋ฆฐ |
|---|---|---|---|
| AST Code Parsing | 10% | 70% | 20% |
| Memory Tracker | 70% | 10% | 20% |
| VM ํ๊ฒฝ ์ฝ๋ ์คํ | 20% | 10% | 70% |
| Canvas API Chart Drawing | 33% | 33% | 33% |
| Chart Animation | 40% | 40% | 20% |
| Electron ํ๊ฒฝ ๊ตฌ์ถ | 20% | 10% | 70% |
| ์ธ๋ถ์ ๋ณด ํ์ ์๋์ฐ | 10% | 20% | 70% |
| UI / UX | 20% | 60% | 20% |
- ๋ฉ๋ชจ๋ฆฌ ์ธก์ ์ ์ํ ์ฌ์ฉ์ ์ฝ๋๋ฅผ ํจ์ ์ฝ๋์ ์ ๋ ฅํฉ๋๋ค.
- ํจ์ ์คํ ์ฝ๋์ ์์ฑํ ํจ์์ ๋งค๊ฐ๋ณ์๋ฅผ ์ถ๊ฐํ์ฌ ์ ๋ ฅํฉ๋๋ค.
- ์คํ ๋ฒํผ์ ๋๋ฌ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค.
- ์ฝ๋๊ฐ ์คํ๋๋ฉด ์๋ ์คํ ๊ฒฐ๊ณผ์ฐฝ์ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค. ์คํ ์ค๋ฅ๊ฐ ๋๋ค๋ฉด ๋นจ๊ฐ๊ธ์จ๋ก ์ถ๋ ฅ๋ฉ๋๋ค.
- ์ฝ๋ ์คํ์ด ์๋ฃ๋์์ผ๋ฉด ์ธก์ ๋ ๋ฉ๋ชจ๋ฆฌ์ ๊ธฐ๋ณธ ์ ๋ณด๋ค(ํจ์์คํ ์๊ฐ, ์ฌ์ฉ๋ ๋ฉ๋ชจ๋ฆฌ, ์ธก์ ๊ฐ์ฒด์ ๊ฐฏ์)์ด ์ฐ์ธก์ ์ถ๋ ฅ๋ฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์ธก์ ๊ฒฐ๊ณผ๋ฅผ Chart Result์ ํ ๊ธ ๋ฒํผ์ ํตํด
bytes, us(micro seconds)์Kilo bytes, ms(milli seconds)๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. - Chart ์๋์ ์์, ์ผ์์ ์ง, ์ ์ง ๋ฒํผ์ผ๋ก ์ฐจํธ๋ฅผ ๋์ ์ ๋๋ฉ์ด์ ์ผ๋ก ๋์ํฉ๋๋ค.
- ์ฐจํธ์ ์์์ ๋ง์ฐ์ค ํฌ์ธํฐ๋ฅผ ๊ฐ์ ธ๊ฐ ํด๋น ์์์ ์ธ๋ถ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
- ์ฐจํธ ์ฐ์ธก ์๋จ์ ์ปฌ๋ฌ ํ๋ ํธ๋ฅผ ๋๊ตฌ๋ฅผ ํตํด ์ฐจํธ Liner๊ณผ bar์ ์์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
- ์ค์ ์๋จ์ ์ปฌ๋ฌํ ๋ง ์ฝค๋ณด๋ฐ์ค ์ปจํธ๋กค์ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ Color Theme๋ฅผ ๋ณ๊ฒฝํ ์์์ต๋๋ค.
Node.js ํ๊ฒฝ์์ V8 ์์ง์ด ๊ด๋ฆฌํ๋ ๋ฉ๋ชจ๋ฆฌ๋ ํฌ๊ฒ Stack๊ณผ Heap์ผ๋ก ๋๋ ์ ์์ต๋๋ค.
์ถ์ฒ : ๐ Visualizing memory management in V8 Engine (JavaScript, Node.js, Deno, WebAssembly)
| ๊ตฌ๋ถ | Stack | Heap |
|---|---|---|
| ๋ด์ฉ | - ๋ฉ์๋, ํ๋ ์, ๊ธฐ๋ณธ๊ฐ ๋ฐ ๊ฐ์ฒด์ ๋ํ ํฌ์ธํฐ๋ฅผ ํฌํจํ ์ ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ๊ณต๊ฐ - V8์์ฒด๊ฐ ์๋ ์ด์์ฒด์ ์ ์ํด ๊ด๋ฆฌ๋ฉ๋๋ค. |
- ๊ฐ์ฒด ๋๋ ๋์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ์
๋๋ค. - ๋ฉ๋ชจ๋ฆฌ ์์ญ์์ ๊ฐ์ฅ ํฐ ๋ธ๋ก์ด๋ฉฐ Garbage Collection(GC) ์ด ์ผ์ด๋๋ ๊ณณ์
๋๋ค.- OS์์ ์๋์ผ๋ก ๊ด๋ฆฌ๋์ง ์์ต๋๋ค. |
Stack๊ณผ Heap์ ๋ฉ๋ชจ๋ฆฌ ์ฑ๊ฒฉ์ผ๋ก ๋ณด์ ์ฌ์ฉ์์ ์ฝ๋๊ฐ ์คํ๋๊ณ ์ํ๋๋ ๊ณผ์ ์์ ๋์ ์ผ๋ก ์์ฑ๋๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ธก์ ํ๊ณ ์ถ์ ์ฐ๋ฆฌ์ ๋ชฉํ์๋ ์ ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ Stack์ด ์๋ ๋์ ๋ฐ์ดํฐ์ ์ ์ฅ๊ณผ Garbage Collection์ด ์ํ๋๋ Heap ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด๋ผ๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค.
| ๊ตฌ๋ถ | ์ค๋ช |
|---|---|
| process.memoryUsage() - ์ ํ |
๋ฐ์ดํธ ๋จ์๋ก ์ธก์ ๋ Node.js ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค๋ช
ํ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ง์ํด์ ๊ด์ธกํ๊ณ ์ถ์๋ ๊ธฐํ ์๋๋ก์ ์ ํฉํ๋ค๊ณ ์๊ฐํ์ฌ ์ ํํ๊ฒ ๋์์ต๋๋ค. |
| writeHeapSnapShot() - ํ๋ฝ |
V8 ์์ง์ ์ค๋
์ท์ ์์ฑํฉ๋๋ค. ๋จ, ํด๋น ํ์ผ์ ํฌ๋กฌ ๊ฐ๋ฐ์ ๋๊ตฌ์ ํจ๊ป ์ฌ์ฉํ๊ธฐ ์ํ ๊ฒ์ด๋ฉฐ ํ ์ค๋ ์ท์ ์์ฑํ๋ ค๋ฉด ์ค๋ ์ท์ด ์์ฑ๋ ๋ ํ ํฌ๊ธฐ์ ์ฝ ๋ ๋ฐฐ์ ํด๋นํ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ง์์ ์ผ๋ก ๊ด์ธกํ๊ณ ์ถ์๋ ๊ธฐํ ์๋์ ๋ง์ง ์์ ์ฌ์ฉํ์ง ๋ชปํ์ต๋๋ค. |
๋ฉ๋ชจ๋ฆฌ ์ธก์ ํจ์๋ฅผ ์คํํ๋ ํ์ด๋ฐ์ ๋ํ ์์ด๋์ด๋ 2๊ฐ๊ฐ ์์์ต๋๋ค.
์ฝ๋๋ฅผ ์คํ๊ณผ ๋์์ setInterval์ ํ์ฉํ์ฌ ๋ฐ๋ณต์ ์ผ๋ก process.momoryUsage()๋ฅผ ์คํ์ํค๋ ๋ฐฉ๋ฒ
๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์ ์ฝ๋์ process.momoryUsage()๋ฅผ ์ฝ์
ํ์ฌ ์ฌ์ฉ์ ์ฝ๋๋ฅผ ์ฌ์์ฑ ํ ์คํ์ํค๋ ๋ฐฉ๋ฒ์ด์์ต๋๋ค.
| ๊ตฌ๋ถ | setInterval ํ์ฉ | ์ฝ๋ ๋ด ์ธก์ ํจ์ ์ฝ์ |
|---|---|---|
| ์ฅ์ | ์ฌ์ด ๊ตฌํ๊ณผ ์ฌ์ฉ ์ธก์ ๊ฐ์ ์ผ์ ํ ํ์ด๋ฐ |
๋ณ์์์ฑ, ํจ์์ฌ์ฉ ๋ฑ ์๋ฏธ ์๋ ์์ ์ ๋ฉ๋ชจ๋ฆฌ ์ธก์ ๊ฐ๋ฅ |
| ๋จ์ | ์ธก์ ๊ฐ์ ๋ํ ์์ธ์ ์ฐพ๊ธฐ ๋ถ๊ฐ๋ฅ | ๋ณ๋์ ์ฌ์ฉ์ ์ฝ๋ ํ์ฑ ๊ณผ์ ํ์ |
๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ฑ๋๋ ๊ฐ์ฒด ์์ฑ, ํจ์ ์คํ, ๊ฐ ๋ด๋ถ ๊ฐ์ฒด์ ๋งค์๋ ์ฌ์ฉ ๋ฑ ์๋ฏธ ์๋ ์์ ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ธก์ ํ๊ธฐ ์ํด์ ์ฌ์ฉ์ ์ฝ๋์ ๋ฉ๋ชจ๋ฆฌ ์ธก์ ํจ์๋ฅผ ์ฝ์ ํ๋ ๋ฐฉ๋ฒ์ ์ ํํ๊ฒ ๋์์ต๋๋ค.
์ฌ์ฉ์ ์ฝ๋์ ๋ฉ๋ชจ๋ฆฌ ์ธก์ ํจ์๋ฅผ ์ฝ์ ํ๋ ๋ฐฉ๋ฒ์ String ๋งค์๋๋ฅผ ์ด์ฉํ๋ฉด ๋ฉ๋๋ค. ์ ๋ง ์ค์ํ ๊ฒ์ ์ฝ๋์ ์ด๋ ์์น์ ๋ฉ๋ชจ๋ฆฌ ์ธก์ ํจ์๋ฅผ ์ฝ์ ํ ๊ฒ์ธ๊ฐ์ ๋ํ ๋ฌธ์ ์์ต๋๋ค.
๋จผ์ Javascript์ ์ฃผ์ ๋งค์๋, ์ฐ์ฐ์, ๋ณ์ ์ ์ธ๋ค์ ์ฐพ์ ํด๋น ์ฝ๋ ์์ ์ฝ์
ํ์ฌ ์คํ์ํค๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ๊ตฌ์ํ์ต๋๋ค.
ํ์ง๋ง ์ ํฌ๊ฐ ๊ณต๋ถ๋ฅผ ํ๋ฉด์ ์ฌ์ฉํ๋ ๊ฐ๋จํ ์๊ณ ๋ฆฌ์ฆ ์ฝ๋์ ํธ์ง ์๋์์๋ ์์ธ์ฒ๋ฆฌ ํด์ผ ํ ์์๋ค์ด ๋๋ฌด ๋ง์๊ณ ํ์ดํ ํจ์์ Map, Array, String๊ณผ ๊ฐ์ ์ฃผ์ ํ์ค ๋ด์ฅ ๊ฐ์ฒด์ ์์ธ์ฒ๋ฆฌ๊ฐ ์ด๋ ค์ ์ต๋๋ค.
Javascript ์ฝ๋๋ฅผ ๋ถ์ํ๊ธฐ ์ํด ๋ง์ ์กฐ์ฌ๋ฅผ ํ๋ ๋์ค AST ํ์์ ์๊ฒ ๋์๊ณ ํ์ต์ ํตํด ์ฐ๋ฆฌ ํ๋ก์ ํธ์ ์์ฉํ ์ ์์์ง ๊ฒํ ํ๊ฒ ๋์์ต๋๋ค.
| ๊ตฌ๋ถ | ๋ฌธ์์ด ํ์ฑ | AST ์ฌ์ฉ |
|---|---|---|
| ์ฅ์ | ์ฌ์ด ๊ตฌํ๊ณผ ์ฌ์ฉ | ๊ตฌ์กฐํ๋ ํจํด ๊ฐ์ฒด๋ฅผ ํตํด ์๋ฏธ ์๋ ๊ฐ์ ์ ๊ทผ ๊ฐ๋ฅ |
| ๋จ์ | ๋ฌด์ํ ๋ง์ ์์ธ์ฒ๋ฆฌ | AST ๊ตฌ์กฐ ์ดํด์ ์ด๋ ค์ |
AST๋ฅผ ๊ตฌํํ acorn ์ด๋ผ๋ Open Source Library๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ฝ๋๋ฅผ ํ์ฑํ ํ ์ฝ๋๋ฅผ AST ๊ตฌ์กฐ์ ๋ด์ ์ ์๊ฒ ๋์์ต๋๋ค.
Tree ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ๋ถ์ํ์ฌ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์๋ฏธ ์๋ ์ฝ๋ ์์น์ ์ ๊ทผํ ์ ์์์ต๋๋ค.
| ๊ตฌ๋ถ | acorn Library Site | AST๋ก ํ์ธํ ์ ์๋ ์ ๋ณด |
|---|---|---|
| ๋ด์ฉ | - AST acorn Library - AST Tree ๋ณํ Test |
- ํ์
- ํด๋น ์ฝ๋์ ์์, ๋ ์์น - ์ด๋ฆ - ๊ฐ - ๊ณ์ธต ๊ด๊ณ ๋ฑ |
ํด๋น ์์๋ acorn ์ด๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ, ์ฝ๋๋ฅผ ๋ถ์ํ ๊ฒฐ๊ณผ์
๋๋ค. ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ง ๊ฐ์ฒด ์์ ์ฌ๋ฌ ๊ฐ์ง ์ ๋ณด๊ฐ ๋ด๊ฒจ ์์์ ํ์ธํ ์ ์์ต๋๋ค.
// ์์์ฝ๋
function add(a, b) {
return a + b;
}// ์์์ฝ๋๋ฅผ ASTํธ๋ฆฌ๋ก ๋ณํํ ๊ฒฐ๊ณผ
{
"type": "FunctionDeclaration",
"start": 0,
"end": 37,
"id": {
"type": "Identifier",
"start": 9,
"end": 12,
"name": "add"
},
"params": [
{
"type": "Identifier",
"start": 13,
"end": 14,
"name": "a"
},
{
"type": "Identifier",
"start": 16,
"end": 17,
"name": "b"
}
],
"body": {
"type": "BlockStatement",
"start": 19,
"end": 37,
"body": [
{
"type": "ReturnStatement",
"start": 22,
"end": 35,
"argument": {
"type": "BinaryExpression",
"start": 29,
"end": 34,
"left": {
"type": "Identifier",
"start": 29,
"end": 30,
"name": "a"
},
"operator": "+",
"right": {
"type": "Identifier",
"start": 33,
"end": 34,
"name": "b"
}
}
}
]
}
}ํด๋น ์์๋ AST๋ฅผ ํ์ฉํ์ฌ ์ฌ์ฉ์ ์ฝ๋๋ฅผ ์ฌ์์ฑํ ์ฝ๋ ๋น๊ต์
๋๋ค.
| ๊ตฌ๋ถ | ์ ๋ ฅ๋ ์ฌ์ฉ์ ์ฝ๋ | AST ํ์ฑํ ์ฌ์์ฑํ ์ฌ์ฉ์ ์ฝ๋ |
|---|---|---|
| ๋ด์ฉ | ![]() |
ใ![]() |
๋ฐํ์ ์ค ์ฌ์ฉ์ ์ฝ๋๋ฅผ ์คํํ๋ ๋ฐฉ์์ eval, new Function, VM ๋ฑ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ํ์ฌ ํ๋ก์ ํธ๋ ๋ฐ์คํฌํฑ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ผ ์ฌ์ฉ์ ๋ณธ์ธ์ ์ปดํจํฐ ์์์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ณด์์์ ๋ฌธ์ ๋ ์์ง๋ง, ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋๋ฉด ์ฌ์ฉ์ ๊ฒฝํ์ ๋ถํธํจ์ ์ด๋ํ ์ ์์ด ๊ฐ์ ํ๊ฒฝ์์ ์ฝ๋๋ฅผ ๋์์ํค๋ VM์ ์ ํํ๊ฒ ๋์์ต๋๋ค.
VM ๊ฐ์ํ๊ฒฝ์์ ์ฌ์ฉ์ ์ฝ๋๋ฟ๋ง ์๋๋ผ ๋ฉ๋ชจ๋ฆฌ ์ธก์ ํจ์๋ฅผ ์คํํ์ฌ ์ ๋ณด๋ฅผ ์ ์ฅ ํ๋ ๊ฒ์ด ๋ชฉํ์์ต๋๋ค. ๊ทธ๋์ ๋ฐฐ์ด ์๋ฃ๊ตฌ์กฐ์ ์ฌ์ฉ๋ ๋ฉ๋ชจ๋ฆฌ, ํจ์๊ฐ ์คํ๋ ์๊ฐ ๋ฑ์ ํฌํจํ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ธฐ ์ํด ํด๋ก์ ๋ฅผ ์ด์ฉํ ํจํด๊ณผ ์์ฑ์ ํจ์๋ก ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ ๋ฐฉ์์ ๊ณ ๋ฏผํ์ต๋๋ค. ์์ฑ์ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ํธ์ด ์ฝ๋์ ์ ์ง๋ณด์ ์ธก๋ฉด์์ ๋ ์์๋ณด๊ธฐ ์ฝ๊ณ ์ฌ์ฉํ๊ธฐ ์ฝ๋ค๋ ํ๋จ์ ํ์ฌ ์์ฑ์ ํจ์๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ธก์ ํ ์ ์๊ฒ ๊ตฌํํ์์ต๋๋ค.
const newTracking = {
count: this.count,
totalMemory: process.memoryUsage().heapTotal,
usedMemory: process.memoryUsage().heapUsed,
timeStamp: process.hrtime.bigint(), // new Date().getTime(), // ms -> ns
startLine: start,
type: type,
codePosition,
codeType,
};๋ฉ๋ชจ๋ฆฌ ์ธก์ ํจ์๊ฐ ์คํ๋๋ ์๊ฐ์ฐจ๋ฅผ ๊ตฌํ๋ ค๊ณ Date๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์์ต๋๋ค. ํ์ง๋ง ์๊ฐ์ฐจ์ด๊ฐ 1ms ์ดํ์ ๋จ์๋ผ์ ์์ ๊ฐ์ ๋ฐฉ์์ ์์ฑ๋ ๊ฐ์ฒด ๊ฐ์ ์๊ฐ์ฐจ๋ฅผ ์ ์ ์์์ต๋๋ค. ๊ทธ๋์ Node.js์ process.hrtime.bigint() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋๋
ธ์ด ๋จ์๋ก ๊ธฐ๋กํด์ ๊ฐ ๊ฐ์ฒด ์๊ฐ์ฐจ๋ฅผ ๊ตฌํ์ต๋๋ค.
์ซ์๋ก ๊ฐ๋ ํ ๋ฉ๋ชจ๋ฆฌ ์ธก์ ๋ฐ์ดํฐ๋ ์ ์ง์ ์ผ๋ก ์ฆ๊ฐํ๋ ์ซ์์ผ ๋ฟ ์๋ฏธ๋ฅผ ํด์ํ ์๊ฐ ์์์ต๋๋ค. ๋ํ, ๊ฐ์ ๋จ์๊ฐ ๋์ ์๋ฆฟ์์ ๋ณํ๋ ์์์ฑ๊ธฐ ์ด๋ ค์ ์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ ์ธก์ ๋ฐ์ดํฐ๋ ๋จ์ํ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ์ฉ ์์น๊ฐ ๋ด๊ฒจ์์ง๋ง, ์ ๋ณด๋ฅผ ์ด๋ป๊ฒ ํํํ๋๋์ ๋ํ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ๋ค๋ฅธ ์๋ฏธ๊ฐ ๋ด๊ธด ๊ทธ๋ํ๋ฅผ ๊ทธ๋ ค๋ผ ์ ์์ ๊ฑฐ๋ผ ์๊ฐํ์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ์ธก์ ๋ฐ์ดํฐ๋ฅผ ์ฐจํธ๋ก ํํํ์ฌ ๋ฐ์ดํฐ์ ์์ง์์ ํตํด ์๋ฏธ์๋ ๋ถ๋ถ์ ์ฐพ๊ธฐ ์ฝ๊ฒ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ฃผ๋ฉด ์ข๊ฒ ๋ค๊ณ ์๊ฐํ์ต๋๋ค. ๋, ๋์ ์ผ๋ก ์ ๋๋ฉ์ด์ ํจ๊ณผ๋ฅผ ํตํด ์ญ๋์ ์ด๊ณ ์๊ฐ์ ์ดํด๋ฅผ ๋์ธ์ ์๊ฒ ํํํ๊ณ ์ถ์์ต๋๋ค.
| ๊ตฌ๋ถ | Line Chart | Bar Chart | Value Used Chart |
|---|---|---|---|
| ์ฐจํธ | ![]() |
![]() |
![]() |
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ฐจํธ๋ฅผ ๊ตฌํํ ์ฌ๋ฌ ์๋ฃ๋ฅผ ์ฐพ์๋ณด๋, ํฌ๊ฒ SVG๋ฅผ ์ด์ฉํ๋ ๋ฐฉ์๊ณผ Canvas.API๋ฅผ ์ด์ฉํ๋ ๋ฐฉ์ 2๊ฐ์ง๋ฅผ ์ฌ์ฉํ๊ณ ์์์ต๋๋ค.
๊ฐ๊ฐ์ ์ฅ๋จ์ ์ ์๊ฐํด๋ณด์์ ๋ SVG ๋ฐฉ์์ด ๋ ์์ฌ์ธ ๊ฒ ๊ฐ๊ธด ํ์์ง๋ง, ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฆฌ๋๋ฐ ์ ํฉํ Canvas.API๋ฅผ ์ ํํ๊ฒ ๋์์ต๋๋ค.
| ๊ตฌ๋ถ | SVG | CanvasAPI |
|---|---|---|
| ์ฅ์ | DOM์ ์ง์ ๊ทธ๋ ค์ง๋ค๋ณด๋, ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ฑ์ ์ฒ๋ฆฌ๊ฐ ์์ฝ๋ค. | DOM์ ์ง์ ๊ทธ๋ ค์ง๋ ๊ฒ์ด ์๋ Bitmap ํ์์ผ๋ก ๊ทธ๋ ค์ง๊ธฐ ๋๋ฌธ์ ๋ง์ ์์ ๋ฐ์ดํฐ๊ฐ ๋ฐ์ํ ์ ์ฌ์ฉ์์ ์ฝ๋์ ๋ฐ๋ผ CPU ์ฆ๊ฐ๊ฐ ํฌ์ง ์์ ์ ์๋ค. |
| ๋จ์ | ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฆด ๋ CPU์ ์ฌ์ฉ๋์ด ํฌ๊ฒ ์ฆ๊ฐํ๋ค. | pixel ํ์์ผ๋ก ๊ทธ๋ ค์ง ์์๊ฐ DOM์ ์๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ฑ์ ์ฒ๋ฆฌ๊ฐ ๊น๋ค๋กญ๋ค. |
Canvas ์์ญ์์ ์ฐจํธ ์ธ๋ถ(๊ธฐ์ค๊ฐ, ์์น ํํ), ์ฐจํธ ๋ด๋ถ(์ฐจํธ ๊ทธ๋ํ ํํ)๋ก ์์ญ์ ๋๋๊ณ ๋์ ์ผ๋ก ์์ง์์ ํํํด์ผ ํ๋ ์ฐจํธ ๋ด๋ถ ์์ญ๊ณผ, ๋งค๋ฒ ๊ทธ๋ฆฌ์ง ์์๋ ๋๋ ์์ญ์ผ๋ก ๋๋์ด ์ค๊ณ ํ Chart๋ฅผ ๊ตฌํํ์ต๋๋ค.
๋์ ์ฐจํธ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์๋ setInterval๊ณผ requestAnimationFrame(rAF)์ด ์์์ต๋๋ค.
๋ถ๋๋ฌ์ด ์ ๋๋ฉ์ด์
์ ์ํด์ rAF ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ณ์ง๋ง, ์ฐจํธ๊ฐ ์์ง์ด๋ ์๋๋ฅผ ์ ์ดํ๊ธฐ ์ํด์ setInterval์ ๋ ๋ฒ์งธ ์ธ์๊ฐ callback ํจ์๋ฅผ ์ฌ์ฉ์๊ฐ ๋ณด๊ธฐ ํธํ ์๋๋ก ์กฐ์ ํ๋ ์ญํ ์ด ํ์ํ์ต๋๋ค.
๊ทธ๋์ ๋์ ์ฐจํธ๋ฅผ ๊ตฌํ์ setInterval์ ์ฌ์ฉํ๊ฒ ๋์์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ ์ธก์ ํจ์๊ฐ ์์ฐํ ๋ฐฐ์ด ๋ด๋ถ์ ๊ฐ์ฒด๋ฅผ ์์ผ๋ก
Node๋ก ํํ
์ฐจํธ ์ ๋๋ฉ์ด์
์ ์ฌ์์๊ฐ์ ์ค์ ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ ๋ณด์ ์๋ฏธ๋ฅผ ์ฝ๊ธฐ์ ์ ํฉํ ์๊ฐ์ ์ค์ ํ ์ ์๊ฒ ํ์ต๋๋ค.(์ ์ญ๊ฐ์ฒด๋ก ๊ด๋ฆฌ)
๋
ธ๋ 1๊ฐ์ ์ฌ์์๊ฐ ํ๊ท = ์ฐจํธ ์ ๋๋ฉ์ด์
์ ์ฌ์์๊ฐ / Node์ ๊ฐ์๋ฅผ ๊ตฌํด setInterval์ delay๋ฅผ ๊ฐ์ ์ค์ ํ์ฌ ๊ณผ๋ํ๊ฒ ๋๋ ๋์น๋ Node ์ ๋ณด๊ฐ ์๋๋ก ๊ฐ์ ์ค์ ํ์ต๋๋ค.
currentPosition ๋ณ์๋ฅผ ๋ง๋ค์ด ์ฌ์์์ ์ ๊ธฐ์ค์ 0์ผ๋ก ์ค์ ํ๊ณ ์ด ๋ณ์๋ถํฐ ์ฌ์ฉ์๊ฐ ๋ณด๊ธฐ์ ์ ํฉํ Node์ ๊ฐฏ์(์ ์ญ๊ฐ์ฒด๋ก ๊ด๋ฆฌ)๋ฅผ ๋ฐฐ์ด์ sliceํ์ฌ ํํํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ callbackํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค currentPosition์ ๊ฐ์ 1์ฉ ๋ํ๊ณ setInterval์ด ํธ์ถ๋ ๋๋ง๋ค ๊ทธ๋ ค์ง๋ Node ๋ฐฐ์ด์ ํ ์นธ ์ฉ ์ฎ๊ฒผ์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก currentPosition์ด ๋ฐ์ดํฐ ๋ฐฐ์ด์ ๊ธธ์ด๋ณด๋ค ์ปค์ก์ ๋ clearInterval๋ก ์ ์งํ๊ฒ ๋ฉ๋๋ค.
3-2-3. ์ผ์ ํ ๊ฐ๊ฒฉ์ผ๋ก ์ฐจํธ์ ๋ฐ์ดํฐ๋ฅผ ํํํ๋ฉด์ ์๊ธฐ๋ ์ผ์ ํ์ง ์์ x์ถ ๋๊ธ๊ฐ
A-2์ x์ถ ๋๊ธ๊ฐ ๊ณ์ฐ ๋ฐฉ๋ฒ์ ์ผ์ ํ ๊ฐ๊ฒฉ์ ์ ํ์ ์ ๋ฐ๋ผ x์ถ์ ๊ฐ์ด ๊ฒฐ์ ๋๋ ๋ฐฉ์์ ๋๋ค. ์ด ๋ฐฉ์์ x์ถ ๋๊ธ๊ฐ ์ฐจ์ด๊ฐ ๋ชจ๋ ๋ค๋ฅด๋ค๋ ๋ฌธ์ ์ ์ด ์์๊ณ ์ด๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ๋ณด๋ฅผ ๋ปํ๋ y์ถ์ ๋ณ๋์ ๋ณผ ์ ์์ง๋ง, x์ถ์ ์ผ์ ํ๊ฒ ํํ๋๋ฏ๋ก ์ฌ์ฉ์๊ฐ ์ฐจํธ๋ง ๋ณด๊ณ ์ ๋ณด๋ฅผ ์ดํดํ๊ธฐ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ฒผ์ต๋๋ค. ์ด๋ ๊ทธ๋ํ์์ ์๊ฐ์ ๊ฐ๊ฒฉ์ ํํํ๊ธฐ์ ๋ง์ง ์๋ ๊ตฌํ ๋ฐฉ๋ฒ์ด์์ต๋๋ค.
๊ทธ๋ํ๋ฅผ ํตํ ์๊ฐ ๊ฐ์ ํํ ๋ฐฉ๋ฒ์ผ๋ก
- ๋จผ์ x์ถ ๋๊ธ์ ๊ฐ๊ฒฉ์ ์ผ์ ํ ์๊ฐ์ผ๋ก ๋๋๊ธฐ
- ๋๋ x์ถ ๋๊ธ ๊ฐ๊ฒฉ์ ๋ง์ถฐ์ ์ ํ์ ์ (x, y)์ขํ๋ฅผ ๊ณ์ฐ ํ ํํ
x์ถ์ ์ผ์ ์๊ฐ์ผ๋ก ๋๋ ์ ์ ๋๋ฉ์ด์
์ ๊ตฌํํ๊ณ ํ ํ๋ ์ ๋ง๋ค x์ถ์ ์๊ฐ ๊ฐ์ ์ด๋์์ผ ๊ทธ๋ํ์ ์๊ฐ ์์ ํํฐ๋ง ๋๋ Node๋ฅผ ๊ทธ๋ฆฌ๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
์์ง์ด๋ ์ฐจํธ์์ ์ฌ์ฉ์๊ฐ ๋ณด๊ธฐ์ ์ ํฉํ Node์ ๊ฐฏ์(์ ์ญ๊ฐ์ฒด๋ก ๊ด๋ฆฌ)๋ฅผ ์ ํ๊ณ Node์ timestamp ์ฐจ์ด๋ฅผ chart width ๊ฐ์ผ๋ก ๋๋ Node ๊ฐ์ x ์ขํ ๊ฑฐ๋ฆฌ๋ฅผ ํํํ์ต๋๋ค.์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก Node๋ฅผ ํํฐ๋งํ์ฌ ๋ฐ์ดํฐ ์ฌ์ด์ ์๊ฐ ๊ฐ๊ฒฉ์ ๋ฐ๋ผ ์ฐจํธ์ Node ๊ฐ๊ฒฉ๋ ์๊ฐ ๊ฐ๊ฒฉ์ ๋น๋กํ์ฌ ๋ณด์ด๋๋ก ๊ตฌํํ์์ต๋๋ค.
์ฌ์ฉ์ ์ฝ๋์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ถ์ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๊ธฐ ์ํด์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ธก์ ํ๋ ๊ธฐ๋ฅ์ด ํ์ํ์ต๋๋ค. Node.js์์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ธก์ ํ๋ ํจ์๋ฅผ ์ ๊ณตํด ์ค๋ค๋ ๊ฒ์ ํ์ธํ๊ณ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์ผ๋ก๋ง ํ๋ก์ ํธ๋ฅผ ์งํํ ์ ์๋ค๊ณ ํ๋จํ์ต๋๋ค. ๊ทธ๋์ ์ ํฌ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์๊ฐํด๋ดค์ต๋๋ค.
- ์ผ๋ ํธ๋ก Main ํ๋ก์ธ์ค์ Node.js ์ฌ์ฉํ๊ธฐ
- Node.js๋ก ์๋ฒ๋ฅผ ๊ตฌํํ๊ณ ์ฌ์ฉํ๊ธฐ
๋ ๊ฐ์ง ๋ฐฉ์์ ์ฐจ์ด์ ์ ์์๋ณด๊ณ ํ๋ก์ ํธ์ ์ ์ ํ Electron ๋ฐฉ์์ ์ฌ์ฉํ์ต๋๋ค.
| ์ฐจ์ด์ | Electron | ๋ธ๋ผ์ฐ์ + ์๋ฒ |
|---|---|---|
| ์ฝ๋ ๋ฒ ์ด์ค | ๋ชจ๋๋ฆฌ์ค | ๋ง์ดํฌ๋ก์๋น์ค |
| ์คํ๋ผ์ธ | ๊ฐ๋ฅ | ๋ถ๊ฐ๋ฅ |
| ๋น๊ณ | ๋ฐฐํฌ ํ์ผ ์ฉ๋ ๋งค์ฐ ํผ |
ํ๋ก ํธ์๋์ ๋ฐฑ์๋๋ฅผ ๋ ๋ค ๊ตฌํํ๋ฉด์ ํ๋ก ํธ์์ ์ ๋ ฅํ ์ฝ๋๋ฅผ ๋ฐฑ์๋์ Node.js ํ๊ฒฝ์ผ๋ก ๋ณด๋ด๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ธก์ ํ์ฌ ๊ฒฐ๊ณผ ๊ฐ์ ๋ค์ ํ๋ก ํธ๋ก ๋ณด๋ด๋ ๋ฐฉ์๊ณผ, Electron์์ Main ํ๋ก์ธ์ค์ Node.js์ Renderer ํ๋ก์ธ์ค์ Chrominum ํ๊ฒฝ์ IPC ํต์ ํ๋ฉด์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ด๊ฒฌ์ ์ขํ์ต๋๋ค.
Electron์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋ง๋๋ผ๋ ์ฝ๋๊ฐ ๋๋์ง ์๊ณ ํ๋์ ์ฝ๋ ๋ฒ ์ด์ค์์ ๊ฐ๋ฐํ ์ ์๋ค๋ ์ ๊ณผ ์จ๋ผ์ธ์ผ๋ก ํต์ ํ ํ์ ์์ด ๋ฐ์คํฌํฑ ์ฑ ๋ด๋ถ์์ IPC ํต์ ์ ํ์ฌ ์คํ๋ผ์ธ์ผ๋ก ํ๋ก์ ํธ๋ฅผ ๊ตฌํํ ์ ์๋ค๋ ์ ์์ Electron์ ์ ํํ์ต๋๋ค.
์ฌ์ฉ์์๊ฒ ์ฐจํธ๊ฐ ์๋ฏธํ๋ ๋ฐ์ดํฐ์ ์์ธ ๋ด์ฉ์ ์ ๊ณตํ๊ณ ์ถ์์ต๋๋ค. ์ฐจํธ Node์ ๋ง์ฐ์ค๋ฅผ ์ค๋ฒํ๋ฉด ์ ๋ณด์ฐฝ์ด ์ด๋ฆฌ๋ ๊ธฐ๋ฅ์ ๊ธฐํํ์ต๋๋ค. ํ์ง๋ง canvas API์ ๊ทธ๋ ค์ง ๊ทธ๋ฆผ์ HTML ์์๊ฐ ์๋์๊ธฐ ๋๋ฌธ์ ๋ง์ฐ์ค ์ค๋ฒ ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์งํ ์ ์๊ณ ๊ฑฐ๊ธฐ์ ๋ง์ถฐ ์ ๋ณด์ฐฝ์ ์ด ์ ์์์ต๋๋ค. ๊ทธ๋์ ์ ํฌ๋ canvas์ ๊ทธ๋ ค์ง Node๋ฅผ ์์ผ๋ก ํ์ํ๊ณ ์ ์์ ๋ง์ฐ์ค๊ฐ ์ค๋ฒ๋๋ฉด ๊ฐ์ง๋๋ ๋ก์ง์ด ํ์ํ์์ต๋๋ค.
์ฒซ๋ฒ์งธ๋ก ์ฐจํธ๋ด์์ Node๋ ์ฌ๋ฌ ๊ฐ์ผ ๊ฒ์ด๋ฏ๋ก ๊ฐ์ ๋ก์ง์ด ๋ง์ด ๋ฐ๋ณต๋ ๊ฒ์ผ๋ก ์๊ฐํ์ต๋๋ค. ๊ทธ๋์ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ์ํ์ฌ class๋ก ๊ตฌํํด์ ์ฌ๋ฌ๊ฐ์ ์ธ์คํด์ค๋ฅผ canvas์ ์์ ํ์ํ๋ ๋ฐฉ์์ผ๋ก ์งํํ์ต๋๋ค.
๋ง์ฐ์ค ์ค๋ฒ event๋ฅผ canvas์ ์ด๋ฒคํธ ๋ฆฌ์ค๋์ ๋ฑ๋กํ์ฌ ๋ง์ฐ์ค์ x, y ์ขํ๋ฅผ ์ ๋ฌํ๊ณ ์ด ์ขํ๊ฐ ์ฐจํธ์ ๊ทธ๋ ค์ง Node ๊ฐ์ฒด๋ค์ ์ ๋ฐ๊ฒฝ๋งํผ ๋ค์ด์ค๊ฒ ๋๋ค๋ฉด Boolean ๊ฐ์ ๋ฐํํ๊ฒ ํ์ต๋๋ค.
canvas์ ๋ฑ๋ก๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋์ callback ํจ์๋ฅผ ํตํด ์ฐจํธ์ ๊ทธ๋ ค์ง Node ๊ฐ์ฒด๋ค์ ์ํ ํ์ํ๊ณ ๋ฐํ ๊ฐ์ ์ฌ์ฉํ์ฌ Modal popup์ ์์ฑํ๋๋ก ๊ตฌํํ์ต๋๋ค.
๊ฐ๋ฐ์๋ค์ ๊ธฐํธ์ ๋ง๋ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ ์ํด Color Theme ๊ธฐ๋ฅ์ ๊ตฌํํ์ต๋๋ค.
| Mode | Dark Mode | Light Mode |
|---|---|---|
| Screen Shot | ![]() |
![]() |
๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ธก์ ํ๋ ๊ณผ์ ์ ๊ธฐ๋ณธ๋จ์๋ bytes์ ns(nano seconds)์ ๋๋ค. ์ฌ์ฉ์๊ฐ ์์น๋ฅผ ์ฝ๊ณ ์์ฉํ๊ฒ ๋ ๋ ์ซ์์ ๋จ์๊ฐ ๋๋ฌด ๋์ ํ์ฉํ๊ธฐ ๋ถํธํ ๊ฑฐ๋ผ ์๊ฐํ์ต๋๋ค. ํ ๊ธ ๋ฒํผ์ ํตํด ์์น๋ค์ ๋จ์๋ฅผ ๋ณ๊ฒฝํ๊ณ ๋ฎ์ ์๋ฆฟ์์์ ์์น ์ฌ๊ฐ๊ณต์ ์๊ณ ๋ก์์ ๋๊ณ ์ ๊ตฌํํ์ต๋๋ค.
| ๊ตฌ๋ถ | bytes, us | Killo bytes, ms |
|---|---|---|
| Screen Shot | ![]() |
![]() |
์ ํฌ๋ ์ฌ๋ฌ ๊ฐ์ง ํํ์ ์ฐจํธ๋ฅผ ๊ตฌํํ๊ณ ์์ต๋๋ค.
- ๊ฐ์ ์ : canvas๋ฅผ ํ์ฉ, ์ ๋ ฅ ๋ฐ์ดํฐ ๋ฐฐ์ด์ ํํ
- ๋ค๋ฅธ ์ : ์ฐจํธ ํํ(line chart, bar chart)
๋ถ๋ชจ Class์ธ Base Chart Class๋ฅผ ๊ตฌํํ๊ณ ์ฐจํธ๋ฅผ ๊ทธ๋ฆด ์ ์๋ ๊ธฐ๋ณธ์ ์ธ ํด๋์ค๋ฅผ ๊ตฌํํฉ๋๋ค.
์ฐจํธ ํํ์ ๋ฐ๋ผ ์์ ํด๋์ค๋ฅผ ๋ง๋ค์ด ๋ถ๋ชจํด๋์ค๋ฅผ ์์ํ ํ ์์ ํด๋์ค์์ ์ฐจํธ ๊ทธ๋ฆฌ๋ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ์ฌ ์ฐจํธ๊ทธ๋ฆฌ๋ ๋ฐฉ๋ฒ์ ๊ตฌํํ๊ณ ๊ทธ ์ธ์ ๊ตฌํ ๋งค์๋๋ ๋ถ๋ชจํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ค๋ณต์ฝ๋๋ฅผ ์ต์ํํ๊ณ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ ๊ตฌํํ์ฌ ๋ก์ง, ๋ฐ์ดํฐ ํ๋ฆ์ ์ผ์น๋ฅผ ์ป์ ์ ์๊ณ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ๋ํ ์ ์ฐํจ์ ์ป์ ์ ์์ ๊ฒ์ด๋ผ ์๊ฐํ์ต๋๋ค
๊ฐ๋ตํ ์ฐจํธ์ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ์ต๋๋ค. ํด๋์ค์ ๊ฐ์ฒด์งํฅ ์ค๊ณ ์์น(SOLID) ์ ํตํด ์ ํฉํ ์ค๊ณ์ธ์ง ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
ํ๋์ ํด๋์ค๋ ํ๋์ ์ฑ ์๋ง ๊ฐ์ ธ๊ฐ์ผํ๋ค.
ํด๋์ค์(canvas control, set chart data, draw chart) ์ธ๊ฐ์ง ๋งค์๋๋ฅผ ๋ณด๋ฉด ์ ์ ์๋ฏ์ด ์ฐจํธ๋ฅผ ๊ทธ๋ฆฌ๋ ์ฑ ์ ํ๋๋ง์ ๊ฐ์ง ์ ์๋๋ก ๋งค์๋๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
์ํํธ์จ์ด ์์๋ ํ์ฅ์๋ ์ด๋ ค ์์ผ๋ ๋ณ๊ฒฝ์๋ ๋ซํ ์์ด์ผ ํ๋ค.
์ฐจํธ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ์ํ ๋ฐ์ดํฐ๋ set chart data ๋ฅผ ์ด์ฉํด์๋ง ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋๋ก ํ์ ํ์์ต๋๋ค.
base chart class๋ฅผ ์์ํ๊ณ draw chart ๋งค์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํจ์ผ๋ก์จ ์ฌ์ ์๋ฅผ ํตํด ์ฌ์ฉํ๋๋ก ๊ฐ๋ฐฉํ์์ต๋๋ค.
ํ๋ก๊ทธ๋จ์ย ๊ฐ์ฒด๋ ํ๋ก๊ทธ๋จ์ ์ ํ์ฑ์ ๊นจ๋จ๋ฆฌ์ง ์์ผ๋ฉด์ ํ์ ํ์ ์ ์ธ์คํด์ค๋ก ๋ฐ๊ฟ ์ ์์ด์ผ ํ๋ค.
์ฐจํธ๊ทธ๋ฆฌ๋ ๊ธฐ๋ณธ ํ๊ฒฝ์ ๋ถ๋ชจ๋ก๋ถํฐ ์์์ ๋ฐ์ ์ฌ์ ์ ์์ด ์ฌ์ฉํจ์ผ๋ก ์์ํด๋์ค์ ๋งค์๋๋ ๋ณ์๊ฐ, ๋ถ๋ชจ ํด๋์ค์ ์ฑ๊ฒฉ, ์กฐ๊ฑด์ ๋ฐํ๊ฑฐ๋ ์ถฉ๋์ด ๋๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ก ํ์ต๋๋ค.
ํน์ ํด๋ผ์ด์ธํธ๋ฅผ ์ํ ์ธํฐํ์ด์ค ์ฌ๋ฌ ๊ฐ๊ฐ ๋ฒ์ฉ ์ธํฐํ์ด์ค ํ๋๋ณด๋ค ๋ซ๋ค.
์ธํฐํ์ด์ค๋ก ํ์ฉํ๋ ๋งค์๋๋ค์ ๋งค๊ฐ๋ณ์ ์ฌ์ฉ์ ํตํ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋์ถํ๋ ๋งค์๋๋ฅผ ์์ ๋ฒ์ฉ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ง ์์์ต๋๋ค.
ํ๋ก๊ทธ๋๋จธ๋ โ์ถ์ํ์ ์์กดํด์ผ์ง, ๊ตฌ์ฒดํ์ ์์กดํ๋ฉด ์๋๋ค.โ
Base Chart Class๋ ์ฐจํธ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ์ํ ํด๋์ค๋ก ์ด๋ ํ ๋ถ๋ถ๋ ์์ ํด๋์ค์ ์์งํ์ง ์๊ณ ์จ์ ํ ๋ ๋ฆฝ๋ ๊ฐ์ฒด๋ก ์ค๊ณํ์ต๋๋ค.
ํด๋์ค๋ฅผ ์ฌ์ฉํจ์ ์์ด์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ SOLID์์น์ ์๊ฐํ๋ฉฐ ๋ค์ํ ์ฐจํธ ํด๋์ค ๊ตฌํ์ ์ํ ์ถ์ํ์ ๊ฐ์ฒด์งํฅ ์ค๊ณ๋ฅผ ๊ฐ๋จํ๊ฒ ํํํด ๋ณด์์ต๋๋ค. ํด๋์ค๋ฅผ ์ฌ์ฉํจ์ ์์ด์ SOLID์์น ์์์ ๊ตฌํํด์ผ ํด๋์ค์ ์ฅ์ ์ ์ค๋กฏ์ด ์ฑ๊ธธ์ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ ๋์ค์๋ ์ฐจํธ๋ฅผ ๋ง๋๋ ๋ก์ง์ ํด๋์ค๋ก ๋ง๋ค์ด ์ปดํฌ๋ํธ ์ธ๋ถ๋ก ๋ถ๋ฆฌํ์๋๋ฐ, ๋๋์๋ณด๋ ์ด๋ฅผ ์ปค์คํ ํ ์ผ๋ก ๋ง๋ค์๋ค๋ฉด ๋ ์ข์๊ฒ ๋ค๋ ์๊ฐ์ด ๋ง์์ต๋๋ค.
์ฐจํธ๋ฅผ ์ง์ ์ ์ํ์์ ๋ ๋จ์ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๋ง ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด ์๋, ์ฐจํธ ๋ ธ๋๋ค์ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ฆฌ๋ฉด ๊ตฌ์ฒด์ ์ธ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๋ชจ๋ฌ์ ๊ฐ์ด ์ ๊ณตํ์์ต๋๋ค. ๊ฐ๊ธฐ ๊ธฐ๋ฅ์ ๋ค๋ฅด์ง๋ง, ๋ง์ฐ์ค ์ด๋ฒคํธ๋ฅผ 3๊ฐ์ง ์ฐจํธ ๋ชจ๋ ๋์ผํ๊ฒ ์ผ์ด๋ฉ๋๋ค.
(ํด๋น ๋ถ๋ถ์ gif๋ก ๋ชจ๋ฌ์ ๋์ฐ๋ ์ฅ๋ฉด ์ฝ์ )
์ฐจํธ์ ๋ชจ๋ฌ์ ๊ฐ๊ธฐ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ก ๋ถ๋ฆฌ๋์ด์์ด, ๋ฆฌ๋์ค ํดํท์ ํตํด ์ฐจํธ์ ์ํ๋ฅผ ๊ณต์ ํ๊ณ ์๋ ์ํฉ์ด์์ต๋๋ค. ๋ฆฌ๋์ค ํดํท์์๋ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด์ ์์ฒด hooks์ ์ ๊ณตํฉ๋๋ค.
์ฌ๊ธฐ์ ์ปค์คํ
ํ
์ ํ์์ฑ์ ๋๋ผ๊ฒ ๋์์ต๋๋ค. ๋ฆฌ์กํธ ๋ด๋ถ์์ hooks์ ์ฌ์ฉํ๊ธฐ ์ํด์ , ์ปดํฌ๋ํธ ๋ด๋ถ๋ผ๋ ์กฐ๊ฑด์ด ํ์ํ๋ฐ ๋ฌธ์ ๋ ์ฐจํธ ๋ก์ง์ด ํด๋์ค๋ก ์ปดํฌ๋ํธ ์ธ๋ถ์ ์ ์ธ, ์ฌ์ฉ๋๊ณ ์์์ต๋๋ค. ์ฐจํธ๋ฅผ ๊ตฌํํ๋ ํด๋์ค ๋ด๋ถ์์ ๋ฆฌ๋์ค์ hooks์ ์ฌ์ฉํ ์ ์์ด, ์ด๋ฅผ ํด๋์ค์ ์ธ์๋ก ๋ฐ์ ๊ตฌํํ๊ฒ ๋์์ต๋๋ค.
(๊ทธ๋ฆผ ๊ทธ๋ฆฌ๊ธฐ)
๋ง์ผ ์ฐจํธ๋ฅผ ๊ตฌํํ๋ ๋ก์ง์ ์ปค์คํ ํ ์ผ๋ก ๊ด๋ฆฌํ์๋ค๋ฉด, ๋ฆฌ์กํธ ํน์ ๋ฆฌ์กํธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ์ ๊ณตํ๋ ์ปค์คํ ํ ์ ์ ์ฉํ๋ ๊ฒ์ ์์ ๋ก์ ์ ๊ฒ์ด๋ ์์ฌ์์ด ๋ค์์ต๋๋ค. Canvas API๋ก ์ฐจํธ๋ฅผ ๊ทธ๋ฆฌ๋ ๋ก์ง์ ์ปค์คํ ํ ์ผ๋ก ๋ฐ๊พผ๋ค๋ฉด ์ด๋ป๊ฒ ํ ์ ์์๊น์?
Canvas API๋ฅผ ์ฌ์ฉํ์ฌ ์ฐจํธ๋ฅผ ๊ตฌํํ๊ธฐ ์ํด์๋ <canvas>๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. <canvas> ์๋ฆฌ๋จผํธ์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ป์ด์ ๋ค, ์ค์ ๊ทธ๋ฆฌ๊ธฐ ๋์์ด ๋๋ ์ปจํ
์คํธ๋ฅผ ํ๋ํฉ๋๋ค. ์ฆ DOM์ ์ ๊ทผํ ํ์๊ฐ ์์ต๋๋ค.
const canvas = document.getElementById("canvas");
//์ค์ ๊ทธ๋ฆฌ๊ธฐ ๋์์ด ๋๋ ์ปจํ
์คํธ๋ฅผ ํ๋ํฉ๋๋ค.
const ctx = canvas.getContext("2d");๋ฆฌ์กํธ๋ ์ง์ DOM์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ฐธ์กฐํด์ผํ๋ ๊ฒฝ์ฐ๋ฅผ ์ํด useRef()๋ผ๋ ํ
์ ์ ๊ณตํฉ๋๋ค. Canvas API๋ ์น ๋ธ๋ผ์ฐ์ ์ ๋ด์ฅ ๋ ๊ธฐ๋ฅ์ผ๋ก, DOM์ ์ฐธ์กฐํ ๋ค ์ปจํ
์คํธ๋ฅผ ํ๋ํ์ฌ ์ฌ์ฉ์๊ฐ ์ฌ๋ฌ ๊ทธ๋ฆผ์ ๊ทธ๋ฆด ์ ์๊ฒ ํฉ๋๋ค.
import { useRef } from "react";
export default function Chart () {
const canvasRef = useRef(null);
useEffect(() => {
const canvasRef.current;
const ctx = canvas.getContext("2d");
});
return <cansvas ref={canvasRef}>
}<canvas>๊ฐ ์ต์ด ๋๋๋ง ๋ ๋ค, ์บ๋ฒ์ค ์ปจํ
์คํธ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด useEffect ์์์ useRef()๊ฐ ๋ฐํํ ๊ฐ์ฒด์ current ์์ฑ์ ์ ๊ทผํ์์ต๋๋ค.
ํ์ฌ 3๊ฐ์ง ์ฐจํธ๋ฅผ ์ ๊ณตํ๊ณ ์๋๋ฐ, ์ด๋ฅผ ํด๋์ค๊ฐ ์๋ ์ปค์คํ
ํ
์ผ๋ก ๋ง๋ค์๋ค๋ฉด ๋ฆฌ์กํธ์์ ์บ๋ฒ์ค๋ก ์ฐจํธ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์ํ ๊ณตํต๋ ๋ด์ฉ๋ค์ useChart()๋ก ๊ด๋ฆฌ ํ ์ ์์ต๋๋ค.
(์ปค์คํ ํ ์ผ๋ก ์ฐจํธ๋ฅผ ๊ตฌํํ ๋์ ์์)
-
1์ฃผ์ฐจ
- ์์ด๋์ด ์์ง, ์ ์
- ๊ธฐ์ ์คํ ์ ์
- Git ์์ ํ๋ก์ฐ ๊ฒฐ์
- ESLint, Prettier, Husky ์ค์
- KANBAN ์์ฑ
-
2์ฃผ์ฐจ
- Electron ์ค์ ๋ฐ ๋ฆฌ์กํธ ์ค์
- AST๋ฅผ ์ด์ฉํ CodeParser ๊ตฌํ
- Canvas API๋ฅผ ์ด์ฉํ ์ฐจํธ ๊ตฌํ
- ํ ์คํธ ์ฝ๋ ์์ฑ
- README ์์ฑ
FrontEnd
- Electron
- React
- Redux
- Styled Components
- ๊ฐํ์ค :[email protected]
- ์ ์ฌ์ฒ :[email protected]
- ์ต์๋ฆฐ :[email protected]












