๐ ํ์ ์คํฌ๋ฆฝํธ ํผํฌ๋จผ์ค ํ๋กํ์ผ๋ง ๋๊ตฌ ํ์ฉ ๋์์ ! ๐ต๏ธโโ๏ธ

์๋ ํ์ธ์, ํ์ ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์ ์ฌ๋ฌ๋ถ! ์ค๋์ ์ ๋ง ํฅ๋ฏธ์ง์งํ ์ฃผ์ ๋ก ์ฌ๋ฌ๋ถ์ ์ฐพ์์์ต๋๋ค. ๋ฐ๋ก ํ์ ์คํฌ๋ฆฝํธ ํผํฌ๋จผ์ค ํ๋กํ์ผ๋ง ๋๊ตฌ์ ๋ํด ๊น์ด ์๊ฒ ํํค์ณ๋ณผ ๊ฑฐ์์. ๐
์ฌ๋ฌ๋ถ, ํน์ ์์ ์ ํ์ ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ๊ฑฐ๋ถ์ด์ฒ๋ผ ๋๋ฆฌ๊ฒ ์์ง์ด๋ ๊ฒ ๊ฐ๋์? ์๋๋ฉด ํ ๋ผ์ฒ๋ผ ๋น ๋ฅด๊ฒ ๋ฌ๋ฆฌ๊ณ ์๋ค๊ณ ํ์ ํ์๋์? ์ด๋ค ๊ฒฝ์ฐ๋ , ์ฐ๋ฆฌ๋ ์ฝ๋์ ์ฑ๋ฅ์ ์ ํํ ์ธก์ ํ๊ณ ๊ฐ์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ํด๋ต์ ๋ฐ๋ก ํผํฌ๋จผ์ค ํ๋กํ์ผ๋ง ๋๊ตฌ์ ์๋ต๋๋ค! ๐
์ด ๊ธ์ ํตํด ์ฌ๋ฌ๋ถ์ ๋ง์น ์ํผ ๊ฐ๋ฐ์๊ฐ ๋ ๊ฒ์ฒ๋ผ ์ฝ๋์ ์ฑ๋ฅ์ ๊ผผ๊ผผํ ๋ถ์ํ๊ณ , ๋ฌธ์ ์ ์ ์ฐพ์๋ด๋ฉฐ, ์ต์ ํ์ ๋ง๋ฒ์ ๋ถ๋ฆด ์ ์๊ฒ ๋ ๊ฑฐ์์. ์, ๊ทธ๋ผ ํ์ ์คํฌ๋ฆฝํธ ์ฑ๋ฅ ์ต์ ํ์ ์ธ๊ณ๋ก ํจ๊ป ๋ ๋๋ณผ๊น์? ๐
๐ก ์ฐธ๊ณ : ์ด ๊ธ์ '์ฌ๋ฅ๋ท'(https://www.jaenung.net)์ '์ง์์ธ์ ์ฒ' ๋ฉ๋ด์ ๋ฑ๋ก๋ ์์ ์ ๋๋ค. ์ฌ๋ฅ๋ท์ ๋ค์ํ ์ฌ๋ฅ์ ๊ฑฐ๋ํ๋ ํ๋ซํผ์ผ๋ก, ํ๋ก๊ทธ๋๋ฐ skills๋ ๊ณต์ ํ ์ ์๋ ๋ฉ์ง ๊ณณ์ด์์!
๐ ํ์ ์คํฌ๋ฆฝํธ ํผํฌ๋จผ์ค ํ๋กํ์ผ๋ง์ด๋?
์, ๋จผ์ ํผํฌ๋จผ์ค ํ๋กํ์ผ๋ง์ด ๋ฌด์์ธ์ง ์์๋ณผ๊น์? ๊ฐ๋จํ ๋งํด, ์ด๋ ์ฐ๋ฆฌ ์ฝ๋์ ์ฑ๋ฅ์ ์ธก์ ํ๊ณ ๋ถ์ํ๋ ๊ณผ์ ์ ๋งํฉ๋๋ค. ๋ง์น ์์ฌ๊ฐ ํ์์ ๊ฑด๊ฐ ์ํ๋ฅผ ์ฒดํฌํ๋ฏ์ด, ์ฐ๋ฆฌ๋ ์ฝ๋์ '๊ฑด๊ฐ ์ํ'๋ฅผ ํ์ธํ๋ ๊ฑฐ์ฃ . ๐ฉบ
ํ์ ์คํฌ๋ฆฝํธ์์ ํผํฌ๋จผ์ค ํ๋กํ์ผ๋ง์ ํ๋ค๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ๊ฒ๋ค์ ํ์ธํ๋ค๋ ์๋ฏธ์์:
- ์ฝ๋์ ์คํ ์๊ฐ โฑ๏ธ
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๐พ
- CPU ์ฌ์ฉ๋ฅ ๐ฅ๏ธ
- ๋ณ๋ชฉ ํ์์ด ๋ฐ์ํ๋ ์ง์ ๐ง
- ๋นํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ด๋ ํจํด ๐
์ด๋ ๊ฒ ์ฝ๋์ ์ฑ๋ฅ์ ๊ผผ๊ผผํ ์ฒดํฌํจ์ผ๋ก์จ, ์ฐ๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋๋ฅผ ๋์ด๊ณ , ์์ ์ฌ์ฉ์ ์ต์ ํํ๋ฉฐ, ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ ์ ์๋ต๋๋ค. ๋ง์น ์๋์ฐจ์ ์์ง์ ํ๋ํ๋ ๊ฒ๊ณผ ๊ฐ์ฃ ! ๐๏ธ๐จ
๐ ์ฌ๋ฅ๋ท Tip: ํผํฌ๋จผ์ค ํ๋กํ์ผ๋ง ์คํฌ์ ์ฌ๋ฅ๋ท์์ ๋งค์ฐ ์ธ๊ธฐ ์๋ ์ฌ๋ฅ ์ค ํ๋์ ๋๋ค. ์ฌ๋ฌ๋ถ์ ํ๋กํ์ผ๋ง ๋ฅ๋ ฅ์ ํฅ์์ํค๋ฉด, ์ฌ๋ฅ๋ท์์ ๊ท์คํ ์ฌ๋ฅ์ผ๋ก ๊ณต์ ํ ์ ์์ ๊ฑฐ์์!
์ด์ ํผํฌ๋จผ์ค ํ๋กํ์ผ๋ง์ ๊ฐ๋ ์ ์ดํดํ์ผ๋, ํ์ ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉํ ์ ์๋ ๋ค์ํ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ค์ ํ๋์ฉ ์ดํด๋ณผ๊น์? ์ค๋น๋์ จ๋์? ๊ทธ๋ผ ์ถ๋ฐ~! ๐
๐ ๏ธ ํ์ ์คํฌ๋ฆฝํธ ํผํฌ๋จผ์ค ํ๋กํ์ผ๋ง ๋๊ตฌ๋ค
ํ์ ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์๋ค์๊ฒ ๋ฐ๊ฐ์ด ์์! ์ฐ๋ฆฌ์๊ฒ ์ ๋ง ๋ค์ํ๊ณ ๊ฐ๋ ฅํ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ค์ด ์๋ต๋๋ค. ๋ง์น ์ํผํ์ด๋ก์ ๋๊ตฌ ๋ฒจํธ์ฒ๋ผ ๋ง์ด์ฃ ! ๐ฆธโโ๏ธ ์ด์ ๊ทธ ๋๊ตฌ๋ค์ ํ๋์ฉ ๊บผ๋ด๋ณผ๊น์?
1. Chrome DevTools ๐
์ฒซ ๋ฒ์งธ๋ก ์๊ฐํ ๋๊ตฌ๋ ๋ฐ๋ก Chrome DevTools์ ๋๋ค. ์น ๊ฐ๋ฐ์๋ผ๋ฉด ๋๊ตฌ๋ ์๊ณ ์๋ ์ด ๊ฐ๋ ฅํ ๋๊ตฌ, ์ค์ ํ์ ์คํฌ๋ฆฝํธ ํ๋กํ์ผ๋ง์๋ ์์ฃผ ์ ์ฉํ๋ต๋๋ค!
Chrome DevTools๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒ๋ค์ ํ ์ ์์ด์:
- JavaScript ์คํ ์๊ฐ ์ธก์ โฑ๏ธ
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ชจ๋ํฐ๋ง ๐
- CPU ํ๋กํ์ผ ์์ฑ ๐ฅ๏ธ
- ๋คํธ์ํฌ ์์ฒญ ๋ถ์ ๐
Chrome DevTools๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์ฃผ ๊ฐ๋จํด์:
- Chrome ๋ธ๋ผ์ฐ์ ์์ F12 ํค๋ฅผ ๋๋ฅด๊ฑฐ๋ ์ค๋ฅธ์ชฝ ํด๋ฆญ ํ '๊ฒ์ฌ'๋ฅผ ์ ํํฉ๋๋ค.
- 'Performance' ํญ์ ํด๋ฆญํฉ๋๋ค.
- ๋ นํ ๋ฒํผ์ ๋๋ฌ ํ๋กํ์ผ๋ง์ ์์ํฉ๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉํฉ๋๋ค.
- ๋ นํ๋ฅผ ์ค์งํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ถ์ํฉ๋๋ค.
๐ก 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๋ฅผ ์ฌ์ฉํด ์ ์ฒด์ ์ธ ์ฑ๋ฅ์ ํ์ธํด๋ด ์๋ค.
- Chrome์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๊ณ DevTools๋ฅผ ์คํํฉ๋๋ค (F12).
- 'Performance' ํญ์ ์ ํํฉ๋๋ค.
- ๋ นํ ๋ฒํผ์ ๋๋ฅด๊ณ ํจ์๋ฅผ ์คํํฉ๋๋ค.
- ๋ นํ๋ฅผ ์ค์งํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ถ์ํฉ๋๋ค.
๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ 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 ํญ์ ์ฌ์ฉํด ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ํ์งํ ์ ์์ด์.
- Chrome DevTools๋ฅผ ์ด๊ณ 'Memory' ํญ์ ์ ํํฉ๋๋ค.
- 'Heap snapshot'์ ์ ํํ๊ณ ์ค๋ ์ท์ ์ฐ์ต๋๋ค.
- ์์ฌ๋๋ ์์ ์ ์ํํฉ๋๋ค.
- ๋ค์ ์ค๋ ์ท์ ์ฐ์ต๋๋ค.
- ๋ ์ค๋ ์ท์ ๋น๊ตํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋น์ ์์ ์ผ๋ก ์ฆ๊ฐํ ๊ฐ์ฒด๋ฅผ ์ฐพ์ต๋๋ค.
๐ก 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) ์ต์ ํ ๐ฅ
'ํซ ํจ์ค'๋ ๊ฐ์ฅ ์์ฃผ ์คํ๋๋ ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ๋งํด์. ์ด๋ฅผ ์ต์ ํํ๋ฉด ์ ์ฒด ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- 0x๋ Node.js ํ๋กํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํด ๊ฐ์ฅ ์์ฃผ ํธ์ถ๋๋ ํจ์๋ฅผ ์ฐพ์ต๋๋ค.
- ํด๋น ํจ์ ๋ด์์ ๊ฐ์ฅ ์๊ฐ์ ๋ง์ด ์๋นํ๋ ๋ถ๋ถ์ ์๋ณํฉ๋๋ค.
- ์กฐ๊ฑด๋ฌธ์ ์ฌ์ ๋ ฌํ์ฌ ๊ฐ์ฅ ํํ ์ผ์ด์ค๊ฐ ๋จผ์ ํ๊ฐ๋๋๋ก ํฉ๋๋ค.
- ๋ฃจํ ๋ด๋ถ์ ๊ณ์ฐ์ ๊ฐ๋ฅํ ํ ๋ฃจํ ์ธ๋ถ๋ก ์ด๋์ํต๋๋ค.
- ํ์ํ๋ค๋ฉด ๋ฉ๋ชจ์ด์ ์ด์ (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. ์น ์์ปค ํ์ฉํ๊ธฐ ๐ทโโ๏ธ
๋ณต์กํ ๊ณ์ฐ์ ๋ฉ์ธ ์ค๋ ๋์์ ๋ถ๋ฆฌํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์์ฑ์ ๋์ผ ์ ์์ด์:
- ๋ฌด๊ฑฐ์ด ๊ณ์ฐ์ ๋ณ๋์ TypeScript ํ์ผ๋ก ๋ถ๋ฆฌํฉ๋๋ค.
- ์ด๋ฅผ ์น ์์ปค๋ก ์ปดํ์ผํฉ๋๋ค.
- ๋ฉ์ธ ์คํฌ๋ฆฝํธ์์ ์์ปค๋ฅผ ์์ฑํ๊ณ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ต๋๋ค.
// 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์ฃผ๋ง๋ค) ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ๊ฒํ ํ์ธ์:
- Chrome DevTools์ Lighthouse๋ฅผ ์คํํ์ฌ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ ์ ์๋ฅผ ํ์ธํฉ๋๋ค.
- Node.js ํ๋กํ์ผ๋ฌ๋ก ์๋ฒ ์ฑ๋ฅ์ ์ฒดํฌํฉ๋๋ค.
- 0x๋ก ํซ์คํ์ ์๋ณํ๊ณ ๋ถ์ํฉ๋๋ค.
- WebPageTest๋ก ๋ค์ํ ๋คํธ์ํฌ ํ๊ฒฝ์์์ ์ฑ๋ฅ์ ํ ์คํธํฉ๋๋ค.
3. ์ฑ๋ฅ ๋ฌธํ ๋ง๋ค๊ธฐ ๐ฑ
ํ ์ ์ฒด๊ฐ ์ฑ๋ฅ์ ์ค์์ฑ์ ์ธ์ํ๋๋ก ๋ง๋์ธ์:
- ์ฝ๋ ๋ฆฌ๋ทฐ์ ์ฑ๋ฅ ๊ด๋ จ ์ฒดํฌ๋ฆฌ์คํธ๋ฅผ ํฌํจ์ํต๋๋ค.
- ์ฑ๋ฅ ๊ฐ์ ์ฌ๋ก๋ฅผ ๊ณต์ ํ๋ ์ ๊ธฐ์ ์ธ ๋ฏธํ ์ ๊ฐ์ง๋๋ค.
- ์ฑ๋ฅ ๊ฐ์ ์ ๋ํ ๋ณด์ ์์คํ ์ ๋์ ํฉ๋๋ค.
4. ์ ์ง์ ๊ฐ์ ์ ๋ต ์ฑํ ๐
ํ ๋ฒ์ ๋ชจ๋ ๊ฒ์ ์๋ฒฝํ๊ฒ ๋ง๋ค๋ ค๊ณ ํ์ง ๋ง์ธ์. ๋์ :
- ๊ฐ์ฅ ํฐ ์ํฅ์ ๋ฏธ์น๋ ๋ฌธ์ ๋ถํฐ ํด๊ฒฐํฉ๋๋ค.
- ์์ ๊ฐ์ ์ฌํญ๋ค์ ์ง์์ ์ผ๋ก ์ ์ฉํฉ๋๋ค.
- ๊ฐ ๋ณ๊ฒฝ์ฌํญ์ ์ํฅ์ ์ธก์ ํ๊ณ ๋ฌธ์ํํฉ๋๋ค.
๐ก Pro Tip: A/B ํ ์คํ ์ ํ์ฉํ์ฌ ์ฑ๋ฅ ๊ฐ์ ์ ์ค์ ์ํฅ์ ์ธก์ ํด๋ณด์ธ์!
5. ์ฌ์ฉ์ ์ค์ฌ ์ฑ๋ฅ ์ต์ ํ ๐ฅ
์ค์ ์ฌ์ฉ์์ ๊ฒฝํ์ ์ค์ฌ์ผ๋ก ์ฑ๋ฅ์ ์ต์ ํํ์ธ์:
- ์ค์ ์ฌ์ฉ์ ๋ชจ๋ํฐ๋ง(RUM) ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ํ๊ฒฝ์์์ ์ฑ๋ฅ ๋ฐ์ดํฐ๋ฅผ ์์งํฉ๋๋ค.
- ๋ค์ํ ๋๋ฐ์ด์ค์ ๋คํธ์ํฌ ํ๊ฒฝ์์ ํ ์คํธํฉ๋๋ค.
- ์ฌ์ฉ์ ํผ๋๋ฐฑ์ ์ ๊ทน์ ์ผ๋ก ์์งํ๊ณ ๋ฐ์ํฉ๋๋ค.
6. ์ง์์ ์ธ ํ์ต๊ณผ ์คํ ๐งช
์ฑ๋ฅ ์ต์ ํ ๋ถ์ผ๋ ๊ณ์ ๋ฐ์ ํ๊ณ ์์ด์:
- ์ต์ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฅ๊ณผ ์น ํ์ค์ ์ฃผ์ํฉ๋๋ค.
- ์๋ก์ด ์ต์ ํ ๊ธฐ๋ฒ์ ์คํํด๋ด ๋๋ค.
- ์ฑ๋ฅ ๊ด๋ จ ์ปจํผ๋ฐ์ค์ ์ํฌ์ต์ ์ฐธ์ฌํฉ๋๋ค.
์ด๋ฌํ best practices๋ฅผ ๋ฐ๋ฅด๋ฉด, ์ฌ๋ฌ๋ถ์ ํ์ ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ๋ ์ง์์ ์ผ๋ก ๋ฐ์ ํ๊ณ ์ต๊ณ ์ ์ฑ๋ฅ์ ์ ์งํ ์ ์์ ๊ฑฐ์์. ๐
๐ ์ฌ๋ฅ๋ท Tip: ์ด๋ฐ ์ค์ ๊ฒฝํ๊ณผ best practices๋ ์ฌ๋ฅ๋ท์์ ๋งค์ฐ ๊ฐ์น ์๋ ์์ฐ์ด ๋ ์ ์์ด์. ์ฌ๋ฌ๋ถ์ ๊ฒฝํ์ ๊ณต์ ํ๊ณ , ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ ๋ฉํ ๋งํ๋ ๊ธฐํ๋ฅผ ์ฐพ์๋ณด์ธ์. ๊ทธ๊ฒ์ด ๋ฐ๋ก ์ฌ๋ฅ๋ท์ ์ ์ ์ด๋๊น์!
์, ์ด์ ์ฐ๋ฆฌ์ ์ฌ์ ์ด ๋๋๊ฐ๊ณ ์์ด์. ํ์ ์คํฌ๋ฆฝํธ ํผํฌ๋จผ์ค ํ๋กํ์ผ๋ง์ ์ธ๊ณ๋ฅผ ํํํ๋ฉด์, ์ฌ๋ฌ๋ถ์ ์ ๋ง ๋ง์ ๊ฒ์ ๋ฐฐ์ ์ด์. ์ด ์ง์์ ํ์ฉํ์ฌ ๋ ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๊ณ , ๋ ๋์ ๊ฐ๋ฐ์๊ฐ ๋๊ธธ ๋ฐ๋๊ฒ์. ๊ทธ๋ฆฌ๊ณ ์์ง ๋ง์ธ์, ์ฌ๋ฌ๋ถ์ ์ฌ๋ฅ์ ์ฌ๋ฅ๋ท์์ ๋น์ ๋ฐํ ์ ์์ด์! ํจ๊ป ์ฑ์ฅํ๊ณ , ํจ๊ป ๋๋๋ ๊ฐ๋ฐ ๋ฌธํ๋ฅผ ๋ง๋ค์ด๊ฐ์๋ค. ๐
๋ง์ง๋ง์ผ๋ก, ์ฑ๋ฅ ์ต์ ํ๋ ๋์ด ์๋ ์ฌ์ ์ด๋ผ๋ ๊ฒ์ ๊ธฐ์ตํ์ธ์. ํญ์ ํธ๊ธฐ์ฌ์ ๊ฐ์ง๊ณ , ์๋ก์ด ๊ฒ์ ๋ฐฐ์ฐ๊ณ , ์คํํ์ธ์. ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ์ค์ํ ๊ฑด, ์ฌ๋ฌ๋ถ์ ์ง์๊ณผ ๊ฒฝํ์ ๋ค๋ฅธ ์ด๋ค๊ณผ ๋๋๋ ๊ฑฐ์์. ๊ทธ๊ฒ์ด ๋ฐ๋ก ์ฐ๋ฆฌ ๋ชจ๋๋ฅผ ๋ ๋์ ๊ฐ๋ฐ์๋ก ๋ง๋๋ ๊ธธ์ด๋๊น์. ๐ฑ
์ฌ๋ฌ๋ถ์ ํ์ ์คํฌ๋ฆฝํธ ํผํฌ๋จผ์ค ํ๋กํ์ผ๋ง ์ฌ์ ์ ํ์ด์ด ์๊ธฐ๋ฅผ! ํ์ดํ ! ๐ช
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