Web

ํ”„๋ก ํŠธ์—”๋“œ ์›น ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ Code Splitting

๐Ÿ“’ Code Splitting ์ด๋ž€?

Code spliting์€ ํฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค์„ ๋” ์ž‘๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฌ์šด ์ฒญํฌ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ์›น์‚ฌ์ดํŠธ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ์ด๋Ÿฌํ•œ ์ž‘์€ ์ฒญํฌ๋Š” ํ•„์š”์— ๋”ฐ๋ผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ดˆ๊ธฐ ๋กœ๋“œ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ“’ Javascript์—์„œ Code Splitting์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

๐Ÿ“Œ ๋™์  import ์‚ฌ์šฉ

์ตœ์‹  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ๋™์  ์ž„ํฌํŠธ์™€ "import()" ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“ˆ์„ ์˜จ๋””๋งจ๋“œ ๋ฐฉ์‹์œผ๋กœ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค. ๋™์  import๋Š” Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ํ•„์š”ํ•  ๋•Œ ๋ชจ๋“ˆ์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์•„๋ž˜ ์˜ˆ์‹œ์—์„œ๋Š” ํŽ˜์ด์ง€๊ฐ€ ์ฒ˜์Œ ๋กœ๋“œ๋  ๋•Œ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฒ„ํŠผ์ด ํด๋ฆญ๋  ๋•Œ my-module.js ๋ชจ๋“ˆ์ด ๋กœ๋“œ๋œ๋‹ค.

const button = document.getElementById('load-button');

button.addEventListener('click', async () => {
	const module = await import('./my-module.js');
    module.doSomething();
});

 

๐Ÿ“Œ Webpack ๋˜๋Š” ๊ธฐํƒ€ ๋ฒˆ๋“ค๋Ÿฌ ๊ตฌ์„ฑ

Webpack๊ณผ ๊ฐ™์€ ๋นŒ๋“œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ code splitting์„ ๊ตฌ์„ฑํ•˜์—ฌ ๋ฒˆ๋“ค์„ ๋” ์ž‘์€ ์ฒญํฌ๋กœ ์ž๋™ ๋ถ„ํ• ํ•  ์ˆ˜ ์žˆ๋‹ค.
์•„๋ž˜๋Š” code splitting ์„ ์œ„ํ•œ Webpack ์„ค์ • ์˜ˆ์‹œ์ธ๋ฐ, ์ดˆ๊ธฐ ๋ฐ ๋น„๋™๊ธฐ ์ž„ํฌํŠธ ๋ชจ๋‘์— ๋Œ€ํ•ด ์ฒญํฌ๋ฅผ ๋ถ„ํ• ํ•˜๋„๋ก Webpack์— ์ง€์‹œํ•œ๋‹ค.

// webpack.config.js
module.exports = {
	// ...๊ธฐํƒ€ ์„ค์ • ์ƒ๋žต...
    optimization: {
    	splitChunks: {
        	chunks: 'all',
        },
    },
};

 

๐Ÿ“Œ Route ๊ธฐ๋ฐ˜ Code Splitting

์—ฌ๋Ÿฌ route๋ฅผ ๊ฐ€์ง„ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ route ๊ธฐ๋ฐ˜ code splitting์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ route์˜ JavaScript ์ฝ”๋“œ๊ฐ€ ๋ณ„๋„์˜ ์ฒญํฌ๋กœ ๋ถ„ํ• ๋˜์–ด ๊ฐ route์˜ ์ดˆ๊ธฐ ๋กœ๋“œ ์‹œ๊ฐ„์ด ๋‹จ์ถ•๋œ๋‹ค.
์˜ˆ์‹œ์—์„œ "Home", "About" ์ปดํฌ๋„ŒํŠธ๋Š” ๊ฐ๊ฐ์˜ ๊ฒฝ๋กœ์— ์•ก์„ธ์Šคํ•  ๋•Œ ์˜จ๋””๋งจ๋“œ ๋ฐฉ์‹์œผ๋กœ ๋กœ๋“œ๋œ๋‹ค.

import { lazy, Suspense } from 'react';

const Home = lazy(() => import('./Home'));
const About = lazy(() => import('./About'));

function App() {
	return (
    	<div>
        	<Suspense fallback={<div>Loading...</div>}>
            	<Route path="/" exact component={Home} />
                <Route path="/about" component={About} />
            </Suspense>
        </div>
    );
}

 

๐Ÿ“Œ Tree Shaking 

code splitting์„ ๊ตฌํ˜„ํ•  ๋•Œ ๋นŒ๋“œ ์„ค์ •์—์„œ tree shaking์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. tree shaking์€ ๊ฐ€์ ธ์˜จ ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•ด์„œ ํ•„์š”ํ•œ ์ฝ”๋“œ๋งŒ ์ตœ์ข… ๋ฒˆ๋“ค์— ํฌํ•จ๋˜๋„๋ก ๋งŒ๋“ ๋‹ค.

 

๐Ÿ“Œ ๋ถ„์„ ๋ฐ ์ตœ์ ํ™”

code splitting์„ ๊ตฌํ˜„ํ•œ ํ›„์—๋Š” Webpack ๋ฒˆ๋“ค ๋ถ„์„๊ธฐ ๋˜๋Š” ๊ตฌ๊ธ€ ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ performance(์„ฑ๋Šฅ)๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒˆ๋“ค์„ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ถ”๊ฐ€์ ์œผ๋กœ ์ตœ์ ํ™”ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ“Œ Lazy Loading Library ์‚ฌ์šฉํ•˜๊ธฐ 

React๋‚˜ Vue.js์™€ ๊ฐ™์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ code splitting ๋ฐ lazy loading์„ ์œ„ํ•œ ๋‚ด์žฅ ์ง€์› ๋˜๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด React์˜ "React.lazy()" ๋‚˜ Vue์˜ "vue-router"๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋ ˆ์ž„์›Œํฌ๋ณ„ ๋ฐฉ์‹์œผ๋กœ code splitting์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ“’ ๋งˆ์น˜๋ฉฐ

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

๊ฐœ๋ฐœ ์ง„ํ–‰ ์ƒํ™ฉ์— ๋”ฐ๋ผ, ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/ํ”„๋ ˆ์ž„์›Œํฌ์— ๋”ฐ๋ผ ์ ์ ˆํžˆ ์ตœ์ ํ™”๋ฅผ ์ ์šฉํ•ด๋ณด์ž!

 

 

'Web' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ ์„ค๊ณ„ ์—ฌ์ •  (0) 2025.03.30
CSS ๋ญ ์“ธ๊นŒ์š”? (TailwindCSS vs Styled-components)  (0) 2023.05.01