Skip to content

CODEBLUE3/HeapTracker-client

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ”น Heap-Tracker

  • Heap-Tracker๋Š” ์œ ์ €๊ฐ€ ์ž…๋ ฅํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์˜ ํž™ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ฐจํŠธ๋กœ ์‹œ๊ฐํ™”ํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค.
  • ์ตœ๋Œ€, ์ตœ์†Œ ํž™ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๋ฐ ๋Ÿฐํƒ€์ž„ ์‹œ๊ฐ„ ๋“ฑ ์—ฌ๋Ÿฌ ์ •๋ณด๋ฅผ ์ฐจํŠธ์™€ ํ•จ๊ป˜ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”น Youtube Link (์‹œ์—ฐ ์˜์ƒ)

๐Ÿ”น Table of Contents


๐Ÿ”น Preview

๊ธฐ๋ณธ ํ™”๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์ธก์ • ํ›„ ์ฐจํŠธ ํ‘œํ˜„ ํ™”๋ฉด
init Screen screen after code excute

๊ธฐ๋Šฅ ๋ฐ ์ž‘์—… ๊ธฐ์—ฌ๋„

๊ตฌ๋ถ„ ๊ฐ•ํ˜„์ค€ ์ •์žฌ์ฒœ ์ตœ์˜ˆ๋ฆฐ
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%

๐Ÿ”น Features

  • ๋ฉ”๋ชจ๋ฆฌ ์ธก์ •์„ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ฝ”๋“œ๋ฅผ ํ•จ์ˆ˜ ์ฝ”๋“œ์— ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • ํ•จ์ˆ˜ ์‹คํ–‰ ์ฝ”๋“œ์— ์ž‘์„ฑํ•œ ํ•จ์ˆ˜์— ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • ์‹คํ–‰ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์•„๋ž˜ ์‹คํ–‰ ๊ฒฐ๊ณผ์ฐฝ์— ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ์‹คํ–‰ ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค๋ฉด ๋นจ๊ฐ„๊ธ€์”จ๋กœ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ์‹คํ–‰์ด ์™„๋ฃŒ๋˜์—ˆ์œผ๋ฉด ์ธก์ •๋œ ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ธฐ๋ณธ ์ •๋ณด๋“ค(ํ•จ์ˆ˜์‹คํ–‰ ์‹œ๊ฐ„, ์‚ฌ์šฉ๋œ ๋ฉ”๋ชจ๋ฆฌ, ์ธก์ • ๊ฐ์ฒด์˜ ๊ฐฏ์ˆ˜)์ด ์šฐ์ธก์— ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ ์ธก์ • ๊ฒฐ๊ณผ๋ฅผ Chart Result์˜ ํ† ๊ธ€ ๋ฒ„ํŠผ์„ ํ†ตํ•ด bytes, us(micro seconds) ์™€ Kilo bytes, ms(milli seconds) ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Chart ์•„๋ž˜์˜ ์‹œ์ž‘, ์ผ์‹œ์ •์ง€, ์ •์ง€ ๋ฒ„ํŠผ์œผ๋กœ ์ฐจํŠธ๋ฅผ ๋™์  ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฐจํŠธ์˜ ์š”์†Œ์— ๋งˆ์šฐ์Šค ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ ธ๊ฐ€ ํ•ด๋‹น ์š”์†Œ์˜ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฐจํŠธ ์šฐ์ธก ์ƒ๋‹จ์˜ ์ปฌ๋Ÿฌ ํŒ”๋ ˆํŠธ๋ฅผ ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์ฐจํŠธ Liner๊ณผ bar์˜ ์ƒ‰์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ค‘์•™ ์ƒ๋‹จ์˜ ์ปฌ๋Ÿฌํ…Œ๋งˆ ์ฝค๋ณด๋ฐ•์Šค ์ปจํŠธ๋กค์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ Color Theme๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”น Challenges

1. ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์€ ์–ด๋–ป๊ฒŒ ์ธก์ •ํ•˜๋Š”๊ฑธ๊นŒ?

1-1. Node.js ํ™˜๊ฒฝ์—์„œ V8์—”์ง„์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ

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 ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

1-2. Node.js ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ Heap ๋ฉ”๋ชจ๋ฆฌ ์ธก์ •

๊ตฌ๋ถ„ ์„ค๋ช…
process.memoryUsage()
- ์„ ํƒ
๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์ธก์ •๋œ Node.js ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์„ค๋ช…ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ง€์†ํ•ด์„œ ๊ด€์ธกํ•˜๊ณ  ์‹ถ์—ˆ๋˜ ๊ธฐํš ์˜๋„๋กœ์™€ ์ ํ•ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ์„ ํƒํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
writeHeapSnapShot()
- ํƒˆ๋ฝ
V8 ์—”์ง„์˜ ์Šค๋ƒ…์ƒท์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
๋‹จ, ํ•ด๋‹น ํŒŒ์ผ์€ ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋ฉฐ ํž™ ์Šค๋ƒ…์ƒท์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ์Šค๋ƒ…์ƒท์ด ์ƒ์„ฑ๋  ๋•Œ ํž™ ํฌ๊ธฐ์˜ ์•ฝ ๋‘ ๋ฐฐ์— ํ•ด๋‹นํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ง€์†์ ์œผ๋กœ ๊ด€์ธกํ•˜๊ณ  ์‹ถ์—ˆ๋˜ ๊ธฐํš ์˜๋„์™€ ๋งž์ง€ ์•Š์•„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

