๐Ÿš€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํผํฌ๋จผ์Šค ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ ํ™œ์šฉ ๋Œ€์ž‘์ „! ๐Ÿ•ต๏ธโ€โ™€๏ธ

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํผํฌ๋จผ์Šค ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ ํ™œ์šฉ ๋Œ€์ž‘์ „! ๐Ÿ•ต๏ธโ€โ™€๏ธ

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ์ž ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ ์ •๋ง ํฅ๋ฏธ์ง„์ง„ํ•œ ์ฃผ์ œ๋กœ ์—ฌ๋Ÿฌ๋ถ„์„ ์ฐพ์•„์™”์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํผํฌ๋จผ์Šค ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ์— ๋Œ€ํ•ด ๊นŠ์ด ์žˆ๊ฒŒ ํŒŒํ—ค์ณ๋ณผ ๊ฑฐ์˜ˆ์š”. ๐ŸŽ‰

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

์ด ๊ธ€์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ๋ถ„์€ ๋งˆ์น˜ ์Šˆํผ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ์ฝ”๋“œ์˜ ์„ฑ๋Šฅ์„ ๊ผผ๊ผผํžˆ ๋ถ„์„ํ•˜๊ณ , ๋ฌธ์ œ์ ์„ ์ฐพ์•„๋‚ด๋ฉฐ, ์ตœ์ ํ™”์˜ ๋งˆ๋ฒ•์„ ๋ถ€๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”. ์ž, ๊ทธ๋Ÿผ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ์„ธ๊ณ„๋กœ ํ•จ๊ป˜ ๋– ๋‚˜๋ณผ๊นŒ์š”? ๐Ÿš€

