๋ค์ํ ์ง์ญ๊ณผ ๊ธฐ๊ธฐ์์ ์น ์ฑ๋ฅ ํฅ์์ ์ํด JavaScript ๋ชจ๋ ๋ก๋ฉ์ ์ต์ ํํฉ๋๋ค. ์ฝ๋ ๋ถํ , ์ง์ฐ ๋ก๋ฉ, ์บ์ฑ ๋ฑ์ ๊ธฐ์ ์ ์ดํด๋ณด์ธ์.
JavaScript ๋ชจ๋ ์ฑ๋ฅ: ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ๋ก๋ฉ ์ต์ ํ
์ค๋๋ ์ ์ํธ ์ฐ๊ฒฐ๋ ์ธ์์์ ์น์ฌ์ดํธ๋ ์์น, ๊ธฐ๊ธฐ ๋๋ ๋คํธ์ํฌ ํ๊ฒฝ์ ๊ด๊ณ์์ด ์ฌ์ฉ์์๊ฒ ํ์ํ ์ฑ๋ฅ์ ์ ๊ณตํด์ผ ํฉ๋๋ค. ์ต์ ์น ๊ฐ๋ฐ์ ์ด์์ธ JavaScript๋ ๋ํํ ๋ฐ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ง๋๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ต์ ํ๊ฐ ์ ๋๋ก ์ด๋ฃจ์ด์ง์ง ์์ JavaScript๋ ํ์ด์ง ๋ก๋ ์๊ฐ์ ํฐ ์ํฅ์ ๋ฏธ์ณ ์ฌ์ฉ์ ์ฐธ์ฌ๋ฅผ ๋ฐฉํดํ๊ณ ์ ์ฌ์ ์ผ๋ก ์ ํ์จ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์์๋ JavaScript ๋ชจ๋ ์ฑ๋ฅ์ ์ค์ํ ์ธก๋ฉด์ ๋ํด ์์ธํ ์ค๋ช ํ๋ฉฐ, ํนํ ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ์ํํ ๊ฒฝํ์ ๋ณด์ฅํ๊ธฐ ์ํ ๋ก๋ฉ ์ต์ ํ ๊ธฐ์ ์ ์ค์ ์ ๋ก๋๋ค.
JavaScript ์ฑ๋ฅ์ ์ค์์ฑ
์ต์ ํ ์ ๋ต์ ๋ํด ์์ธํ ์์๋ณด๊ธฐ ์ ์ JavaScript ์ฑ๋ฅ์ด ์ ๊ทธ๋ ๊ฒ ์ค์ํ์ง ์ดํดํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค. ๋ก๋ฉ ์๋๊ฐ ๋๋ฆฐ ์น์ฌ์ดํธ๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค.
- ์ด์ ํ ์ฌ์ฉ์ ๊ฒฝํ: ๋ก๋ฉ ์๋๊ฐ ๋๋ฆฌ๋ฉด ์ฌ์ฉ์๊ฐ ์ข์ ๊ฐ์ ๋๋ผ๊ณ , ์ดํ๋ฅ ์ด ์ฆ๊ฐํ๋ฉฐ, ๋ธ๋๋์ ๋ํ ๋ถ์ ์ ์ธ ์ธ์์ ๊ฐ๊ฒ ๋ฉ๋๋ค.
- ์ ํ์จ ๊ฐ์: ์น์ฌ์ดํธ ์๋๊ฐ ๋๋ฆฌ๋ฉด ๊ตฌ๋งค ๋๋ ์์ ์์ฑ๊ณผ ๊ฐ์ ์ํ๋ ์์ ์ ์๋ฃํ๋ ๋ฐ ์ฌ์ฉ์๋ฅผ ๋ฐฉํดํ ์ ์์ต๋๋ค.
- ๋ถ์ ์ ์ธ SEO ์ํฅ: ๊ฒ์ ์์ง์ ๋ก๋ฉ ์๋๊ฐ ๋น ๋ฅธ ์น์ฌ์ดํธ๋ฅผ ์ฐ์ ์ํ์ฌ ๊ฒ์ ์์์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
- ๋ชจ๋ฐ์ผ ๋ฐ์ดํฐ ์๋น ์ฆ๊ฐ: ๋ก๋ฉ ์๋๊ฐ ๋๋ฆฌ๋ฉด ํนํ ๋์ญํญ์ด ์ ํ๋๊ณ ๋ฐ์ดํฐ ๋น์ฉ์ด ๋์ ์ง์ญ์์ ๊ท์คํ ๋ชจ๋ฐ์ผ ๋ฐ์ดํฐ๋ฅผ ๋ญ๋นํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ผ๋์ ๋์ด ์ง์ญ๊ณผ ๊ฐ์ ์ํ๋ฆฌ์นด ์ผ๋ถ ์ง์ญ์์๋ ๋ฐ์ดํฐ ๋น์ฉ์ด ์ธํฐ๋ท ์ ๊ทผ์ ๋ํ ์ค์ํ ์ฅ๋ฒฝ์ด ๋์ด ๋ชจ๋ ๋ฐ์ดํธ๊ฐ ์ค์ํฉ๋๋ค.
JavaScript๋ฅผ ์ต์ ํํ๋ ๊ฒ์ ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋๋ ๋ฐ ๋งค์ฐ ์ค์ํ๋ฉฐ, ๋ค์ํ ๊ธฐ๊ธฐ, ๋คํธ์ํฌ ์๋ ๋ฐ ์ง๋ฆฌ์ ์์น์์ ์ธํฐ๋ท์ ์ ์ํ๋ ๊ธ๋ก๋ฒ ์ฌ์ฉ์์๊ฒ ํนํ ์ค์ํฉ๋๋ค.
JavaScript ๋ชจ๋๊ณผ ๊ทธ ์ํฅ ์ดํด
์ต์ JavaScript ๊ฐ๋ฐ์ ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ ๋จ์๋ก ๊ตฌ์ฑํ ์ ์๋๋ก ํ๋ ๋ชจ๋์ ํฌ๊ฒ ์์กดํฉ๋๋ค. ๋ชจ๋์ ์ฝ๋ ๋ณต์ก์ฑ ๊ด๋ฆฌ, ์ฝ๋ ๊ฐ๋ ์ฑ ํฅ์ ๋ฐ ํ์ ์ฅ๋ ค์ ๋์์ด ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋์ ๋ก๋ํ๊ณ ์คํํ๋ ๋ฐฉ์์ ์ฑ๋ฅ์ ์๋นํ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ๋ค์์ ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
- ํฐ ๋ฒ๋ค ํฌ๊ธฐ: ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ปค์ง๋ฉด JavaScript ๋ฒ๋ค(๋ชจ๋ ์ฝ๋๋ฅผ ํฌํจํ๋ ๊ฒฐํฉ๋ ํ์ผ)์ ํฌ๊ธฐ๊ฐ ์ฆ๊ฐํฉ๋๋ค. ๋ฒ๋ค์ด ํด์๋ก ๋ค์ด๋ก๋ ๋ฐ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๋ฐ ์๊ฐ์ด ๋ ์ค๋ ๊ฑธ๋ ค ์ด๊ธฐ ํ์ด์ง ๋ก๋ ์๋๊ฐ ๋๋ ค์ง๋๋ค.
- ๋ถํ์ํ ์ฝ๋ ๋ก๋ฉ: ์ฌ์ฉ์๋ ์ข ์ข ์น์ฌ์ดํธ ๊ธฐ๋ฅ์ ์ผ๋ถ๋ง ์ํธ ์์ฉํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ๋ชจ๋ ์ฝ๋๊ฐ ํ์ํ์ง ์๋๋ผ๋ ์ ์ฒด JavaScript ๋ฒ๋ค์ ๋ฏธ๋ฆฌ ๋ก๋ํ๋ฉด ๋ฆฌ์์ค์ ์๊ฐ์ ๋ญ๋นํ๊ฒ ๋ฉ๋๋ค.
- ๋นํจ์จ์ ์ธ ์คํ: JavaScript ์์ง์ ๋ฒ๋ค ๋ด์ ๋ชจ๋ ์ฝ๋๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ์คํํด์ผ ํ๋ฏ๋ก ํนํ ์ฑ๋ฅ์ด ๋ฎ์ ์ฅ์น์์๋ ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด ๋ค ์ ์์ต๋๋ค.
JavaScript ๋ชจ๋ ๋ก๋ฉ ์ต์ ํ๋ฅผ ์ํ ์ฃผ์ ์ ๋ต
JavaScript ๋ชจ๋์ ๋ก๋ํ๋ ๋ฐฉ์์ ์ต์ ํํ์ฌ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์๋ ๋ช ๊ฐ์ง ๊ธฐ์ ์ด ์์ต๋๋ค. ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. ์ฝ๋ ๋ถํ
์ฝ๋ ๋ถํ ์ JavaScript ๋ฒ๋ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ผ์ฐํธ ๋๋ ๊ธฐ๋ฅ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๋ ์์ ์ฒญํฌ๋ก ๋๋๋ ๊ฒ์ ๋๋ค. ์ด ๊ธฐ์ ์ ์ฌ์ฉ์๊ฐ ์ฒ์์ ํ์ํ ์ฝ๋๋ง ๋ค์ด๋ก๋ํ๋๋ก ํ์ฌ ์ด๊ธฐ ํ์ด์ง ๋ก๋ ์๊ฐ์ ๊ฐ์ ํฉ๋๋ค. ํ์ ์ฒญํฌ๋ ์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ํธ ์์ฉํ ๋ ํ์์ ๋ฐ๋ผ ๋ก๋ํ ์ ์์ต๋๋ค.
์๋ ๋ฐฉ์:
- ์ฒญํฌ ์๋ณ: ๋ถ๋ฆฌํ ์ ์๋ ์ฝ๋์ ๋ ผ๋ฆฌ์ ๋จ์๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ์ด๋ ์ข ์ข ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ผ์ฐํธ, ์น์ ๋๋ ๊ธฐ๋ฅ์ผ๋ก ๋๋๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
- ๋น๋ ๋๊ตฌ ์ฌ์ฉ: Webpack, Parcel ๋๋ Rollup๊ณผ ๊ฐ์ ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ์ฒญํฌ๋ก ์๋ ๋ถํ ํฉ๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ ์ฝ๋๋ฅผ ๋ถ์ํ๊ณ ์ ์๋ ๊ตฌ์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ๋ณ๋์ ํ์ผ์ ์์ฑํฉ๋๋ค. ์๋ฅผ ๋ค์ด React ์ ํ๋ฆฌ์ผ์ด์ ์์ React.lazy() ๋ฐ Suspense ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋ ๋ถํ ์ ๊ตฌํํ ์ ์์ต๋๋ค.
- ์์ฒญ ์ ์ฒญํฌ ๋ก๋: ์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ํ ๋ ํ์ํ ์ฒญํฌ๋ฅผ ๋ก๋ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ํ์ด์ง๋ฅผ ๋ฐฉ๋ฌธํ ๋ ์๋ก ๋ค๋ฅธ ์ฝ๋ ์ฒญํฌ๋ฅผ ๋ก๋ํ๋ ๋ผ์ฐํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์์(Webpack ๊ตฌ์ฑ):
// webpack.config.js
const path = require('path');
module.exports = {
entry: {
main: './src/index.js',
},
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name].[contenthash].js',
chunkFilename: '[name].[contenthash].js',
},
// ... other configurations
};
์ด ๊ตฌ์ฑ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ก ๋ค๋ฅธ ๋ถ๋ถ์ ๋ํด ๋ณ๋์ ์ถ๋ ฅ ํ์ผ์ ์์ฑํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
์ฝ๋ ๋ถํ ์ ์ด์ :
- ์ด๊ธฐ ํ์ด์ง ๋ก๋ ์๊ฐ ๋จ์ถ.
- ๋ฒ๋ค ํฌ๊ธฐ ๊ฐ์.
- ์ฌ์ฉ์ ๊ฒฝํ ๊ฐ์ .
๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ: ์ฝ๋ ๋ถํ ์ ์ธํฐ๋ท ์ฐ๊ฒฐ ์๋๊ฐ ๋๋ฆฐ ์ง์ญ์์ ์น์ฌ์ดํธ์ ์ ์ํ๋ ๊ธ๋ก๋ฒ ์ฌ์ฉ์์๊ฒ ํนํ ์ ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ธ๋ ์๊ณจ ์ง์ญ์ ์ฌ์ฉ์๋ ์ฝ๋ ๋ถํ ๋ก ์ธํด ๋ก๋ฉ ์๋๊ฐ ๋นจ๋ผ์ง๋ ํํ์ ๋ฐ์ ์ ์์ต๋๋ค.
2. ์ง์ฐ ๋ก๋ฉ
์ง์ฐ ๋ก๋ฉ์ ํ์ํ ๋๋ง ๋ฆฌ์์ค(์ด๋ฏธ์ง, JavaScript ๋๋ ๊ธฐํ ์์ฐ)๋ฅผ ๋ก๋ํ๋ ๊ธฐ์ ์ ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฌ์ฉ์๊ฐ ์ํธ ์์ฉํ ๋๊น์ง ์ค์ํ์ง ์์ ๋ฆฌ์์ค ๋ก๋ฉ์ ์ง์ฐ์์ผ ์ด๊ธฐ ํ์ด์ง ๋ก๋ ์๊ฐ์ ์ค์ด๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ด๋ 'ํ๋ฉด ์๋'์ ์๋ ์์, ์ฆ ์ฌ์ฉ์๊ฐ ํ์ด์ง๋ฅผ ์๋๋ก ์คํฌ๋กคํ ํ์์ผ ๋ณผ ์ ์๋ ์ฝํ ์ธ ์ ์ ์ฉํฉ๋๋ค.
์๋ ๋ฐฉ์:
- ๋ก๋ฉ ์ง์ฐ: ๋ฆฌ์์ค๋ฅผ ์ฆ์ ๋ก๋ํ์ง ๋ง์ญ์์ค. ๋ฆฌ์์ค๊ฐ ํ์๋๊ฑฐ๋ ์ฌ์ฉ์๊ฐ ์ํธ ์์ฉํ ๋๋ง ๋ก๋ํ์ญ์์ค.
- Intersection Observer API: Intersection Observer API๋ฅผ ์ฌ์ฉํ์ฌ ์์๊ฐ ๋ทฐํฌํธ์ ๋ค์ด๊ฐ ๋(ํ์๋ ๋)๋ฅผ ๊ฐ์งํฉ๋๋ค.
- ๋์ ๊ฐ์ ธ์ค๊ธฐ: ๋์ ๊ฐ์ ธ์ค๊ธฐ(import() ๊ตฌ๋ฌธ)๋ฅผ ์ฌ์ฉํ์ฌ ํ์์ ๋ฐ๋ผ JavaScript ๋ชจ๋์ ๋ก๋ํฉ๋๋ค.
์์(์ด๋ฏธ์ง ์ง์ฐ ๋ก๋ฉ):
<img data-src="image.jpg" alt="Description" class="lazy">
// JavaScript
const lazyImages = document.querySelectorAll('img.lazy');
const observer = new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
img.classList.remove('lazy');
observer.unobserve(img);
}
});
});
lazyImages.forEach(img => {
observer.observe(img);
});
์ง์ฐ ๋ก๋ฉ์ ์ด์ :
- ์ด๊ธฐ ํ์ด์ง ๋ก๋ ์๊ฐ ๋จ์ถ.
- ๋์ญํญ ์๋น ๊ฐ์.
- ํนํ ์ฐ๊ฒฐ ์๋๊ฐ ๋๋ฆฌ๊ฑฐ๋ ๋ชจ๋ฐ์ผ ์ฅ์น์์ ์ฌ์ฉ์ ๊ฒฝํ ๊ฐ์ .
๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ: ์ง์ฐ ๋ก๋ฉ์ ๋ถ๋ถ ์ํ๋ฆฌ์นด์ ๊ฐ์ด ๋์ญํญ์ด ์ ํ๋๊ณ ๋ฐ์ดํฐ ๋น์ฉ์ด ๋์ ์ง์ญ์ ์ฌ์ฉ์์๊ฒ ํนํ ํจ๊ณผ์ ์ ๋๋ค. ๋ํ ๋ธ๋ผ์ง์ด๋ ์ธ๋๋ค์์์ ๊ฐ์ด ๋ชจ๋ฐ์ผ ์ธํฐ๋ท ์ฌ์ฉ์ด ๋งค์ฐ ์ผ๋ฐ์ ์ธ ๊ตญ๊ฐ์์ ์น์ ์ ์ํ๋ ๋ชจ๋ฐ์ผ ์ฅ์น ์ฌ์ฉ์๋ฅผ ์ํ ํํ์ด ์์ต๋๋ค.
3. ์บ์ฑ
์บ์ฑ์๋ ์์ฃผ ์ก์ธ์คํ๋ ๋ฆฌ์์ค(JavaScript ํ์ผ, ์ด๋ฏธ์ง ๋ฐ ๊ธฐํ ์์ฐ)๋ฅผ ์ ์ฅํ์ฌ ์๋ฒ์์ ๋ค์ ๋ค์ด๋ก๋ํ ํ์ ์์ด ๋น ๋ฅด๊ฒ ๊ฒ์ํ ์ ์๋๋ก ํ๋ ์์ ์ด ํฌํจ๋ฉ๋๋ค. ์ ์ ํ ์บ์ฑ์ ๋ฐํ ๋ฐฉ๋ฌธ์์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํต๋๋ค.
์๋ ๋ฐฉ์:
- HTTP ํค๋: ์๋ฒ๊ฐ
Cache-Control๋ฐExpires์ ๊ฐ์ ์ ์ ํ HTTP ํค๋๋ฅผ ๋ณด๋ด ๋ธ๋ผ์ฐ์ ์ ๋ฆฌ์์ค๋ฅผ ์บ์ํ๋ ๋ฐฉ๋ฒ์ ์ง์ํ๋๋ก ๊ตฌ์ฑํฉ๋๋ค. - Service Worker: Service Worker๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์ ์ฅ์น์ ์์ฐ์ ๋ก์ปฌ๋ก ์บ์ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์คํ๋ผ์ธ ์ก์ธ์ค๊ฐ ๊ฐ๋ฅํ๊ณ ํ์ ๋ฐฉ๋ฌธ์ ๋ํ ๋ก๋ฉ ์๊ฐ์ด ๋นจ๋ผ์ง๋๋ค.
- CDN(Content Delivery Network): CDN์ ํ์ฉํ์ฌ ์ฌ์ฉ์์๊ฒ ์ง๋ฆฌ์ ์ผ๋ก ๋ ๊ฐ๊น์ด ์ฌ๋ฌ ์๋ฒ์ ์ฝํ ์ธ ๋ฅผ ๋ถ์ฐ์ํต๋๋ค. ์ฌ์ฉ์๊ฐ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ๋ฉด CDN์ด ๊ฐ์ฅ ๊ฐ๊น์ด ์๋ฒ์์ ์ด๋ฅผ ์ ๊ณตํ์ฌ ๋๊ธฐ ์๊ฐ์ ์ค์ ๋๋ค.
์์(Cache-Control ํค๋):
Cache-Control: public, max-age=31536000
์ด๋ ๋ธ๋ผ์ฐ์ ์ ๋ฆฌ์์ค๋ฅผ 1๋ (31536000์ด) ๋์ ์บ์ํ๋๋ก ์ง์ํฉ๋๋ค.
์บ์ฑ์ ์ด์ :
- ๋ฐํ ๋ฐฉ๋ฌธ์์ ๋ก๋ฉ ์๊ฐ ๋จ์ถ.
- ์๋ฒ ๋ก๋ ๊ฐ์.
- ์ฌ์ฉ์ ๊ฒฝํ ๊ฐ์ .
๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ: ์บ์ฑ์ ์์น์ ๊ด๊ณ์์ด ์ฌ์ฉ์์๊ฒ ๋น ๋ฅธ ๋ก๋ฉ ์๊ฐ์ ๋ณด์ฅํ๋ฏ๋ก ๊ธ๋ก๋ฒ ์ฌ์ฉ์๊ฐ ์๋ ์น์ฌ์ดํธ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ฌ์ฉ์์ ์์น์ ๊ฐ๊น์ด ์๋ฒ๊ฐ ์๋ CDN์ ํ์ฉํ๋ฉด ์ธํฐ๋ท ์๋๊ฐ ๋ค์ํ ์ง์ญ์์ ์ฑ๋ฅ์ด ํฌ๊ฒ ํฅ์๋ฉ๋๋ค.
4. ์ถ์ ๋ฐ ์์ถ
์ถ์๋ JavaScript ํ์ผ์์ ๋ถํ์ํ ๋ฌธ์(๊ณต๋ฐฑ, ์ฃผ์ ๋ฑ)๋ฅผ ์ ๊ฑฐํ์ฌ ํฌ๊ธฐ๋ฅผ ์ค์ ๋๋ค. ์์ถ์ ํ์ผ์ ๋คํธ์ํฌ๋ฅผ ํตํด ์ ์กํ๊ธฐ ์ ์ ํ์ผ ํฌ๊ธฐ๋ฅผ ๋ ์ค์ ๋๋ค.
์๋ ๋ฐฉ์:
- ์ถ์ ๋๊ตฌ: Terser ๋๋ UglifyJS์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ JavaScript ํ์ผ์ ์ถ์ํฉ๋๋ค.
- ์์ถ: ์๋ฒ์์ Gzip ๋๋ Brotli ์์ถ์ ํ์ฑํํ์ฌ ๋ธ๋ผ์ฐ์ ๋ก ์ ์กํ๊ธฐ ์ ์ ํ์ผ์ ์์ถํฉ๋๋ค.
- ๋น๋ ํ๋ก์ธ์ค ํตํฉ: ์ถ์ ๋ฐ ์์ถ์ ๋น๋ ํ๋ก์ธ์ค์ ํตํฉํ์ฌ ์ต์ ํ๋ฅผ ์๋ํํฉ๋๋ค.
์์(์ถ์๋ ์ฝ๋):
์๋ณธ ์ฝ๋:
function calculateSum(a, b) {
// This function adds two numbers.
return a + b;
}
์ถ์๋ ์ฝ๋:
function calculateSum(a,b){return a+b}
์ถ์ ๋ฐ ์์ถ์ ์ด์ :
- ํ์ผ ํฌ๊ธฐ ๊ฐ์.
- ๋ค์ด๋ก๋ ์๊ฐ ๋จ์ถ.
- ์ฑ๋ฅ ๊ฐ์ .
๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ: ์ถ์ ๋ฐ ์์ถ์ ๋์ญํญ ๋๋ ๋ฐ์ดํฐ ์๊ธ์ ๊ฐ ์ ํ๋ ์ง์ญ์์ ํนํ ๋ฐ์ดํฐ ์ ์ก๋์ ์ค์ด๋ฏ๋ก ๋ชจ๋ ๊ณณ์์ ์ ์ฉํฉ๋๋ค.
5. ์ฌ์ฉํ์ง ์๋ ์ฝ๋ ์ค์ด๊ธฐ(ํธ๋ฆฌ ์์ดํน)
ํธ๋ฆฌ ์์ดํน์ ์ฌ์ฉํ์ง ์๋ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๋ ํํ์ ๋๋ค. ์ด ๊ธฐ์ ์ ๋น๋ ํ๋ก์ธ์ค ์ค์ ์ต์ข ๋ฒ๋ค์์ ์ฌ์ฉํ์ง ์๋ ์ฝ๋๋ฅผ ์ ๊ฑฐํ์ฌ ํ์ผ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ๋ก๋ฉ ์๊ฐ์ ๋จ์ถํฉ๋๋ค. Webpack ๋ฐ Rollup๊ณผ ๊ฐ์ ์ต์ ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ ํธ๋ฆฌ ์์ดํน์ ์ง์ํฉ๋๋ค.
์๋ ๋ฐฉ์:
- ์ ์ ๋ถ์: ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ ์ฌ์ฉํ์ง ์๋ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์๋ณํ๊ธฐ ์ํด ์ฝ๋์ ์ ์ ๋ถ์์ ์ํํฉ๋๋ค.
- ์ฌ์ฉํ์ง ์๋ ์ฝ๋ ์ ๊ฑฐ: ๋ฒ๋ค๋ฌ๋ ๋น๋ ํ๋ก์ธ์ค ์ค์ ์ฌ์ฉํ์ง ์๋ ์ฝ๋๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
- ES ๋ชจ๋(ESM): ํธ๋ฆฌ ์์ดํน์ ES ๋ชจ๋(import/export ๊ตฌ๋ฌธ)๊ณผ ๊ฐ์ฅ ์ ์๋ํฉ๋๋ค.
์์(ES ๋ชจ๋ ๋ฐ ํธ๋ฆฌ ์์ดํน):
// math.js
export function add(a, b) {
return a + b;
}
export function subtract(a, b) {
return a - b;
}
// main.js
import { add } from './math.js';
console.log(add(5, 3)); // subtract is not used
์ด ๊ฒฝ์ฐ subtract ํจ์๋ `main.js`์์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ๋น๋ ์ค์ Webpack๊ณผ ๊ฐ์ ๋ฒ๋ค๋ฌ๋ ํธ๋ฆฌ ์์ดํน์ด ํ์ฑํ๋ ๊ฒฝ์ฐ `subtract`๋ฅผ ์ต์ข ๋ฒ๋ค์์ ์ ๊ฑฐํฉ๋๋ค.
ํธ๋ฆฌ ์์ดํน์ ์ด์ :
- ๋ฒ๋ค ํฌ๊ธฐ ๊ฐ์.
- ๋ก๋ฉ ์๊ฐ ๋จ์ถ.
- ์ฝ๋ ๊ณต๊ฐ ์ ์ฝ.
๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ: ํธ๋ฆฌ ์์ดํน์ ์ ์ธ๊ณ ์ฌ์ฉ์๊ฐ ์ก์ธ์คํ๋ ํฌ๊ณ ๋ณต์กํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ํนํ JavaScript ๋ฒ๋ค์ ํจ์จ์ ์ผ๋ก ์ ์งํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ๋ค์ด๋ก๋๋๋ ์ฝ๋์ ์์ ์ค์ด๋ฉด ์ธํฐ๋ท ์ฐ๊ฒฐ ์๋๊ฐ ๋๋ฆฐ ์ง์ญ์์ ์ฌ์ฉ์ ๊ฒฝํ์ด ํฅ์๋ฉ๋๋ค.
6. ํ๋ฆฌ๋ก๋ฉ ๋ฐ ํ๋ฆฌํ์นญ
ํ๋ฆฌ๋ก๋ฉ ๋ฐ ํ๋ฆฌํ์นญ์ ๋ธ๋ผ์ฐ์ ์ ๋์ค์ ํ์ํ ๊ฒ์ผ๋ก ์์ํ์ฌ ๋ฆฌ์์ค๋ฅผ ๋ฏธ๋ฆฌ ๋ค์ด๋ก๋ํ๋๋ก ์ง์ํ๋ ๊ธฐ์ ์ ๋๋ค. ํ๋ฆฌ๋ก๋ฉ์ ํ์ฌ ํ์ด์ง์ ๋ํ ์ค์ํ ๋ฆฌ์์ค์ ๋ค์ด๋ก๋๋ฅผ ์ฐ์ ์ํ๊ณ , ํ๋ฆฌํ์นญ์ ํ์ ํ์ด์ง์ ํ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ฆฌ์์ค๋ฅผ ๋ค์ด๋ก๋ํฉ๋๋ค.
์๋ ๋ฐฉ์:
- Preload:
<link rel="preload">ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์ ๋ฆฌ์์ค๋ฅผ ์ฆ์, ๋์ ์ฐ์ ์์๋ก ๋ค์ด๋ก๋ํ๋๋ก ์ง์ํฉ๋๋ค. - Prefetch:
<link rel="prefetch">ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์ ๋ฎ์ ์ฐ์ ์์๋ก ๋ฆฌ์์ค๋ฅผ ๋ค์ด๋ก๋ํ๋๋ก ์ง์ํ์ฌ ํฅํ ํ์์ ํ์ํ ์ ์์์ ์์ํฉ๋๋ค. - ๋ฆฌ์์ค ํํธ: HTML
<head>์น์ ์์ ์ฌ์ฉํฉ๋๋ค.
์์(JavaScript ํ์ผ ํ๋ฆฌ๋ก๋ฉ):
<link rel="preload" href="script.js" as="script">
์์(JavaScript ํ์ผ ํ๋ฆฌํ์นญ):
<link rel="prefetch" href="next-page-script.js" as="script">
ํ๋ฆฌ๋ก๋ฉ ๋ฐ ํ๋ฆฌํ์นญ์ ์ด์ :
- ์ค์ํ ๋ฆฌ์์ค์ ๋ํ ๋ก๋ฉ ์๊ฐ ๋จ์ถ.
- ๊ฐ์ ๋ ์ธ์ ์ฑ๋ฅ.
- ๋ค์ ํ์ด์ง์ ๋ํ ์ธ์๋ ํ์ด์ง ๋ก๋ ์๊ฐ ๊ฐ์.
๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ: ํ๋ฆฌ๋ก๋ฉ ๋ฐ ํ๋ฆฌํ์นญ์ ์ฌ์ฉ์๊ฐ ํ์ด์ง ๊ฐ์ ์์ฃผ ํ์ํ๋ ์์ฅ์์ ํนํ ๊ธ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ชจ๋ฐ์ผ ๋ฐ์ดํฐ ๋น์ฉ์ด ์ ๋ ดํ๊ณ ๋์์์ด ์น์ ํ์ํ๋ฉฐ ๋ค์ํ ์ฝํ ์ธ ์ฌ์ดํธ๋ฅผ ์ ํํ๋ ๊ตญ๊ฐ์ ์ฌ์ฉ์๋ฅผ ์๊ฐํด ๋ณด์ญ์์ค.
JavaScript ์ฑ๋ฅ ์ธก์ ๋ฐ ๋ชจ๋ํฐ๋ง ๋๊ตฌ
JavaScript ๋ชจ๋ ์ฑ๋ฅ ์ต์ ํ๋ ์งํ ์ค์ธ ํ๋ก์ธ์ค์ ๋๋ค. ์ ๊ธฐ์ ์ธ ์ธก์ ๋ฐ ๋ชจ๋ํฐ๋ง์ ์งํ ์ํฉ์ ์ถ์ ํ๊ณ ๊ฐ์ ํ ์์ญ์ ์๋ณํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ์ฑ๋ฅ ๋ถ์์ ๋๊ธฐ ์ํด ์ฌ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง ๋๊ตฌ๊ฐ ์์ต๋๋ค.
- Google Chrome DevTools: ๋ด์ฅ๋ DevTools๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒ์ฌ, ๋ถ์ ๋ฐ ๋๋ฒ๊น ํ๊ธฐ ์ํ ํฌ๊ด์ ์ธ ๋๊ตฌ ์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. "Performance" ํจ๋์ ์ฌ์ฉํ๋ฉด ํ์ด์ง ๋ก๋ ์๊ฐ์ ๊ธฐ๋กํ๊ณ , ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ , ๋คํธ์ํฌ ์์ฒญ์ ๋ถ์ํ ์ ์์ต๋๋ค.
- Lighthouse: Lighthouse๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ, ํ์ง ๋ฐ ์ ํ์ฑ์ ๊ฐ์ ํ๊ธฐ ์ํ ์คํ ์์ค ์๋ํ ๋๊ตฌ์ ๋๋ค. ์ต์ ํ๋ฅผ ์ํ ์์ธํ ๋ณด๊ณ ์์ ์คํ ๊ฐ๋ฅํ ๊ถ์ฅ ์ฌํญ์ ์ ๊ณตํฉ๋๋ค.
- WebPageTest: WebPageTest๋ ์ ์ธ๊ณ ๋ค์ํ ์์น ๋ฐ ์ฅ์น์์ ์น์ฌ์ดํธ ์ฑ๋ฅ์ ํ ์คํธํ ์ ์๋ ๋ฌด๋ฃ ์จ๋ผ์ธ ๋๊ตฌ์ ๋๋ค. ํ์ด์ง ๋ก๋ ์๊ฐ, ์์ฐ ํฌ๊ธฐ ๋ฐ ๊ธฐํ ์ฑ๋ฅ ์งํ์ ๋ํ ์์ธํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
- Bundle Analyzer: webpack-bundle-analyzer์ ๊ฐ์ ๋๊ตฌ๋ webpack ๋ฒ๋ค์ ๋ด์ฉ์ ์๊ฐํํ์ฌ ํฐ ๋ชจ๋๊ณผ ์ฝ๋ ๋ถํ๋ฆผ์ ์๋ณํ ์ ์์ต๋๋ค.
- ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ์๋น์ค: New Relic, Datadog ๋ฐ Sentry์ ๊ฐ์ ์๋น์ค๋ ์น์ฌ์ดํธ ์ฑ๋ฅ์ ์ค์๊ฐ์ผ๋ก ๋ชจ๋ํฐ๋งํ์ฌ ์ฃผ์ ์งํ๋ฅผ ์ถ์ ํ๊ณ , ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ , ์ฑ๋ฅ ์ ํ ์ ์๋ฆผ์ ๋ฐ์ ์ ์์ต๋๋ค. ์ด๋ฌํ ์๋น์ค๋ ๋ํ ์๋ก ๋ค๋ฅธ ์ง์ญ ๋ฐ ์ฅ์น ์ ํ์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
์ด๋ฌํ ๋๊ตฌ๋ฅผ ์ ๊ธฐ์ ์ผ๋ก ์ฌ์ฉํ๋ฉด JavaScript ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ๊ณ ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์์ฌ ๊ฒฐ์ ์ ๋ด๋ ค ๊ธ๋ก๋ฒ ์ฌ์ฉ์์ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
๋ชจ๋ฒ ์ฌ๋ก ๋ฐ ์ถ๊ฐ ํ
์์ ์ค๋ช ๋ ๊ธฐ์ ์ธ์๋ JavaScript ๋ชจ๋ ์ฑ๋ฅ์ ๋์ฑ ์ต์ ํํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
- ์ด๋ฏธ์ง ์ต์ ํ: ์ ์ฒด ํ์ด์ง ํฌ๊ธฐ๋ฅผ ์ค์ด๊ธฐ ์ํด ์ด๋ฏธ์ง ํฌ๊ธฐ ๋ฐ ํ์(์: WebP)์ ์ต์ ํํฉ๋๋ค.
- ์ค์ํ์ง ์์ JavaScript ์ง์ฐ: ํ์์ ์ด์ง ์์ JavaScript๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ํ๊ฑฐ๋ ํ์ด์ง๊ฐ ๋ก๋๋ ํ๊น์ง ๋ก๋ฉ์ ์ง์ฐํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ด๋ฌํ ์คํฌ๋ฆฝํธ๊ฐ ํ์ด์ง์ ์ด๊ธฐ ๋ ๋๋ง์ ์ฐจ๋จํ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
<script>ํ๊ทธ์์async๋ฐdeferํน์ฑ์ ์ฌ์ฉํฉ๋๋ค. - HTTP ์์ฒญ ์ ์ค์ด๊ธฐ: ํ์ผ์ ๊ฒฐํฉํ๊ณ , CSS ์คํ๋ผ์ดํธ๋ฅผ ์ฌ์ฉํ๊ณ , ์ค์ํ CSS ๋ฐ JavaScript๋ฅผ ์ธ๋ผ์ธํ์ฌ HTTP ์์ฒญ ์๋ฅผ ์ต์ํํฉ๋๋ค.
- CSP(Content Security Policy) ์ฌ์ฉ: CSP(Content Security Policy)๋ฅผ ๊ตฌํํ์ฌ XSS(Cross-Site Scripting) ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ์น์ฌ์ดํธ๋ฅผ ๋ณดํธํ๊ณ ๋ณด์์ ๊ฐํํฉ๋๋ค. ๋ณด์ ์ฌ์ดํธ๋ ๊ธ๋ก๋ฒ ์ ๋ขฐ์๋ ์ค์ํฉ๋๋ค.
- ์ต์ ์ํ ์ ์ง: ์ต์ ์ฑ๋ฅ ๊ฐ์ ์ฌํญ ๋ฐ ๋ฒ๊ทธ ์์ ์ ํ์ฉํ๋ ค๋ฉด ๊ฐ๋ฐ ๋๊ตฌ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ํ๋ ์์ํฌ๋ฅผ ์ต์ ์ํ๋ก ์ ์งํ์ญ์์ค.
- ์ค์ ์ฅ์น์์ ํ ์คํธ: ๊ธ๋ก๋ฒ ์ฌ์ฉ์์๊ฒ ์ผ๊ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ค๋ฉด ๋ค์ํ ์ฅ์น ๋ฐ ๋คํธ์ํฌ ํ๊ฒฝ์์ ์น์ฌ์ดํธ๋ฅผ ํ ์คํธํ์ญ์์ค. ์ฅ์น ์๋ฎฌ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ๋, ์ฌ๋ฌ ์ง์ญ์ ์ค์ ์ฅ์น์์๋ ํ ์คํธ๋ฅผ ์ํํฉ๋๋ค.
- ํ์งํ ๋ฐ ๊ตญ์ ํ ๊ณ ๋ ค: ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ธ๋ก๋ฒ ์ฌ์ฉ์์ ๋ ์ ํฉํ๋๋ก ํ์งํ ๋ฐ ๊ตญ์ ํํ์ฌ ๋ค์ํ ์ธ์ด์ ๋ฌธํ์ ์ฐจ์ด์ ์ ํด๊ฒฐํฉ๋๋ค.
๊ฒฐ๋ก
JavaScript ๋ชจ๋ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๊ฒ์ ํนํ ๋ค์ํ ์๊ตฌ์ ์ก์ธ์ค ์กฐ๊ฑด์ ๊ฐ์ง ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํด ๋น ๋ฅด๊ณ ํจ์จ์ ์ด๋ฉฐ ์ฌ์ฉ์ ์นํ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋๋ ๋ฐ ํ์์ ์ ๋๋ค. ์ฝ๋ ๋ถํ , ์ง์ฐ ๋ก๋ฉ, ์บ์ฑ, ์ถ์, ํธ๋ฆฌ ์์ดํน, ํ๋ฆฌ๋ก๋ฉ, ํ๋ฆฌํ์นญ๊ณผ ๊ฐ์ ๊ธฐ์ ์ ๊ตฌํํ๊ณ ์ ์ ํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ์ ๊ธฐ์ ์ผ๋ก ์ธก์ ํ๊ณ ๋ชจ๋ํฐ๋งํ๋ฉด ๋ค์ํ ์ง์ญ๊ณผ ์ฅ์น์์ ์ฌ์ฉ์ ๊ฒฝํ์ ํฌ๊ฒ ๊ฐ์ ํ๊ณ ์น์ฌ์ดํธ๊ฐ ์ต์ ์ผ๋ก ์๋ํ๋๋ก ํ ์ ์์ต๋๋ค. ํ ์คํธ, ๋ถ์ ๋ฐ ๋ณํํ๋ ๊ธฐ์ ์ ๋ํ ์ ์์ ํตํ ์ง์์ ์ธ ๊ฐ์ ์ ๊ธ๋ก๋ฒ ์ปจํ ์คํธ์์ ์ฐ์ํ ์น ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ ํต์ฌ์ ๋๋ค.