2. ์‚ฌ์šฉ์ž ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ธก์ •ํ•˜๋Š”๋ฒ•?

2-1. ๋ฉ”๋ชจ๋ฆฌ ์ธก์ •์„ ์œ„ํ•œ ์•„์ด๋””์–ด ๋น„๊ต

๋ฉ”๋ชจ๋ฆฌ ์ธก์ • ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํƒ€์ด๋ฐ์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋Š” 2๊ฐœ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์‹คํ–‰๊ณผ ๋™์‹œ์— setInterval์„ ํ™œ์šฉํ•˜์—ฌ ๋ฐ˜๋ณต์ ์œผ๋กœ process.momoryUsage()๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ• ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž ์ฝ”๋“œ์— process.momoryUsage()๋ฅผ ์‚ฝ์ž…ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ฝ”๋“œ๋ฅผ ์žฌ์ƒ์„ฑ ํ›„ ์‹คํ–‰์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ๋ถ„ setInterval ํ™œ์šฉ ์ฝ”๋“œ ๋‚ด ์ธก์ • ํ•จ์ˆ˜ ์‚ฝ์ž…
์žฅ์  ์‰ฌ์šด ๊ตฌํ˜„๊ณผ ์‚ฌ์šฉ
์ธก์ •๊ฐ’์˜ ์ผ์ •ํ•œ ํƒ€์ด๋ฐ
๋ณ€์ˆ˜์ƒ์„ฑ, ํ•จ์ˆ˜์‚ฌ์šฉ ๋“ฑ ์˜๋ฏธ ์žˆ๋Š” ์‹œ์ ์— ๋ฉ”๋ชจ๋ฆฌ ์ธก์ • ๊ฐ€๋Šฅ
๋‹จ์  ์ธก์ •๊ฐ’์— ๋Œ€ํ•œ ์›์ธ์„ ์ฐพ๊ธฐ ๋ถˆ๊ฐ€๋Šฅ ๋ณ„๋„์˜ ์‚ฌ์šฉ์ž ์ฝ”๋“œ ํŒŒ์‹ฑ ๊ณผ์ • ํ•„์š”

๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฐ์ฒด ์ƒ์„ฑ, ํ•จ์ˆ˜ ์‹คํ–‰, ๊ฐ ๋‚ด๋ถ€ ๊ฐ์ฒด์˜ ๋งค์„œ๋“œ ์‚ฌ์šฉ ๋“ฑ ์˜๋ฏธ ์žˆ๋Š” ์‹œ์ ์— ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ์ž ์ฝ”๋“œ์— ๋ฉ”๋ชจ๋ฆฌ ์ธก์ • ํ•จ์ˆ˜๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


2-2. ์ถ”์ƒ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ ์‚ฌ์šฉ์ž ์ฝ”๋“œ ๋ถ„์„

์‚ฌ์šฉ์ž ์ฝ”๋“œ์— ๋ฉ”๋ชจ๋ฆฌ ์ธก์ •ํ•จ์ˆ˜๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ String ๋งค์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ •๋ง ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ฝ”๋“œ์˜ ์–ด๋А ์œ„์น˜์— ๋ฉ”๋ชจ๋ฆฌ ์ธก์ •ํ•จ์ˆ˜๋ฅผ ์‚ฝ์ž…ํ•  ๊ฒƒ์ธ๊ฐ€์— ๋Œ€ํ•œ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค.

๋จผ์ € Javascript์˜ ์ฃผ์š” ๋งค์„œ๋“œ, ์—ฐ์‚ฐ์ž, ๋ณ€์ˆ˜ ์„ ์–ธ๋“ค์„ ์ฐพ์•„ ํ•ด๋‹น ์ฝ”๋“œ ์•ž์— ์‚ฝ์ž…ํ•˜์—ฌ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์„ ๊ตฌ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ €ํฌ๊ฐ€ ๊ณต๋ถ€๋ฅผ ํ•˜๋ฉด์„œ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฐ„๋‹จํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”๋“œ์˜ ํŽธ์ง‘ ์‹œ๋„์—์„œ๋„ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํ•ด์•ผ ํ•  ์š”์†Œ๋“ค์ด ๋„ˆ๋ฌด ๋งŽ์•˜๊ณ  ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์™€ Map, Array, String๊ณผ ๊ฐ™์€ ์ฃผ์š” ํ‘œ์ค€ ๋‚ด์žฅ ๊ฐ์ฒด์˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค. Javascript ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ์กฐ์‚ฌ๋ฅผ ํ•˜๋Š” ๋„์ค‘ AST ํ˜•์‹์— ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ  ํ•™์Šต์„ ํ†ตํ•ด ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์— ์‘์šฉํ•  ์ˆ˜ ์žˆ์„์ง€ ๊ฒ€ํ† ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