๐Ÿ’ก ์ฐธ๊ณ : ์ด ๊ธ€์€ '์žฌ๋Šฅ๋„ท'(https://www.jaenung.net)์˜ '์ง€์‹์ธ์˜ ์ˆฒ' ๋ฉ”๋‰ด์— ๋“ฑ๋ก๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ์žฌ๋Šฅ๋„ท์€ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ์„ ๊ฑฐ๋ž˜ํ•˜๋Š” ํ”Œ๋žซํผ์œผ๋กœ, ํ”„๋กœ๊ทธ๋ž˜๋ฐ skills๋„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ‹์ง„ ๊ณณ์ด์—์š”!

๐Ÿ” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํผํฌ๋จผ์Šค ํ”„๋กœํŒŒ์ผ๋ง์ด๋ž€?

์ž, ๋จผ์ € ํผํฌ๋จผ์Šค ํ”„๋กœํŒŒ์ผ๋ง์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณผ๊นŒ์š”? ๊ฐ„๋‹จํžˆ ๋งํ•ด, ์ด๋Š” ์šฐ๋ฆฌ ์ฝ”๋“œ์˜ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์น˜ ์˜์‚ฌ๊ฐ€ ํ™˜์ž์˜ ๊ฑด๊ฐ• ์ƒํƒœ๋ฅผ ์ฒดํฌํ•˜๋“ฏ์ด, ์šฐ๋ฆฌ๋Š” ์ฝ”๋“œ์˜ '๊ฑด๊ฐ• ์ƒํƒœ'๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฑฐ์ฃ . ๐Ÿฉบ

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ํผํฌ๋จผ์Šค ํ”„๋กœํŒŒ์ผ๋ง์„ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ํ™•์ธํ•œ๋‹ค๋Š” ์˜๋ฏธ์˜ˆ์š”:

  • ์ฝ”๋“œ์˜ ์‹คํ–‰ ์‹œ๊ฐ„ โฑ๏ธ
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๐Ÿ’พ
  • CPU ์‚ฌ์šฉ๋ฅ  ๐Ÿ–ฅ๏ธ
  • ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๋Š” ์ง€์  ๐Ÿšง
  • ๋น„ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‚˜ ํŒจํ„ด ๐Ÿ”

์ด๋ ‡๊ฒŒ ์ฝ”๋“œ์˜ ์„ฑ๋Šฅ์„ ๊ผผ๊ผผํžˆ ์ฒดํฌํ•จ์œผ๋กœ์จ, ์šฐ๋ฆฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์†๋„๋ฅผ ๋†’์ด๊ณ , ์ž์› ์‚ฌ์šฉ์„ ์ตœ์ ํ™”ํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค. ๋งˆ์น˜ ์ž๋™์ฐจ์˜ ์—”์ง„์„ ํŠœ๋‹ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ ! ๐ŸŽ๏ธ๐Ÿ’จ

๐ŸŒŸ ์žฌ๋Šฅ๋„ท Tip: ํผํฌ๋จผ์Šค ํ”„๋กœํŒŒ์ผ๋ง ์Šคํ‚ฌ์€ ์žฌ๋Šฅ๋„ท์—์„œ ๋งค์šฐ ์ธ๊ธฐ ์žˆ๋Š” ์žฌ๋Šฅ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœํŒŒ์ผ๋ง ๋Šฅ๋ ฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋ฉด, ์žฌ๋Šฅ๋„ท์—์„œ ๊ท€์ค‘ํ•œ ์žฌ๋Šฅ์œผ๋กœ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”!

์ด์ œ ํผํฌ๋จผ์Šค ํ”„๋กœํŒŒ์ผ๋ง์˜ ๊ฐœ๋…์„ ์ดํ•ดํ–ˆ์œผ๋‹ˆ, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ๋“ค์„ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณผ๊นŒ์š”? ์ค€๋น„๋˜์…จ๋‚˜์š”? ๊ทธ๋Ÿผ ์ถœ๋ฐœ~! ๐Ÿš€

๐Ÿ› ๏ธ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํผํฌ๋จผ์Šค ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ๋“ค

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ๋ฐ˜๊ฐ€์šด ์†Œ์‹! ์šฐ๋ฆฌ์—๊ฒ ์ •๋ง ๋‹ค์–‘ํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ๋“ค์ด ์žˆ๋‹ต๋‹ˆ๋‹ค. ๋งˆ์น˜ ์Šˆํผํžˆ์–ด๋กœ์˜ ๋„๊ตฌ ๋ฒจํŠธ์ฒ˜๋Ÿผ ๋ง์ด์ฃ ! ๐Ÿฆธโ€โ™‚๏ธ ์ด์ œ ๊ทธ ๋„๊ตฌ๋“ค์„ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด๋ณผ๊นŒ์š”?

1. Chrome DevTools ๐ŸŒˆ

์ฒซ ๋ฒˆ์งธ๋กœ ์†Œ๊ฐœํ•  ๋„๊ตฌ๋Š” ๋ฐ”๋กœ Chrome DevTools์ž…๋‹ˆ๋‹ค. ์›น ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๋ˆ„๊ตฌ๋‚˜ ์•Œ๊ณ  ์žˆ๋Š” ์ด ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ, ์‹ค์€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ”„๋กœํŒŒ์ผ๋ง์—๋„ ์•„์ฃผ ์œ ์šฉํ•˜๋‹ต๋‹ˆ๋‹ค!

Chrome DevTools๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ํ•  ์ˆ˜ ์žˆ์–ด์š”:

  • JavaScript ์‹คํ–‰ ์‹œ๊ฐ„ ์ธก์ • โฑ๏ธ
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๋ชจ๋‹ˆํ„ฐ๋ง ๐Ÿ“Š
  • CPU ํ”„๋กœํŒŒ์ผ ์ƒ์„ฑ ๐Ÿ–ฅ๏ธ
  • ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋ถ„์„ ๐ŸŒ

Chrome DevTools๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„์ฃผ ๊ฐ„๋‹จํ•ด์š”:

  1. Chrome ๋ธŒ๋ผ์šฐ์ €์—์„œ F12 ํ‚ค๋ฅผ ๋ˆ„๋ฅด๊ฑฐ๋‚˜ ์˜ค๋ฅธ์ชฝ ํด๋ฆญ ํ›„ '๊ฒ€์‚ฌ'๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  2. 'Performance' ํƒญ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  3. ๋…นํ™” ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ํ”„๋กœํŒŒ์ผ๋ง์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  4. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  5. ๋…นํ™”๋ฅผ ์ค‘์ง€ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก Pro Tip: Chrome DevTools์˜ 'Performance' ํƒญ์—์„œ 'CPU' ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์„ ํƒํ•˜๋ฉด, CPU ์‚ฌ์šฉ๋Ÿ‰๋„ ํ•จ๊ป˜ ํ”„๋กœํŒŒ์ผ๋งํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๋Š” ํŠนํžˆ ๋ณต์žกํ•œ ๊ณ„์‚ฐ์ด ๋งŽ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค!

Chrome DevTools๋Š” ์ •๋ง ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ๋•Œ๋กœ๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํŠนํ™” ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•  ๋•Œ๊ฐ€ ์žˆ์ฃ . ๊ทธ๋Ÿผ ๋‹ค์Œ ๋„๊ตฌ๋กœ ๋„˜์–ด๊ฐ€๋ณผ๊นŒ์š”? ๐Ÿš€

2. TypeScript Compiler ์˜ต์…˜ ๐Ÿ”ง

๋†€๋ž๊ฒŒ๋„, ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ ์ž์ฒด๋„ ํผํฌ๋จผ์Šค ํ”„๋กœํŒŒ์ผ๋ง์„ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค! --generateCpuProfile ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ์ปดํŒŒ์ผ ๊ณผ์ •์—์„œ์˜ CPU ์‚ฌ์šฉ๋Ÿ‰์„ ํ”„๋กœํŒŒ์ผ๋งํ•  ์ˆ˜ ์žˆ์–ด์š”.

์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

tsc --generateCpuProfile profile.cpuprofile

์ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, 'profile.cpuprofile' ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ Chrome DevTools์—์„œ ๋ถˆ๋Ÿฌ์™€ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ Chrome์ด ์†์„ ์žก๊ณ  ํ˜‘๋ ฅํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜Š

์ด ๋ฐฉ๋ฒ•์˜ ์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ํŠนํžˆ ์œ ์šฉ ๐Ÿ“š
  • ํƒ€์ž… ์ฒดํฌ ๊ณผ์ •์—์„œ์˜ ๋ณ‘๋ชฉ ์ง€์ ์„ ์‰ฝ๊ฒŒ ๋ฐœ๊ฒฌ ๐Ÿ”
  • ์ปดํŒŒ์ผ๋Ÿฌ ์ตœ์ ํ™” ์˜ต์…˜์˜ ํšจ๊ณผ๋ฅผ ์ •ํ™•ํžˆ ์ธก์ • ๐Ÿ“

๐ŸŒŸ ์žฌ๋Šฅ๋„ท Tip: ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ ์ตœ์ ํ™” ๊ธฐ์ˆ ์€ ์žฌ๋Šฅ๋„ท์—์„œ ๋†’์€ ๊ฐ€์น˜๋ฅผ ์ง€๋‹Œ ์žฌ๋Šฅ์ด์—์š”. ์ด ์Šคํ‚ฌ์„ ๋งˆ์Šคํ„ฐํ•˜๋ฉด, ์žฌ๋Šฅ๋„ท์—์„œ ๋‹น์‹ ์˜ ์žฌ๋Šฅ์„ ํ•„์š”๋กœ ํ•˜๋Š” ๋งŽ์€ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋‚  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”!

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ๋ธŒ๋ผ์šฐ์ €์™€ ์ปดํŒŒ์ผ๋Ÿฌ ๋ ˆ๋ฒจ์—์„œ์˜ ํ”„๋กœํŒŒ์ผ๋ง ๋ฐฉ๋ฒ•์„ ์•Œ๊ฒŒ ๋˜์—ˆ์–ด์š”. ํ•˜์ง€๋งŒ ๋” ๊นŠ์ด ๋“ค์–ด๊ฐ€๋ณผ๊นŒ์š”? ๋‹ค์Œ ๋„๊ตฌ๋Š” ์ •๋ง ํฅ๋ฏธ์ง„์ง„ํ•ด์š”! ๐Ÿ•ต๏ธโ€โ™€๏ธ

3. Node.js ๋‚ด์žฅ ํ”„๋กœํŒŒ์ผ๋Ÿฌ ๐ŸŸข

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

์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

node --prof dist/app.js

์ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, 'isolate-0xnnnnnnnnnnnn-v8.log' ํ˜•์‹์˜ ๋กœ๊ทธ ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์„ ์ฝ๊ธฐ ์‰ฌ์šด ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”:

node --prof-process isolate-0xnnnnnnnnnnnn-v8.log > processed.txt

์ด์ œ 'processed.txt' ํŒŒ์ผ์—์„œ ์ƒ์„ธํ•œ ํ”„๋กœํŒŒ์ผ๋ง ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด ์ •๋ณด์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค:

  • ๊ฐ ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์‹œ๊ฐ„ โฑ๏ธ
  • ๊ฐ€์žฅ ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•˜๋Š” ํ•จ์ˆ˜๋“ค (Hot functions) ๐Ÿ”ฅ
  • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์ •๋ณด ๐Ÿ—‘๏ธ
  • ์ตœ์ ํ™” ๋ฐ ๋น„์ตœ์ ํ™” ์ฝ”๋“œ์˜ ์‹คํ–‰ ์‹œ๊ฐ„ ๋น„๊ต ๐Ÿ“Š

๐Ÿ’ก Pro Tip: Node.js์˜ --prof ์˜ต์…˜์€ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋‹จ, ์„ฑ๋Šฅ์— ์•ฝ๊ฐ„์˜ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹ , ํŠน์ • ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ผ์‹œ์ ์œผ๋กœ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Node.js ๋‚ด์žฅ ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋Š” ์ •๋ง ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ๋•Œ๋กœ๋Š” ๋” ์‹œ๊ฐ์ ์ด๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•  ๋•Œ๊ฐ€ ์žˆ์ฃ . ๊ทธ๋Ÿผ ๋‹ค์Œ ๋„๊ตฌ๋ฅผ ์‚ดํŽด๋ณผ๊นŒ์š”? ์ด๊ฑด ์ •๋ง ์—ฌ๋Ÿฌ๋ถ„์˜ ๋งˆ์Œ์„ ์‚ฌ๋กœ์žก์„ ๊ฑฐ์˜ˆ์š”! ๐Ÿ˜

4. 0x ๐Ÿ”ฌ

0x๋Š” Node.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ์•„์ฃผ ๋ฉ‹์ง„ ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ์˜ˆ์š”. ์ด ๋„๊ตฌ์˜ ํŠน๋ณ„ํ•œ ์ ์€ ๋ฐ”๋กœ ์•„๋ฆ„๋‹ค์šด ๋Œ€ํ™”ํ˜• ํ”Œ๋ ˆ์ž„ ๊ทธ๋ž˜ํ”„๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฑฐ์ฃ !

์„ค์น˜๋Š” npm์„ ํ†ตํ•ด ๊ฐ„๋‹จํžˆ ํ•  ์ˆ˜ ์žˆ์–ด์š”:

npm install -g 0x

์‚ฌ์šฉ ๋ฐฉ๋ฒ•๋„ ์•„์ฃผ ์‰ฝ๋‹ต๋‹ˆ๋‹ค:

0x dist/app.js

์ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, 0x๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ”„๋กœํŒŒ์ผ๋งํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ HTML ํŒŒ์ผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์„ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์—ด๋ฉด, ๋†€๋ผ์šด ๋Œ€ํ™”ํ˜• ํ”Œ๋ ˆ์ž„ ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”!

0x์˜ ์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • ์ง๊ด€์ ์ด๊ณ  ์•„๋ฆ„๋‹ค์šด ์‹œ๊ฐํ™” ๐ŸŽจ
  • CPU ์‚ฌ์šฉ๋Ÿ‰์„ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋‹จ์œ„๋กœ ์ƒ์„ธํžˆ ๋ถ„์„ ๐Ÿ”
  • ๋ณ‘๋ชฉ ์ง€์ ์„ ์‰ฝ๊ฒŒ ์‹๋ณ„ ๊ฐ€๋Šฅ ๐Ÿšง
  • ๋Œ€ํ™”ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์‰ฌ์šด ํƒ์ƒ‰ ๐Ÿ–ฑ๏ธ

๐ŸŒŸ ์žฌ๋Šฅ๋„ท Tip: 0x๋ฅผ ๋งˆ์Šคํ„ฐํ•˜๋ฉด, ์žฌ๋Šฅ๋„ท์—์„œ Node.js ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ „๋ฌธ๊ฐ€๋กœ ํ™œ์•ฝํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋งŽ์€ ๊ธฐ์—…๋“ค์ด ์ด๋Ÿฐ ์ „๋ฌธ ์ง€์‹์„ ๊ฐ€์ง„ ๊ฐœ๋ฐœ์ž๋ฅผ ์ฐพ๊ณ  ์žˆ๋‹ต๋‹ˆ๋‹ค!

์™€์šฐ! ์šฐ๋ฆฌ๋Š” ์ด์ œ ์ •๋ง ๊ฐ•๋ ฅํ•œ ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ๋“ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ์–ด์š”. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ๋์ด ์•„๋‹ˆ์—์š”. ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์ด ๋„๊ตฌ๋“ค์„ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด์„ํ•˜๊ณ  ์ตœ์ ํ™”์— ์ ์šฉํ•˜๋Š”์ง€ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? Let's dive deeper! ๐ŸŠโ€โ™‚๏ธ

๐ŸŽฏ ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ ํ™œ์šฉ ์‹ค์ „ ๊ฐ€์ด๋“œ

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ๋‹ค์–‘ํ•œ ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ๋“ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ์–ด์š”. ํ•˜์ง€๋งŒ ์ง„์งœ ์ค‘์š”ํ•œ ๊ฑด ์ด ๋„๊ตฌ๋“ค์„ ์–ด๋–ป๊ฒŒ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š๋ƒ๊ฒ ์ฃ ? ์ด๋ฒˆ ์„น์…˜์—์„œ๋Š” ์‹ค์ œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ†ตํ•ด ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž์„ธํžˆ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? Let's get our hands dirty! ๐Ÿง‘โ€๐Ÿ”ง

์‹œ๋‚˜๋ฆฌ์˜ค: ๋Š๋ฆฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜ ์ตœ์ ํ™”ํ•˜๊ธฐ ๐Ÿขโžก๏ธ๐Ÿ‡

์šฐ๋ฆฌ์—๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณผ๊นŒ์š”?


function processLargeArray(data: number[]): number[] {
  let result: number[] = [];
  for (let i = 0; i < data.length; i++) {
    if (data[i] % 2 === 0) {
      result.push(data[i] * 2);
    } else {
      result.push(data[i] * 3);
    }
  }
  return result;
}

const largeArray = Array.from({length: 1000000}, () => Math.floor(Math.random() * 100));
console.time('processLargeArray');
const processedArray = processLargeArray(largeArray);
console.timeEnd('processLargeArray');
  

์ด ํ•จ์ˆ˜๋Š” ํฐ ๋ฐฐ์—ด์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ, ์‹คํ–‰ ์‹œ๊ฐ„์ด ๊ฝค ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ๋“ค์„ ์‚ฌ์šฉํ•ด์„œ ์ด ํ•จ์ˆ˜๋ฅผ ์ตœ์ ํ™”ํ•ด๋ณผ๊นŒ์š”? ๐Ÿ•ต๏ธโ€โ™€๏ธ

Step 1: Chrome DevTools๋กœ ์ „์ฒด์ ์ธ ์„ฑ๋Šฅ ํ™•์ธํ•˜๊ธฐ ๐ŸŒˆ

๋จผ์ € Chrome DevTools๋ฅผ ์‚ฌ์šฉํ•ด ์ „์ฒด์ ์ธ ์„ฑ๋Šฅ์„ ํ™•์ธํ•ด๋ด…์‹œ๋‹ค.

  1. Chrome์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—ด๊ณ  DevTools๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค (F12).
  2. 'Performance' ํƒญ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  3. ๋…นํ™” ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ณ  ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  4. ๋…นํ™”๋ฅผ ์ค‘์ง€ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ๋ฅผ ๋ณด๋‹ˆ processLargeArray ํ•จ์ˆ˜๊ฐ€ ์ „์ฒด ์‹คํ–‰ ์‹œ๊ฐ„์˜ ๋Œ€๋ถ€๋ถ„์„ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋„ค์š”. ์ด์ œ ์šฐ๋ฆฌ๋Š” ์ด ํ•จ์ˆ˜์— ์ง‘์ค‘ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค!

๐Ÿ” ๋ถ„์„ ๊ฒฐ๊ณผ: processLargeArray ํ•จ์ˆ˜๊ฐ€ ์ „์ฒด ์‹คํ–‰ ์‹œ๊ฐ„์˜ 95%๋ฅผ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ช…๋ฐฑํ•œ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ์ง€์ ์ด์—์š”!

Step 2: Node.js ๋‚ด์žฅ ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋กœ ์ƒ์„ธ ๋ถ„์„ํ•˜๊ธฐ ๐ŸŸข

์ด์ œ Node.js ๋‚ด์žฅ ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋” ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์–ป์–ด๋ณผ๊นŒ์š”?

node --prof dist/app.js

์‹คํ–‰ ํ›„ ์ƒ์„ฑ๋œ ๋กœ๊ทธ ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค:

node --prof-process isolate-0xnnnnnnnnnnnn-v8.log > processed.txt

processed.txt ํŒŒ์ผ์„ ์—ด์–ด๋ณด๋‹ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์–ด์š”:

  • processLargeArray ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ์กฐ๊ฑด๋ฌธ (if (data[i] % 2 === 0))์ด ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐฐ์—ด ์ˆœํšŒ ๊ณผ์ •์—์„œ ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ” ๋ถ„์„ ๊ฒฐ๊ณผ: ์กฐ๊ฑด๋ฌธ๊ณผ ๋ฐฐ์—ด ์ˆœํšŒ๊ฐ€ ์ฃผ์š” ๋ณ‘๋ชฉ ์ง€์ ์ž…๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์„ ์ตœ์ ํ™”ํ•˜๋ฉด ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”!

Step 3: 0x๋กœ ์‹œ๊ฐํ™”ํ•˜์—ฌ ์ง๊ด€์ ์œผ๋กœ ํŒŒ์•…ํ•˜๊ธฐ ๐Ÿ”ฌ

๋งˆ์ง€๋ง‰์œผ๋กœ, 0x๋ฅผ ์‚ฌ์šฉํ•ด ๋”์šฑ ์ง๊ด€์ ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํŒŒ์•…ํ•ด๋ณผ๊นŒ์š”?

0x dist/app.js

์ƒ์„ฑ๋œ HTML ํŒŒ์ผ์„ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์—ด์–ด๋ณด๋ฉด, ์•„๋ฆ„๋‹ค์šด ํ”Œ๋ ˆ์ž„ ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์–ด์š”. ์ด ๊ทธ๋ž˜ํ”„์—์„œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ์‹ค์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค:

  • processLargeArray ํ•จ์ˆ˜๊ฐ€ ๊ทธ๋ž˜ํ”„์˜ ๋Œ€๋ถ€๋ถ„์„ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ์–ด์š”.
  • ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ๋ฐฐ์—ด ์กฐ์ž‘ (push)์ด ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์กฐ๊ฑด๋ฌธ ํ‰๊ฐ€๋„ ์ƒ๋‹นํ•œ ์‹œ๊ฐ„์„ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ์–ด์š”.

๐Ÿ” ๋ถ„์„ ๊ฒฐ๊ณผ: ๋ฐฐ์—ด ์กฐ์ž‘๊ณผ ์กฐ๊ฑด๋ฌธ ํ‰๊ฐ€๊ฐ€ ์ฃผ์š” ๋ณ‘๋ชฉ ์ง€์ ์ž„์„ ์‹œ๊ฐ์ ์œผ๋กœ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ด ๋ถ€๋ถ„๋“ค์„ ์ง‘์ค‘์ ์œผ๋กœ ์ตœ์ ํ™”ํ•ด์•ผ ํ•  ๋•Œ์ž…๋‹ˆ๋‹ค!

Step 4: ์ตœ์ ํ™”ํ•˜๊ธฐ ๐Ÿ› ๏ธ

ํ”„๋กœํŒŒ์ผ๋ง ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•จ์ˆ˜๋ฅผ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:


function processLargeArray(data: number[]): number[] {
  return data.map(num => num % 2 === 0 ? num * 2 : num * 3);
}
  

์ด๋ ‡๊ฒŒ ์ตœ์ ํ™”ํ•œ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„์š”:

  • map ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐฐ์—ด ์ˆœํšŒ๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ค‘๊ฐ„ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ์ƒˆ ๋ฐฐ์—ด ์ƒ์„ฑ์„ ์—†์•ด์Šต๋‹ˆ๋‹ค.
  • ์กฐ๊ฑด๋ฌธ์„ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋กœ ๋ณ€๊ฒฝํ•ด ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

Step 5: ๊ฒฐ๊ณผ ํ™•์ธํ•˜๊ธฐ ๐ŸŽ‰

์ตœ์ ํ™”๋œ ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ํ”„๋กœํŒŒ์ผ๋งํ•ด๋ณด๋ฉด, ์‹คํ–‰ ์‹œ๊ฐ„์ด ํฌ๊ฒŒ ์ค„์–ด๋“  ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ์™€์šฐ! ์šฐ๋ฆฌ๊ฐ€ ํ•ด๋ƒˆ์–ด์š”! ๐ŸŽŠ

๐ŸŒŸ ์„ฑ๊ณผ: ์ตœ์ ํ™” ํ›„ ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์‹œ๊ฐ„์ด ์•ฝ 70% ๊ฐ์†Œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์—์„œ ์—„์ฒญ๋‚œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์˜๋ฏธํ•ด์š”!

์ž, ์ด๋ ‡๊ฒŒ ์šฐ๋ฆฌ๋Š” ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ๋“ค์„ ํ™œ์šฉํ•ด ์‹ค์ œ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์ฐพ์•„๋‚ด๊ณ  ํ•ด๊ฒฐํ–ˆ์–ด์š”. ์ •๋ง ๋ฉ‹์ง€์ง€ ์•Š๋‚˜์š”? ๐ŸŒŸ

๐ŸŒŸ ์žฌ๋Šฅ๋„ท Tip: ์ด๋Ÿฐ ํ”„๋กœํŒŒ์ผ๋ง๊ณผ ์ตœ์ ํ™” ๋Šฅ๋ ฅ์€ ์žฌ๋Šฅ๋„ท์—์„œ ๋งค์šฐ ๊ฐ€์น˜ ์žˆ๋Š” ์žฌ๋Šฅ์ด์—์š”. ์—ฌ๋Ÿฌ๋ถ„์ด ์ด๋Ÿฐ ๊ธฐ์ˆ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด, ์žฌ๋Šฅ๋„ท์—์„œ ๋งŽ์€ ํ”„๋กœ์ ํŠธ์™€ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋งŒ๋‚  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”!

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ๋” ๋‹ค์–‘ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ๊ณ ๊ธ‰ ํ”„๋กœํŒŒ์ผ๋ง ๊ธฐ๋ฒ•๋“ค์„ ์‚ดํŽด๋ณผ ๊ฑฐ์˜ˆ์š”. ๊ณ„์†ํ•ด์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์„ฑ๋Šฅ์˜ ์„ธ๊ณ„๋ฅผ ํƒํ—˜ํ•ด๋ณผ๊นŒ์š”? Let's go! ๐Ÿš€

๐Ÿง  ๊ณ ๊ธ‰ ํ”„๋กœํŒŒ์ผ๋ง ๊ธฐ๋ฒ•๊ณผ ํŒ

์—ฌ๋Ÿฌ๋ถ„, ์ •๋ง ๋Œ€๋‹จํ•ด์š”! ์ง€๊ธˆ๊นŒ์ง€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ”„๋กœํŒŒ์ผ๋ง์˜ ๊ธฐ๋ณธ์„ ๋งˆ์Šคํ„ฐํ–ˆ์–ด์š”. ์ด์ œ ํ•œ ๋‹จ๊ณ„ ๋” ๋‚˜์•„๊ฐ€ ๋ณผ๊นŒ์š”? ์ด ์„น์…˜์—์„œ๋Š” ๋” ์‹ฌํ™”๋œ ํ”„๋กœํŒŒ์ผ๋ง ๊ธฐ๋ฒ•๊ณผ ์‹ค์šฉ์ ์ธ ํŒ๋“ค์„ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? Let's level up! ๐Ÿš€

1. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ํƒ์ง€ํ•˜๊ธฐ ๐Ÿ•ต๏ธโ€โ™€๏ธ

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋Š” ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์ฃผ์š” ์›์ธ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. Chrome DevTools์˜ Memory ํƒญ์„ ์‚ฌ์šฉํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ํƒ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์š”.

  1. Chrome DevTools๋ฅผ ์—ด๊ณ  'Memory' ํƒญ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  2. 'Heap snapshot'์„ ์„ ํƒํ•˜๊ณ  ์Šค๋ƒ…์ƒท์„ ์ฐ์Šต๋‹ˆ๋‹ค.
  3. ์˜์‹ฌ๋˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  4. ๋‹ค์‹œ ์Šค๋ƒ…์ƒท์„ ์ฐ์Šต๋‹ˆ๋‹ค.
  5. ๋‘ ์Šค๋ƒ…์ƒท์„ ๋น„๊ตํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋น„์ •์ƒ์ ์œผ๋กœ ์ฆ๊ฐ€ํ•œ ๊ฐ์ฒด๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก Pro Tip: ํด๋กœ์ €๋‚˜ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํŠนํžˆ ์ฃผ์˜ํ•˜์„ธ์š”. ์ด๋“ค์€ ์ข…์ข… ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์˜ ์›์ธ์ด ๋ฉ๋‹ˆ๋‹ค!

2. ๋น„๋™๊ธฐ ์ฝ”๋“œ ํ”„๋กœํŒŒ์ผ๋ง ๐Ÿ”„

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋Š” ๋งค์šฐ ํ”ํ•˜์ง€๋งŒ, ํ”„๋กœํŒŒ์ผ๋งํ•˜๊ธฐ ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜ ์žˆ์–ด์š”. ๋‹ค์Œ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•ด๋ณด์„ธ์š”:

  • async/await๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๋” ์„ ํ˜•์ ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • Chrome DevTools์˜ 'Async' ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์„ ํƒํ•˜์—ฌ ๋น„๋™๊ธฐ ํ˜ธ์ถœ ์Šคํƒ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • Node.js์˜ async_hooks ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ๋ฆฌ์†Œ์Šค๋ฅผ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค.

import * as async_hooks from 'async_hooks';

const asyncHook = async_hooks.createHook({
  init(asyncId, type, triggerAsyncId) {
    console.log(`Async resource created: ${type}`);
  },
  destroy(asyncId) {
    console.log(`Async resource destroyed`);
  }
});

asyncHook.enable();
  

3. ํ•ซ ํŒจ์Šค(Hot Path) ์ตœ์ ํ™” ๐Ÿ”ฅ

'ํ•ซ ํŒจ์Šค'๋ž€ ๊ฐ€์žฅ ์ž์ฃผ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ ๊ฒฝ๋กœ๋ฅผ ๋งํ•ด์š”. ์ด๋ฅผ ์ตœ์ ํ™”ํ•˜๋ฉด ์ „์ฒด ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. 0x๋‚˜ Node.js ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ€์žฅ ์ž์ฃผ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
  2. ํ•ด๋‹น ํ•จ์ˆ˜ ๋‚ด์—์„œ ๊ฐ€์žฅ ์‹œ๊ฐ„์„ ๋งŽ์ด ์†Œ๋น„ํ•˜๋Š” ๋ถ€๋ถ„์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.
  3. ์กฐ๊ฑด๋ฌธ์„ ์žฌ์ •๋ ฌํ•˜์—ฌ ๊ฐ€์žฅ ํ”ํ•œ ์ผ€์ด์Šค๊ฐ€ ๋จผ์ € ํ‰๊ฐ€๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  4. ๋ฃจํ”„ ๋‚ด๋ถ€์˜ ๊ณ„์‚ฐ์„ ๊ฐ€๋Šฅํ•œ ํ•œ ๋ฃจํ”„ ์™ธ๋ถ€๋กœ ์ด๋™์‹œํ‚ต๋‹ˆ๋‹ค.
  5. ํ•„์š”ํ•˜๋‹ค๋ฉด ๋ฉ”๋ชจ์ด์ œ์ด์…˜(memoization)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜๋ณต ๊ณ„์‚ฐ์„ ์ค„์ž…๋‹ˆ๋‹ค.

๐Ÿ’ก Pro Tip: ๋•Œ๋กœ๋Š” ๊ฐ€๋…์„ฑ์„ ์กฐ๊ธˆ ํฌ์ƒํ•˜๋”๋ผ๋„ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด์š”. ํ•˜์ง€๋งŒ ํ•ญ์ƒ ํŒ€๊ณผ ์ƒ์˜ํ•˜์—ฌ ๊ท ํ˜•์„ ์žก์œผ์„ธ์š”!

4. ํƒ€์ž… ์‹œ์Šคํ…œ ํ™œ์šฉํ•˜๊ธฐ ๐Ÿ—๏ธ

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ํƒ€์ž… ์‹œ์Šคํ…œ์„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ๋„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด์š”:

  • ์œ ๋‹ˆ์˜จ ํƒ€์ž… ๋Œ€์‹  ๊ตฌ๋ณ„๋œ ์œ ๋‹ˆ์˜จ(discriminated unions)์„ ์‚ฌ์šฉํ•˜์—ฌ ํƒ€์ž… ๊ฐ€๋“œ๋ฅผ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ํƒ€์ž… ์บ์ŠคํŒ…์„ ์ค„์ž…๋‹ˆ๋‹ค.
  • const assertions์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋” ์ •ํ™•ํ•œ ํƒ€์ž…์„ ์ถ”๋ก ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

// Before
type Shape = { kind: 'circle', radius: number } | { kind: 'rectangle', width: number, height: number };

function getArea(shape: Shape): number {
  if ('radius' in shape) {
    return Math.PI * shape.radius ** 2;
  } else {
    return shape.width * shape.height;
  }
}

// After
type Shape = 
  | { kind: 'circle', radius: number }
  | { kind: 'rectangle', width: number, height: number };

function getArea(shape: Shape): number {
  switch (shape.kind) {
    case 'circle':
      return Math.PI * shape.radius ** 2;
    case 'rectangle':
      return shape.width * shape.height;
  }
}
  

5. ์›น ์›Œ์ปค ํ™œ์šฉํ•˜๊ธฐ ๐Ÿ‘ทโ€โ™‚๏ธ

๋ณต์žกํ•œ ๊ณ„์‚ฐ์„ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ๋ถ„๋ฆฌํ•˜์—ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ˜์‘์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์–ด์š”:

  1. ๋ฌด๊ฑฐ์šด ๊ณ„์‚ฐ์„ ๋ณ„๋„์˜ TypeScript ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  2. ์ด๋ฅผ ์›น ์›Œ์ปค๋กœ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค.
  3. ๋ฉ”์ธ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์›Œ์ปค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›์Šต๋‹ˆ๋‹ค.

// worker.ts
self.addEventListener('message', (e: MessageEvent) => {
  const result = heavyCalculation(e.data);
  self.postMessage(result);
});

// main.ts
const worker = new Worker('worker.js');
worker.postMessage(data);
worker.onmessage = (e: MessageEvent) => {
  console.log('Calculation result:', e.data);
};
  

๐Ÿ’ก Pro Tip: ์›น ์›Œ์ปค๋Š” ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ๋ฐ์ดํ„ฐ ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™” ๋น„์šฉ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ด์š”. ์ž‘์€ ์ž‘์—…์—๋Š” ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

6. ์ปดํŒŒ์ผ๋Ÿฌ ์ตœ์ ํ™” ์˜ต์…˜ ํ™œ์šฉํ•˜๊ธฐ โš™๏ธ

TypeScript ์ปดํŒŒ์ผ๋Ÿฌ ์˜ต์…˜์„ ์กฐ์ •ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด์š”:

  • "strict": true๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋” ์—„๊ฒฉํ•œ ํƒ€์ž… ์ฒดํฌ๋กœ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.
  • "removeComments": true๋กœ ๋ถˆํ•„์š”ํ•œ ์ฃผ์„์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • "noUnusedLocals": true์™€ "noUnusedParameters": true๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

// tsconfig.json
{
  "compilerOptions": {
    "strict": true,
    "removeComments": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true
  }
}
  

์ด๋Ÿฌํ•œ ๊ณ ๊ธ‰ ๊ธฐ๋ฒ•๋“ค์„ ๋งˆ์Šคํ„ฐํ•˜๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์€ ์ง„์ •ํ•œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์„ฑ๋Šฅ ์ „๋ฌธ๊ฐ€๊ฐ€ ๋  ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿ†

๐ŸŒŸ ์žฌ๋Šฅ๋„ท Tip: ์ด๋Ÿฐ ๊ณ ๊ธ‰ ์ตœ์ ํ™” ๊ธฐ์ˆ ๋“ค์€ ์žฌ๋Šฅ๋„ท์—์„œ ๋งค์šฐ ๊ท€์ค‘ํ•œ ์žฌ๋Šฅ์ด ๋  ์ˆ˜ ์žˆ์–ด์š”. ์ด๋ฅผ ๋งˆ์Šคํ„ฐํ•˜๋ฉด, ๊ณ ์„ฑ๋Šฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ์—์„œ ํฐ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”!

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ๊ฑฐ์˜ ๋ชจ๋“  ์ธก๋ฉด์„ ๋‹ค๋ค˜์–ด์š”. ํ•˜์ง€๋งŒ ๊ธฐ์–ตํ•˜์„ธ์š”, ์„ฑ๋Šฅ ์ตœ์ ํ™”๋Š” ๋์ด ์—†๋Š” ์—ฌ์ •์ด์—์š”. ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ๊ณผ ๋„๊ตฌ๋ฅผ ํƒ๊ตฌํ•˜๊ณ , ์‹คํ—˜ํ•˜๊ณ , ํ•™์Šตํ•˜์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฑด, ์—ฌ๋Ÿฌ๋ถ„์˜ ์ง€์‹์„ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค๊ณผ ๊ณต์œ ํ•˜๋Š” ๊ฑฐ์˜ˆ์š”. ํ•จ๊ป˜ ์„ฑ์žฅํ•ด์š”! ๐ŸŒฑ

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์ด ๋ชจ๋“  ๋‚ด์šฉ์„ ์ข…ํ•ฉํ•˜์—ฌ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ best practices์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? ๋งˆ์ง€๋ง‰ ์—ฌ์ •์„ ๋– ๋‚˜๋ณผ๊นŒ์š”? ๐Ÿš€

๐Ÿ† ์‹ค์ „ ์ ์šฉ๊ณผ Best Practices

์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค! ์—ฌ๋Ÿฌ๋ถ„์€ ์ด์ œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํผํฌ๋จผ์Šค ํ”„๋กœํŒŒ์ผ๋ง์˜ ์ „๋ฌธ๊ฐ€๊ฐ€ ๋˜์—ˆ์–ด์š”. ๐ŸŽ‰ ์ด์ œ ์ด ๋ชจ๋“  ์ง€์‹์„ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์— ์–ด๋–ป๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค best practices๋ฅผ ๋”ฐ๋ผ์•ผ ํ• ๊นŒ์š”? ํ•จ๊ป˜ ์•Œ์•„๋ด์š”!

1. ์„ฑ๋Šฅ ์˜ˆ์‚ฐ ์„ค์ •ํ•˜๊ธฐ ๐Ÿ’ฐ

ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ์„ฑ๋Šฅ ๋ชฉํ‘œ๋ฅผ ๋ช…ํ™•ํžˆ ์„ค์ •ํ•˜์„ธ์š”:

  • ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ๊ฐ„
  • ์ฒซ ๋ฒˆ์งธ ์˜๋ฏธ ์žˆ๋Š” ํŽ˜์ธํŠธ(First Meaningful Paint) ์‹œ๊ฐ„
  • ์ƒํ˜ธ์ž‘์šฉ๊นŒ์ง€์˜ ์‹œ๊ฐ„(Time to Interactive)
  • ๋ฒˆ๋“ค ํฌ๊ธฐ

์ด๋Ÿฌํ•œ ๋ชฉํ‘œ๋ฅผ ํŒ€๊ณผ ๊ณต์œ ํ•˜๊ณ , CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— ์„ฑ๋Šฅ ์ฒดํฌ๋ฅผ ํฌํ•จ์‹œํ‚ค์„ธ์š”.

๐Ÿ’ก Pro Tip: Lighthouse CI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™์œผ๋กœ ์„ฑ๋Šฅ ์ง€ํ‘œ๋ฅผ ์ฒดํฌํ•˜๊ณ  ๋ณด๊ณ ํ•  ์ˆ˜ ์žˆ์–ด์š”!

2. ์ •๊ธฐ์ ์ธ ์„ฑ๋Šฅ ๊ฐ์‚ฌ ์‹ค์‹œ ๐Ÿ”

์ฃผ๊ธฐ์ ์œผ๋กœ (์˜ˆ: 2์ฃผ๋งˆ๋‹ค) ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ๊ฒ€ํ† ํ•˜์„ธ์š”:

  1. Chrome DevTools์˜ Lighthouse๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ „๋ฐ˜์ ์ธ ์„ฑ๋Šฅ ์ ์ˆ˜๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  2. Node.js ํ”„๋กœํŒŒ์ผ๋Ÿฌ๋กœ ์„œ๋ฒ„ ์„ฑ๋Šฅ์„ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค.
  3. 0x๋กœ ํ•ซ์ŠคํŒŸ์„ ์‹๋ณ„ํ•˜๊ณ  ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.
  4. WebPageTest๋กœ ๋‹ค์–‘ํ•œ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์—์„œ์˜ ์„ฑ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

3. ์„ฑ๋Šฅ ๋ฌธํ™” ๋งŒ๋“ค๊ธฐ ๐ŸŒฑ

ํŒ€ ์ „์ฒด๊ฐ€ ์„ฑ๋Šฅ์˜ ์ค‘์š”์„ฑ์„ ์ธ์‹ํ•˜๋„๋ก ๋งŒ๋“œ์„ธ์š”:

  • ์ฝ”๋“œ ๋ฆฌ๋ทฐ์— ์„ฑ๋Šฅ ๊ด€๋ จ ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ํฌํ•จ์‹œํ‚ต๋‹ˆ๋‹ค.
  • ์„ฑ๋Šฅ ๊ฐœ์„  ์‚ฌ๋ก€๋ฅผ ๊ณต์œ ํ•˜๋Š” ์ •๊ธฐ์ ์ธ ๋ฏธํŒ…์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
  • ์„ฑ๋Šฅ ๊ฐœ์„ ์— ๋Œ€ํ•œ ๋ณด์ƒ ์‹œ์Šคํ…œ์„ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค.

4. ์ ์ง„์  ๊ฐœ์„  ์ „๋žต ์ฑ„ํƒ ๐Ÿ“ˆ

ํ•œ ๋ฒˆ์— ๋ชจ๋“  ๊ฒƒ์„ ์™„๋ฒฝํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๊ณ  ํ•˜์ง€ ๋งˆ์„ธ์š”. ๋Œ€์‹ :

  • ๊ฐ€์žฅ ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๋ฌธ์ œ๋ถ€ํ„ฐ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  • ์ž‘์€ ๊ฐœ์„ ์‚ฌํ•ญ๋“ค์„ ์ง€์†์ ์œผ๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ๋ณ€๊ฒฝ์‚ฌํ•ญ์˜ ์˜ํ–ฅ์„ ์ธก์ •ํ•˜๊ณ  ๋ฌธ์„œํ™”ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก Pro Tip: A/B ํ…Œ์ŠคํŒ…์„ ํ™œ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ ๊ฐœ์„ ์˜ ์‹ค์ œ ์˜ํ–ฅ์„ ์ธก์ •ํ•ด๋ณด์„ธ์š”!

5. ์‚ฌ์šฉ์ž ์ค‘์‹ฌ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๐Ÿ‘ฅ

์‹ค์ œ ์‚ฌ์šฉ์ž์˜ ๊ฒฝํ—˜์„ ์ค‘์‹ฌ์œผ๋กœ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜์„ธ์š”:

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

6. ์ง€์†์ ์ธ ํ•™์Šต๊ณผ ์‹คํ—˜ ๐Ÿงช

์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ถ„์•ผ๋Š” ๊ณ„์† ๋ฐœ์ „ํ•˜๊ณ  ์žˆ์–ด์š”:

  • ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋Šฅ๊ณผ ์›น ํ‘œ์ค€์„ ์ฃผ์‹œํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ์‹คํ—˜ํ•ด๋ด…๋‹ˆ๋‹ค.
  • ์„ฑ๋Šฅ ๊ด€๋ จ ์ปจํผ๋Ÿฐ์Šค์™€ ์›Œํฌ์ƒต์— ์ฐธ์—ฌํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ best practices๋ฅผ ๋”ฐ๋ฅด๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ์ ํŠธ๋Š” ์ง€์†์ ์œผ๋กœ ๋ฐœ์ „ํ•˜๊ณ  ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ๐Ÿš€

๐ŸŒŸ ์žฌ๋Šฅ๋„ท Tip: ์ด๋Ÿฐ ์‹ค์ „ ๊ฒฝํ—˜๊ณผ best practices๋Š” ์žฌ๋Šฅ๋„ท์—์„œ ๋งค์šฐ ๊ฐ€์น˜ ์žˆ๋Š” ์ž์‚ฐ์ด ๋  ์ˆ˜ ์žˆ์–ด์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ฒฝํ—˜์„ ๊ณต์œ ํ•˜๊ณ , ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์„ ๋ฉ˜ํ† ๋งํ•˜๋Š” ๊ธฐํšŒ๋ฅผ ์ฐพ์•„๋ณด์„ธ์š”. ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ์žฌ๋Šฅ๋„ท์˜ ์ •์‹ ์ด๋‹ˆ๊นŒ์š”!

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

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

์—ฌ๋Ÿฌ๋ถ„์˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํผํฌ๋จผ์Šค ํ”„๋กœํŒŒ์ผ๋ง ์—ฌ์ •์— ํ–‰์šด์ด ์žˆ๊ธฐ๋ฅผ! ํ™”์ดํŒ…! ๐Ÿ’ช