AST(Abstract Syntax Tree)์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.


๊ตฌ๋ถ„ ๋ฌธ์ž์—ด ํŒŒ์‹ฑ 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 ํŒŒ์‹ฑํ›„ ์žฌ์ƒ์„ฑํ•œ ์‚ฌ์šฉ์ž ์ฝ”๋“œ
๋‚ด์šฉ แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-06-21 แ„‹แ…ฉแ„’แ…ฎ 10 54 30 ใ€€แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-06-21 แ„‹แ…ฉแ„’แ…ฎ 10 54 50

2-3. ๋Ÿฐํƒ€์ž„ ์ค‘ ์‚ฌ์šฉ์ž ์ฝ”๋“œ ์‹คํ–‰๋ฐฉ์‹์— VM ์‚ฌ์šฉ

2-3-1. ํ”„๋กœ์„ธ์Šค ์˜ค๋ฅ˜๋กœ ์ธํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…๋ฃŒ ๋ฐฉ์ง€

๋Ÿฐํƒ€์ž„ ์ค‘ ์‚ฌ์šฉ์ž ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์€ eval, new Function, VM ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ํ”„๋กœ์ ํŠธ๋Š” ๋ฐ์Šคํฌํ†ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ผ ์‚ฌ์šฉ์ž ๋ณธ์ธ์˜ ์ปดํ“จํ„ฐ ์ž์›์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ์ƒ์˜ ๋ฌธ์ œ๋Š” ์—†์ง€๋งŒ, ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ๋ถˆํŽธํ•จ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์–ด ๊ฐ€์ƒ ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ๋ฅผ ๋™์ž‘์‹œํ‚ค๋Š” VM์„ ์„ ํƒํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

2-3-2. ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ธก์ •ํ•˜๊ณ  ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜ ๊ตฌํ˜„

ํด๋กœ์ € ํŒจํ„ด๊ณผ ์ƒ์„ฑ์ž ํ•จ์ˆ˜์‚ฌ์ด์˜ ๊ณ ๋ฏผ

VM ๊ฐ€์ƒํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ์ž ์ฝ”๋“œ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฉ”๋ชจ๋ฆฌ ์ธก์ • ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ •๋ณด๋ฅผ ์ €์žฅ ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฐฐ์—ด ์ž๋ฃŒ๊ตฌ์กฐ์— ์‚ฌ์šฉ๋œ ๋ฉ”๋ชจ๋ฆฌ, ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ ์‹œ๊ฐ„ ๋“ฑ์„ ํฌํ•จํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ธฐ ์œ„ํ•ด ํด๋กœ์ €๋ฅผ ์ด์šฉํ•œ ํŒจํ„ด๊ณผ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑ์žํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ํŽธ์ด ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์—์„œ ๋” ์•Œ์•„๋ณด๊ธฐ ์‰ฝ๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๋‹ค๋Š” ํŒ๋‹จ์„ ํ•˜์—ฌ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ธก์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

2-3-3 ์ฝ”๋“œ์˜ ๋น ๋ฅธ ์‹คํ–‰ ์†๋„๋กœ ์ธํ•ด ์ค‘๋ณต๋˜๋Š” ์‹œ๊ฐ„ ๋ฐœ์ƒ

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() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚˜๋…ธ์ดˆ ๋‹จ์œ„๋กœ ๊ธฐ๋กํ•ด์„œ ๊ฐ ๊ฐ์ฒด ์‹œ๊ฐ„์ฐจ๋ฅผ ๊ตฌํ–ˆ์Šต๋‹ˆ๋‹ค.


3. ๋ฉ”๋ชจ๋ฆฌ ์ธก์ •๊ฐ’ ์ฐจํŠธ๋กœ ํ‘œํ˜„

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

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

๊ตฌ๋ถ„ Line Chart Bar Chart Value Used Chart
์ฐจํŠธ แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-06-21 แ„‹แ…ฉแ„’แ…ฎ 7 27 48_cropChart แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-06-21 แ„‹แ…ฉแ„’แ…ฎ 7 27 59_cropChart แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-06-21 แ„‹แ…ฉแ„’แ…ฎ 7 28 12_cropChart

3-1. canvasAPI๋ฅผ ์‚ฌ์šฉํ•œ ์ฐจํŠธ ๊ตฌํ˜„

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ฐจํŠธ๋ฅผ ๊ตฌํ˜„ํ•œ ์—ฌ๋Ÿฌ ์ž๋ฃŒ๋ฅผ ์ฐพ์•„๋ณด๋‹ˆ, ํฌ๊ฒŒ SVG๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹๊ณผ Canvas.API๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹ 2๊ฐ€์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ์žฅ๋‹จ์ ์„ ์ƒ๊ฐํ•ด๋ณด์•˜์„ ๋•Œ SVG ๋ฐฉ์‹์ด ๋” ์†์‰ฌ์šธ ๊ฒƒ ๊ฐ™๊ธด ํ•˜์˜€์ง€๋งŒ, ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ฆฌ๋Š”๋ฐ ์ ํ•ฉํ•œ Canvas.API๋ฅผ ์„ ํƒํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ๋ถ„ SVG CanvasAPI
์žฅ์  DOM์— ์ง์ ‘ ๊ทธ๋ ค์ง€๋‹ค๋ณด๋‹ˆ, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ์˜ ์ฒ˜๋ฆฌ๊ฐ€ ์†์‰ฝ๋‹ค. DOM์— ์ง์ ‘ ๊ทธ๋ ค์ง€๋Š” ๊ฒƒ์ด ์•„๋‹Œ Bitmap ํ˜•์‹์œผ๋กœ ๊ทธ๋ ค์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐœ์ƒํ•  ์‹œ ์‚ฌ์šฉ์ž์˜ ์ฝ”๋“œ์— ๋”ฐ๋ผ CPU ์ฆ๊ฐ€๊ฐ€ ํฌ์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.
๋‹จ์  ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ฆด ๋•Œ CPU์˜ ์‚ฌ์šฉ๋Ÿ‰์ด ํฌ๊ฒŒ ์ฆ๊ฐ€ํ•œ๋‹ค. pixel ํ˜•์‹์œผ๋กœ ๊ทธ๋ ค์ง„ ์š”์†Œ๊ฐ€ DOM์— ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ์˜ ์ฒ˜๋ฆฌ๊ฐ€ ๊นŒ๋‹ค๋กญ๋‹ค.

HTML5 Canvas vs. SVG vs. div


3-2. ์ฐจํŠธ ๋™์  ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ตฌํ˜„

3-2-1. ๋™์ ์ธ ์˜์—ญ๊ณผ ๊ทธ๋ ‡์ง€ ์•Š์€ ์˜์—ญ์„ ๋‚˜๋ˆ„์–ด ์„ค๊ณ„ํ•˜๊ธฐ

Canvas ์˜์—ญ์—์„œ ์ฐจํŠธ ์™ธ๋ถ€(๊ธฐ์ค€๊ฐ’, ์ˆ˜์น˜ ํ‘œํ˜„), ์ฐจํŠธ ๋‚ด๋ถ€(์ฐจํŠธ ๊ทธ๋ž˜ํ”„ ํ‘œํ˜„)๋กœ ์˜์—ญ์„ ๋‚˜๋ˆ„๊ณ  ๋™์ ์œผ๋กœ ์›€์ง์ž„์„ ํ‘œํ˜„ํ•ด์•ผ ํ•˜๋Š” ์ฐจํŠธ ๋‚ด๋ถ€ ์˜์—ญ๊ณผ, ๋งค๋ฒˆ ๊ทธ๋ฆฌ์ง€ ์•Š์•„๋„ ๋˜๋Š” ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„์–ด ์„ค๊ณ„ ํ›„ Chart๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

Canvas Draw Area


3-2-2. setInterval๊ณผ requestAnimationFrame(rAF) ๊ทธ๋ฆฌ๊ณ  ์• ๋‹ˆ๋ฉ”์ด์…˜ ํ‘œํ˜„

๋™์  ์ฐจํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” 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์ถ•์€ ์ผ์ •ํ•˜๊ฒŒ ํ‘œํ˜„๋˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ฐจํŠธ๋งŒ ๋ณด๊ณ  ์ •๋ณด๋ฅผ ์ดํ•ดํ•˜๊ธฐ ํž˜๋“  ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ทธ๋ž˜ํ”„์—์„œ ์‹œ๊ฐ„์„ ๊ฐ„๊ฒฉ์„ ํ‘œํ˜„ํ•˜๊ธฐ์—” ๋งž์ง€ ์•Š๋Š” ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜ํ”„๋ฅผ ํ†ตํ•œ ์‹œ๊ฐ„ ๊ฐ’์˜ ํ‘œํ˜„ ๋ฐฉ๋ฒ•์œผ๋กœ

  1. ๋จผ์ € x์ถ• ๋ˆˆ๊ธˆ์˜ ๊ฐ„๊ฒฉ์„ ์ผ์ •ํ•œ ์‹œ๊ฐ„์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ
  2. ๋‚˜๋ˆˆ x์ถ• ๋ˆˆ๊ธˆ ๊ฐ„๊ฒฉ์— ๋งž์ถฐ์„œ ์ „ํ™˜์ ์˜ (x, y)์ขŒํ‘œ๋ฅผ ๊ณ„์‚ฐ ํ›„ ํ‘œํ˜„

x์ถ•์„ ์ผ์ • ์‹œ๊ฐ„์œผ๋กœ ๋‚˜๋ˆ ์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๊ตฌํ˜„ํ•˜๊ณ  ํ•œ ํ”„๋ ˆ์ž„ ๋งˆ๋‹ค x์ถ•์˜ ์‹œ๊ฐ„ ๊ฐ’์„ ์ด๋™์‹œ์ผœ ๊ทธ๋ž˜ํ”„์˜ ์‹œ๊ฐ„ ์•ˆ์— ํ•„ํ„ฐ๋ง ๋˜๋Š” Node๋ฅผ ๊ทธ๋ฆฌ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ์›€์ง์ด๋Š” ์ฐจํŠธ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๊ธฐ์— ์ ํ•ฉํ•œ Node์˜ ๊ฐฏ์ˆ˜(์ „์—ญ๊ฐ์ฒด๋กœ ๊ด€๋ฆฌ)๋ฅผ ์ •ํ•˜๊ณ  Node์˜ timestamp ์ฐจ์ด๋ฅผ chart width ๊ฐ’์œผ๋กœ ๋‚˜๋ˆ  Node ๊ฐ„์˜ x ์ขŒํ‘œ ๊ฑฐ๋ฆฌ๋ฅผ ํ‘œํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ Node๋ฅผ ํ•„ํ„ฐ๋งํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์˜ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์— ๋”ฐ๋ผ ์ฐจํŠธ์˜ Node ๊ฐ„๊ฒฉ๋„ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์— ๋น„๋ก€ํ•˜์—ฌ ๋ณด์ด๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.


4. ์ผ๋ ‰ํŠธ๋ก ์„ ์„ ํƒํ•œ ์ด์œ 

4-1. ๋ฉ”๋ชจ๋ฆฌ ์ธก์ •์„ ์œ„ํ•ด ํ•„์š”ํ•œ Node.js

์‚ฌ์šฉ์ž ์ฝ”๋“œ์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ถ”์ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ธก์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. Node.js์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ธก์ •ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ด ์ค€๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์œผ๋กœ๋งŒ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €ํฌ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

  1. ์ผ๋ ‰ํŠธ๋ก  Main ํ”„๋กœ์„ธ์Šค์˜ Node.js ์‚ฌ์šฉํ•˜๊ธฐ
  2. Node.js๋กœ ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ

๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์˜ ์ฐจ์ด์ ์„ ์•Œ์•„๋ณด๊ณ  ํ”„๋กœ์ ํŠธ์— ์ ์ ˆํ•œ Electron ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

4-2. ์ผ๋ ‰ํŠธ๋ก  vs Node.js ์„œ๋ฒ„ ํ™˜๊ฒฝ

์ฐจ์ด์  Electron ๋ธŒ๋ผ์šฐ์ € + ์„œ๋ฒ„
์ฝ”๋“œ ๋ฒ ์ด์Šค ๋ชจ๋†€๋ฆฌ์Šค ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค
์˜คํ”„๋ผ์ธ ๊ฐ€๋Šฅ ๋ถˆ๊ฐ€๋Šฅ
๋น„๊ณ  ๋ฐฐํฌ ํŒŒ์ผ ์šฉ๋Ÿ‰ ๋งค์šฐ ํผ

ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๋ฅผ ๋‘˜ ๋‹ค ๊ตฌํ˜„ํ•˜๋ฉด์„œ ํ”„๋ก ํŠธ์—์„œ ์ž…๋ ฅํ•œ ์ฝ”๋“œ๋ฅผ ๋ฐฑ์—”๋“œ์˜ Node.js ํ™˜๊ฒฝ์œผ๋กœ ๋ณด๋‚ด๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ธก์ •ํ•˜์—ฌ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋‹ค์‹œ ํ”„๋ก ํŠธ๋กœ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹๊ณผ, Electron์—์„œ Main ํ”„๋กœ์„ธ์Šค์˜ Node.js์™€ Renderer ํ”„๋กœ์„ธ์Šค์˜ Chrominum ํ™˜๊ฒฝ์„ IPC ํ†ต์‹ ํ•˜๋ฉด์„œ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ด๊ฒฌ์„ ์ขํ˜”์Šต๋‹ˆ๋‹ค.


Electron์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋งŽ๋”๋ผ๋„ ์ฝ”๋“œ๊ฐ€ ๋‚˜๋‰˜์ง€ ์•Š๊ณ  ํ•˜๋‚˜์˜ ์ฝ”๋“œ ๋ฒ ์ด์Šค์—์„œ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ๊ณผ ์˜จ๋ผ์ธ์œผ๋กœ ํ†ต์‹ ํ•  ํ•„์š” ์—†์ด ๋ฐ์Šคํฌํ†ฑ ์•ฑ ๋‚ด๋ถ€์—์„œ IPC ํ†ต์‹ ์„ ํ•˜์—ฌ ์˜คํ”„๋ผ์ธ์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ Electron์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.


5. UI/UX ๊ณ ๋ฏผ

5-1. ์„ธ๋ถ€ ์ •๋ณด ํ‘œํ˜„์„ ์œ„ํ•œ ํŒ์—… ์œˆ๋„์šฐ ์ƒ์„ฑ

์‚ฌ์šฉ์ž์—๊ฒŒ ์ฐจํŠธ๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์ƒ์„ธ ๋‚ด์šฉ์„ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฐจํŠธ Node์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ค๋ฒ„ํ•˜๋ฉด ์ •๋ณด์ฐฝ์ด ์—ด๋ฆฌ๋Š” ๊ธฐ๋Šฅ์„ ๊ธฐํšํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ canvas API์— ๊ทธ๋ ค์ง„ ๊ทธ๋ฆผ์€ HTML ์š”์†Œ๊ฐ€ ์•„๋‹ˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์šฐ์Šค ์˜ค๋ฒ„ ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ง€ํ•  ์ˆ˜ ์—†๊ณ  ๊ฑฐ๊ธฐ์— ๋งž์ถฐ ์ •๋ณด์ฐฝ์„ ์—ด ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €ํฌ๋Š” canvas์— ๊ทธ๋ ค์ง„ Node๋ฅผ ์›์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ  ์› ์•ˆ์— ๋งˆ์šฐ์Šค๊ฐ€ ์˜ค๋ฒ„๋˜๋ฉด ๊ฐ์ง€๋˜๋Š” ๋กœ์ง์ด ํ•„์š”ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ฒซ๋ฒˆ์งธ๋กœ ์ฐจํŠธ๋‚ด์—์„œ Node๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๊ฒƒ์ด๋ฏ€๋กœ ๊ฐ™์€ ๋กœ์ง์ด ๋งŽ์ด ๋ฐ˜๋ณต๋  ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ์œ„ํ•˜์—ฌ class๋กœ ๊ตฌํ˜„ํ•ด์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ canvas์— ์›์„ ํ‘œ์‹œํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์šฐ์Šค ์˜ค๋ฒ„ event๋ฅผ canvas์— ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์— ๋“ฑ๋กํ•˜์—ฌ ๋งˆ์šฐ์Šค์˜ x, y ์ขŒํ‘œ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์ด ์ขŒํ‘œ๊ฐ€ ์ฐจํŠธ์— ๊ทธ๋ ค์ง„ Node ๊ฐ์ฒด๋“ค์˜ ์› ๋ฐ˜๊ฒฝ๋งŒํผ ๋“ค์–ด์˜ค๊ฒŒ ๋œ๋‹ค๋ฉด Boolean ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.

canvas์— ๋“ฑ๋ก๋œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์˜ callback ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ฐจํŠธ์— ๊ทธ๋ ค์ง„ Node ๊ฐ์ฒด๋“ค์„ ์ˆœํšŒ ํƒ์ƒ‰ํ•˜๊ณ  ๋ฐ˜ํ™˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ Modal popup์„ ์ƒ์„ฑํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

Chart Mouse over Modal popup

5-2. ์‚ฌ์šฉ์ž์˜ ๊ฒฝํ—˜๊ณผ ๊ธฐํ˜ธ๋ฅผ ์œ„ํ•œ Color Theme

๊ฐœ๋ฐœ์ž๋“ค์˜ ๊ธฐํ˜ธ์— ๋งž๋Š” ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด Color Theme ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

Mode Dark Mode Light Mode
Screen Shot 2023-06-21 แ„‹แ…ฉแ„’แ…ฎ 7 25 17 2023-06-21 แ„‹แ…ฉแ„’แ…ฎ 7 25 24

5-3. ๋ฐ์ดํ„ฐ ๊ฐ€๋…์„ฑ์„ ์œ„ํ•œ ๋‹จ์œ„ ๋ณ€ํ™˜ ๊ธฐ๋Šฅ

๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ธก์ •ํ•˜๋Š” ๊ณผ์ •์˜ ๊ธฐ๋ณธ๋‹จ์œ„๋Š” bytes์™€ ns(nano seconds)์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜์น˜๋ฅผ ์ฝ๊ณ  ์‘์šฉํ•˜๊ฒŒ ๋  ๋•Œ ์ˆซ์ž์˜ ๋‹จ์œ„๊ฐ€ ๋„ˆ๋ฌด ๋†’์•„ ํ™œ์šฉํ•˜๊ธฐ ๋ถˆํŽธํ•  ๊ฑฐ๋ผ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํ† ๊ธ€ ๋ฒ„ํŠผ์„ ํ†ตํ•ด ์ˆ˜์น˜๋“ค์˜ ๋‹จ์œ„๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ๋‚ฎ์€ ์ž๋ฆฟ์ˆ˜์—์„œ ์ˆ˜์น˜ ์žฌ๊ฐ€๊ณต์˜ ์ˆ˜๊ณ ๋กœ์›€์„ ๋œ๊ณ ์ž ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ๋ถ„ bytes, us Killo bytes, ms
Screen Shot แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-06-21 แ„‹แ…ฉแ„’แ…ฎ 7 34 40_cropResult แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-06-21 แ„‹แ…ฉแ„’แ…ฎ 7 34 44_cropResult

6. ํ”„๋กœ์ ํŠธ ๊ฐœ์„  ๋ฐฉํ–ฅ

6-1. SOLID ์›์น™์œผ๋กœ ์ฐจํŠธ ํด๋ž˜์Šค ์„ค๊ณ„ ํ™•์ธ

์ €ํฌ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ˜•ํƒœ์˜ ์ฐจํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฐ™์€ ์  : canvas๋ฅผ ํ™œ์šฉ, ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด์˜ ํ˜•ํƒœ
  • ๋‹ค๋ฅธ ์  : ์ฐจํŠธ ํ˜•ํƒœ(line chart, bar chart)

๋ถ€๋ชจ Class์ธ Base Chart Class๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์ฐจํŠธ๋ฅผ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ์ ์ธ ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

์ฐจํŠธ ํ˜•ํƒœ์— ๋”ฐ๋ผ ์ž์‹ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋ถ€๋ชจํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•œ ํ›„ ์ž์‹ ํด๋ž˜์Šค์—์„œ ์ฐจํŠธ ๊ทธ๋ฆฌ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜์—ฌ ์ฐจํŠธ๊ทธ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•˜๊ณ  ๊ทธ ์™ธ์˜ ๊ตฌํ˜„ ๋งค์„œ๋“œ๋Š” ๋ถ€๋ชจํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ค‘๋ณต์ฝ”๋“œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ›„ ๊ตฌํ˜„ํ•˜์—ฌ ๋กœ์ง, ๋ฐ์ดํ„ฐ ํ๋ฆ„์˜ ์ผ์น˜๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๊ณ  ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์œ ์—ฐํ•จ์„ ์–ป์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค

Chart Class inheritance structure

๊ฐ„๋žตํžˆ ์ฐจํŠธ์˜ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค์˜ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ์›์น™(SOLID) ์„ ํ†ตํ•ด ์ ํ•ฉํ•œ ์„ค๊ณ„์ธ์ง€ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋Š” ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ ธ๊ฐ€์•ผํ•œ๋‹ค.

ํด๋ž˜์Šค์˜(canvas control, set chart data, draw chart) ์„ธ๊ฐ€์ง€ ๋งค์„œ๋“œ๋ฅผ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์ฐจํŠธ๋ฅผ ๊ทธ๋ฆฌ๋Š” ์ฑ…์ž„ ํ•˜๋‚˜๋งŒ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋„๋ก ๋งค์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์†Œํ”„ํŠธ์›จ์–ด ์š”์†Œ๋Š” ํ™•์žฅ์—๋Š” ์—ด๋ ค ์žˆ์œผ๋‚˜ ๋ณ€๊ฒฝ์—๋Š” ๋‹ซํ˜€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์ฐจํŠธ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋Š” set chart data ๋ฅผ ์ด์šฉํ•ด์„œ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๋„๋ก ํ์‡„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

base chart class๋ฅผ ์ƒ์†ํ•˜๊ณ  draw chart ๋งค์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•จ์œผ๋กœ์จ ์žฌ์ •์˜๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐœ๋ฐฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ์˜ย ๊ฐ์ฒด๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ •ํ™•์„ฑ์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š์œผ๋ฉด์„œ ํ•˜์œ„ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

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

ํŠน์ • ํด๋ผ์ด์–ธํŠธ๋ฅผ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ๋ฒ”์šฉ ์ธํ„ฐํŽ˜์ด์Šค ํ•˜๋‚˜๋ณด๋‹ค ๋‚ซ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋กœ ํ™œ์šฉํ•˜๋Š” ๋งค์„œ๋“œ๋“ค์— ๋งค๊ฐœ๋ณ€์ˆ˜ ์‚ฌ์šฉ์„ ํ†ตํ•œ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•˜๋Š” ๋งค์„œ๋“œ๋ฅผ ์—†์•  ๋ฒ”์šฉ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” โ€œ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ์ง€, ๊ตฌ์ฒดํ™”์— ์˜์กดํ•˜๋ฉด ์•ˆ๋œ๋‹ค.โ€

Base Chart Class๋Š” ์ฐจํŠธ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ์œ„ํ•œ ํด๋ž˜์Šค๋กœ ์–ด๋– ํ•œ ๋ถ€๋ถ„๋„ ์ž์‹ ํด๋ž˜์Šค์— ์˜์ง€ํ•˜์ง€ ์•Š๊ณ  ์˜จ์ „ํžˆ ๋…๋ฆฝ๋œ ๊ฐ์ฒด๋กœ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•จ์— ์žˆ์–ด์„œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ SOLID์›์น™์„ ์ƒ๊ฐํ•˜๋ฉฐ ๋‹ค์–‘ํ•œ ์ฐจํŠธ ํด๋ž˜์Šค ๊ตฌํ˜„์„ ์œ„ํ•œ ์ถ”์ƒํ™”์™€ ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œํ˜„ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•จ์— ์žˆ์–ด์„œ SOLID์›์น™ ์•ˆ์—์„œ ๊ตฌํ˜„ํ•ด์•ผ ํด๋ž˜์Šค์˜ ์žฅ์ ์„ ์˜ค๋กฏ์ด ์ฑ™๊ธธ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.


6-2. useCanvas() ์ปค์Šคํ…€ ํ›…์„ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด ์–ด๋•Ÿ์„๊นŒ?

ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๋„์ค‘์—๋Š” ์ฐจํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋กœ์ง์„ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€๋กœ ๋ถ„๋ฆฌํ•˜์˜€๋Š”๋ฐ, ๋˜๋Œ์•„๋ณด๋‹ˆ ์ด๋ฅผ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด ๋” ์ข‹์•˜๊ฒ ๋‹ค๋Š” ์ˆœ๊ฐ„์ด ๋งŽ์•˜์Šต๋‹ˆ๋‹ค.


6-3. ์ปค์Šคํ…€ ํ˜น์€ ์ปดํฌ๋„ŒํŠธ๊ฐ„์— ๋กœ์ง ๊ณต์œ ๊ฐ€ ์ž์œ ๋กญ์Šต๋‹ˆ๋‹ค.

์ฐจํŠธ๋ฅผ ์ง์ ‘ ์ œ์ž‘ํ•˜์˜€์„ ๋•Œ ๋‹จ์ˆœํžˆ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๋งŒ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ์ฐจํŠธ ๋…ธ๋“œ๋“ค์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ๊ตฌ์ฒด์ ์ธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋‹ฌ์„ ๊ฐ™์ด ์ œ๊ณตํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ฐ๊ธฐ ๊ธฐ๋Šฅ์€ ๋‹ค๋ฅด์ง€๋งŒ, ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ๋ฅผ 3๊ฐ€์ง€ ์ฐจํŠธ ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค.

(ํ•ด๋‹น ๋ถ€๋ถ„์— gif๋กœ ๋ชจ๋‹ฌ์„ ๋„์šฐ๋Š” ์žฅ๋ฉด ์‚ฝ์ž…)

์ฐจํŠธ์™€ ๋ชจ๋‹ฌ์€ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌ๋˜์–ด์žˆ์–ด, ๋ฆฌ๋•์Šค ํˆดํ‚ท์„ ํ†ตํ•ด ์ฐจํŠธ์˜ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ๋•์Šค ํˆดํ‚ท์—์„œ๋Š” ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ž์ฒด hooks์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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

(๊ทธ๋ฆผ ๊ทธ๋ฆฌ๊ธฐ)

๋งŒ์ผ ์ฐจํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋กœ์ง์„ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๊ด€๋ฆฌํ•˜์˜€๋‹ค๋ฉด, ๋ฆฌ์•กํŠธ ํ˜น์€ ๋ฆฌ์•กํŠธ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ์ œ๊ณตํ•˜๋Š” ์ปค์Šคํ…€ ํ›…์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์— ์ž์œ ๋กœ์› ์„ ๊ฒƒ์ด๋ž€ ์•„์‰ฌ์›€์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. Canvas API๋กœ ์ฐจํŠธ๋ฅผ ๊ทธ๋ฆฌ๋Š” ๋กœ์ง์„ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋ฐ”๊พผ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?


6-4. useRef ๋ฆฌ์•กํŠธ ํ›…์œผ๋กœ canvas์— ์ ‘๊ทผํ•˜๊ธฐ

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 ์†์„ฑ์— ์ ‘๊ทผํ•˜์˜€์Šต๋‹ˆ๋‹ค.


6-5. useChart ์ปค์Šคํ…€ ํ›…์„ ๋งŒ๋“ค์–ด ์žฌ์‚ฌ์šฉ์„ฑ ๋†’์ด๊ธฐ

ํ˜„์žฌ 3๊ฐ€์ง€ ์ฐจํŠธ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด ๋ฆฌ์•กํŠธ์—์„œ ์บ”๋ฒ„์Šค๋กœ ์ฐจํŠธ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•œ ๊ณตํ†ต๋œ ๋‚ด์šฉ๋“ค์„ useChart()๋กœ ๊ด€๋ฆฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(์ปค์Šคํ…€ ํ›…์œผ๋กœ ์ฐจํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ์˜ ์˜ˆ์‹œ)





๐Ÿ”น Schedule

  • 1์ฃผ์ฐจ

    • ์•„์ด๋””์–ด ์ˆ˜์ง‘, ์„ ์ •
    • ๊ธฐ์ˆ  ์Šคํƒ ์„ ์ •
    • Git ์ž‘์—… ํ”Œ๋กœ์šฐ ๊ฒฐ์ •
    • ESLint, Prettier, Husky ์„ค์ •
    • KANBAN ์ž‘์„ฑ
  • 2์ฃผ์ฐจ

    • Electron ์„ค์ • ๋ฐ ๋ฆฌ์•กํŠธ ์„ค์ •
    • AST๋ฅผ ์ด์šฉํ•œ CodeParser ๊ตฌํ˜„
    • Canvas API๋ฅผ ์ด์šฉํ•œ ์ฐจํŠธ ๊ตฌํ˜„
    • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ
    • README ์ž‘์„ฑ

๐Ÿ”น Tech Stacks

FrontEnd

  • Electron
  • React
  • Redux
  • Styled Components

๐Ÿ”น Member

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •  

Languages