๐ Front-end
๐ Webpack์ด๋ ๋ฌด์์ธ๊ฐ?โ
์น ์ฌ์ดํธ๋ฅผ ๊ตฌ์ฑํ ๋ js, css, images ํ์ผ๋ฑ ์ ๋ง์ ํ์ผ๋ค์ด ๋ชจ์ฌ ์น์ฌ์ดํธ๋ฅผ ๊ตฌ์ฑํ๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ผ์ ์น ์ฌ์ดํธ์ ์ ์ํ์ ๋ ๊ต์ฅํ ๋ง์ ํ์ผ์ด ๋ค์ด๋ก๋๋ ์ ์๋๋ฐ ์ด๊ฒ์ ๋น๋กํ์ฌ ์๋ฒ์ ์์์ ์๋ชจํ๊ณ ์น์ฌ์ดํธ๊ฐ ๋๋ฆฌ๊ฒ ๋ก๋ฉ๋ฉ๋๋ค.
๋ํ, ๋ง์ ์๋ฐ์คํฌ๋ฆฝํธ ํจํค์ง๋ฑ์ ์ฌ์ฉํ๋ค๋ณด๋ฉด ๊ฐ๊ฐ์ ์๋ก์ ๋ค๋ฅธ ํจํค์ง๋ค์ด ์๋ก ๊ฐ์ ์ด๋ฆ์ด๋ ํจ์๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด์ ์ ํ๋ฆฌ์ผ์ด์
์ด ๊นจ์ง๊ฒ ๋๋๋ฐ ์ด๋ฌํ ํ์์ ํด๊ฒฐํ๊ธฐ ์ํด ๋์จ ๊ฐ๋
์ด ๋ฌถ๋๋ค๋ ๊ฐ๋
์ ๋ฒ๋ค๋ฌ๊ฐ ๋ฑ์ฅํ๊ฒ ๋์์ต๋๋ค.
webpack, broserify, parcel๋ฑ๊ณผ ๊ฐ์ ๋๊ตฌ๋ค์ด ๋ฒ๋ค๋ฌ์ ์ํฉ๋๋ค.
์นํฉ์ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์
์ ์ํ ์ ์ ๋ชจ๋๋ฌ์
๋๋ค.
๋ชจ๋ ๋ฒ๋ค๋ฌ๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ฑํ๋ ์์(HTML, CSS, JavaScript, images ๋ฑ)์ ๋ชจ๋ ๊ฐ๊ฐ์ ๋ชจ๋๋ก ๋ณด๊ณ ์ด๋ฅผ ์กฐํฉํด์ ๋ณํฉ๋ ํ๋์ ๊ฒฐ๊ณผ๋ฌผ์ ๋ง๋๋ ๋๊ตฌ๋ฅผ ์๋ฏธํฉ๋๋ค. ๊ฐ๋จํ๊ฒ ํํํ์๋ฉด ์นํฉ์ด๋ ์ฌ๋ฌ ํ์ผ์ ํ๋ ์ด์์ ํ์ผ๋ก ํฉ์ณ์ฃผ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค๋ฌ์
๋๋ค.
์ด๋ฌํ ์นํฉ์ ์ ๋ฑ์ฅํ๊ฒ ๋์์๊น์?
์์์ ์ธ๊ธํ์๋ฏ ์ ๋ง์ ํ์ผ์ด ๋ชจ์ฌ ํ๋์ ์น ์ฌ์ดํธ๋ฅผ ๊ตฌ์ฑํ๊ฒ ๋ฉ๋๋ค. ์ธํฐ๋ท์ ๋ฐ์ ์ผ๋ก ์น ์ดํ๋ฆฌ์ผ์ด์
์ ๋ณต์ก๋๊ฐ ์ฆ๊ฐํ๋ฉด์ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ฝ๋์ ์์ด ๋ฐฉ๋ํด์ง๊ณ ์ด๋ฌํ ์ฝ๋๋ฅผ ์ฝ๊ฒ ์ ์ง๋ณด์ํ๊ธฐ ์ํด ๋ชจ๋๋ก์ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ํ์ํ๊ฒ ๋์์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์๋ ES2015(ES6) ์ด์ ์๋ ๋ชจ๋๋ก์ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ผ๋ก AMD, CommonJS๋ฑ์ด ์กด์ฌํ์์ผ๋ ํ๋์ ํ์ค์ด ์๋ ์ฌ์ฉํ๋ ์ฌ๋์ ๋ฐ๋ผ ์ํ๋ ๊ฒ์ ์ ํํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํด์์ต๋๋ค.
๊ทธ ํ, ES6 ์ดํ๋ถํฐ ์๋ฐ์คํฌ๋ฆฝํธ์์ ํ์ค ๋ชจ๋ ์์คํ
์ ์ ์ํ์๊ณ ์ด๊ฒ์ด export/import
๋ฐฉ์์
๋๋ค.
๊ทธ๋ฌ๋, ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ ES6 ๋ฐฉ์์ ๋ชจ๋ ์์คํ ์ ์ง์ํ์ง๋ ์์์ต๋๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฐ์๋ค์ ๋ธ๋ผ์ฐ์ ์ ๋ฒ์ ์ ์๊ด์์ด ํธ๋ฆฌํ ๋ชจ๋ ์์คํ ์ ์ฌ์ฉํ๊ธฐ๋ฅผ ์ํ๊ณ , ์ด๋ฌํ ๋ฐฐ๊ฒฝ์ ์ํด ๋ฑ์ฅํ๊ฒ๋ ํด์ด ์นํฉ์ ๋๋ค.
์กฐ๊ธ ๋ ์ธ๋ถํํ์๋ฉด ์นํฉ์ ๋ฑ์ฅ ๋ฐฐ๊ฒฝ์ ์๋์ ๊ฐ์ด ์ ๋ฆฌํ ์ ์์ต๋๋ค.
- ํ์ผ ๋จ์์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๊ด๋ฆฌ์ ํ์์ฑ
- ์น ๊ฐ๋ฐ ์์ ์๋ํ ๋๊ตฌ(Web Task Manager)
- ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น ๋ฅธ ๋ก๋ฉ ์๋์ ๋์ ์ฑ๋ฅ
์นํฉ์์ ์ง์นญํ๋ ๋ชจ๋์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๋ฟ๋ง์ด ์๋ HTML, CSS, JavaScript, Images, Font๋ฑ ๋ชจ ๋ ํ์ผ ํ๋ํ๋ ๋ชจ๋์ด๋ผ ์ง์นญํ๋ฉฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๋ ๋ชจ๋ ์์์ ๋ชจ๋์ด๋ผ ๋ณด๋ฉด ๋ฉ๋๋ค. ๋ณดํต ๋ชจ๋ ๋ฒ๋ค๋ง์์๋ ๋น๋, ๋ฒ๋ค๋ง, ๋ณํ ์ด ์ธ ๋จ์ด๋ ๋ชจ๋ ๊ฐ์ ์๋ฏธ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
์นํฉ์ผ๋ก ํด๊ฒฐํ๋ ค๋ ๋ฌธ์
- ์๋ฐ์คํฌ๋ฆฝํธ ๋ณ์ ์ ํจ ๋ฒ์ ๋ฌธ์
- ES6์ ๋ชจ๋ ๋ฌธ๋ฒ๊ณผ ๋ฒ๋ค๋ง์ผ๋ก ํด๊ฒฐ
- ๋ธ๋ผ์ฐ์ ๋ณ HTTP ์์ฒญ ์ซ์์ ์ ์ฝ
- ์นํฉ์ ์ฌ๋ฌ ํ์ผ์ ํ๋ ์ด์์ ํ์ผ๋ก ํฉ์ณ ๋งจ ์ฒ์ ์ธ๊ธํ์๋ ์๋ฒ๋ก๋ถํฐ ํ์ผ์ ๋ค์ด๋ก๋ ๋ฐ๋ ํ์๊ฐ ์ค์ด๋ค๊ฒ ๋๊ณ ์ด ํจ๊ณผ๋ก ์ธํด ๋ธ๋ผ์ฐ์ ๋ณ HTTP ์์ฒญ ์ซ์ ์ ์ฝ์ ํผํ ์ ์์ต๋๋ค.
- ์ฌ์ฉํ์ง ์๋ ์ฝ๋์ ๊ด๋ฆฌ
- Dynamic Loading ๋ฐ Lazy Loading ๋ฏธ์ง์ ๋ฌธ์
- ์ด์ ์ Require.js์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋์ ์ผ๋ก ์ํ๋ ์๊ฐ์ ๋ชจ๋์ ๋ก๋ฉํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ์ต๋๋ค. ์นํฉ์์๋ Code Splitting ๊ธฐ๋ฅ์ ์ด์ฉํ์ฌ ์ํ๋ ๋ชจ๋์ ์ํ๋ ํ์ด๋ฐ์ ๋ก๋ฉํ ์ ์์ต๋๋ค.
๐ Babel vs Terser vs SWCโ
๋ฐ๋ฒจ (Babel)โ
๋ฐ๋ฒจ์ ์๋ฐ์คํฌ๋ฆฝํธ ๋น๋ ํด ์ค ํธ๋์คํ์ผ๋ฌ(Transpiler) ๋ผ๋ ์์ญ์ ์ํฉ๋๋ค.
๋ฐ๋ฒจ์ด ํธ๋์คํ์ผ๋ฌ์ธ ์ด์ ๋, ์ต์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ผ๋ก ์์ฑ๋ ์ฝ๋๋ฅผ ๊ตฌ๋ฒ์ ๋ธ ๋ผ์ฐ์ ๋ ์ดํดํ ์ ์๋ ์์ค์ ์ค๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ก ๋ณํํด ์ฃผ๋ ์ํํธ์จ์ด์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฆ, ๋ฐ๋ฒจ์ ํธ๋์คํ์ผ๋ฌ๋ก์จ ์ ์ฌํ ๋ ์ธ์ด ์ฌ์ด์์์ ๋ณํ ๊ธฐ๋ฅ์ ์ ๊ณตํด์ค๋๋ค.
Terserโ
Terser๋ผ๋ ๋น๋ ํด์ ๋ํด ์ฒ์ ๋ค์ด๋ณด๋ ๋ถ์ด ์์ผ์ค ๊ฑฐ๋ก ์๊ฐํฉ๋๋ค. ์ฌ์ค, ์ฐ๋ฆฌ๊ฐ Terser๋ผ๋ ํด์ ์ง์ ๋ค๋ฃฐ ์ผ์ ๋ง์ง ์์ต๋๋ค. ๋๋ถ๋ถ์ ํ๋ ์์ํฌ์์๋ ์ด๋ฏธ Terser์ ๋ํ ์ธํ ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ด์์ผ๋ฉฐ, ๋์ฑ์ด Webpack์ ๊ฒฝ์ฐ v4 ์ดํ ๋ฒ์ ๋ถํฐ ๋ณ๋์ ์ค์ ์์ด๋ ํ๋ก๋์ ๋ชจ๋์์ ์๋์ผ๋ก Terser ํด์ ์ฌ์ฉํ๋๋ก ์ธํ ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
Terser ๊ณต์ ์น์ฌ์ดํธ์์๋ Terser๋ผ๋ ํด์ ๋ค์๊ณผ ๊ฐ์ด ์๊ฐํ๊ณ ์์ต๋๋ค.
ES6+๋ฅผ ์ํ ์๋ฐ์คํฌ๋ฆฝํธ parser, mangler ๊ทธ๋ฆฌ๊ณ compressor
Terser๊ฐ mangler๋ก์จ ํ๋ ์ญํ ์ ์ฐ๋ฆฌ๊ฐ ์ฝ๋์์ ์ฌ์ฉํ ๋ณ์ / ํจ์ / ์์ฑ๋ค์ ์ด๋ฆ์ ๋งค์ฐ ๋จ์ํ๋ ์ด๋ฆ์ผ๋ก ๋ณ๊ฒฝํด์ฃผ๋ ๊ฒ์
๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ด๋ค ์ธ์ด๋ก ํ๋ก๊ทธ๋๋ฐ์ ํ๋์ง์ ๋ฌด๊ดํ๊ฒ, ๋ณ์๋ ํจ์์ ์ด๋ฆ์ ์ ํ ๋์๋ ํญ์ ์๋ฏธ ์๋ ๋ค์ด๋ฐ์ ์ฌ์ฉํ๋ผ๋ ๊ฒฉ์ธ์ด ์ธ์ ๋ ๋ฑ์ฅํฉ๋๋ค. ์ข์ ๋ค์ด๋ฐ์ ๊ทธ ๋ณ์๋ ํจ์๊ฐ ์ด๋ค ์ญํ ์ ํ๋์ง ์ฝ๋ ์ ์ฒด๋ฅผ ๋ณด์ง ์๋๋ผ๋ ๋๋ต์ ์ผ๋ก ์ดํดํ ์ ์๊ฒ ํด์ฃผ๊ธฐ ๋๋ฌธ์, ์ฝ๋์ ๊ฐ๋
์ฑ์ ๋งค์ฐ ํฅ์์ํฌ ์ ์์ต๋๋ค.
ํ์ง๋ง, ์ปดํจํฐ ์
์ฅ์์ ์ด ๋ค์ด๋ฐ์ ์ ํ ์ค์ํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ํน์ ๋ฉ๋ด๊ฐ ๋ณด์ฌ์ ธ์ผ ํ๋์ง์ ์ฌ๋ถ๋ฅผ ๊ด๋ฆฌํ๋ Boolean ํ์
๋ณ์์ ์ด๋ฆ์ isMenuVisible
์ด๋ผ๊ณ ์ง๋ ์ง ์๋๋ฉด ๋จ์ํ b๋ผ๊ณ ์ง๋ ์ง ์ ์๊ด ์์ด, ์ปดํจํฐ๋ ๊ทธ์ ํ๋์ ๋๊ฐ์ ๋ถ๋ฆฌ์ธ ๋ณ์๋ก ์ทจ๊ธํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ฝ๋์ ๊ฐ๋
์ฑ์ ์ํด ๋ถ์ฌ์ค ์ด๋ฆ๋ค์ ๊ฒฐ๊ณผ์ ์ผ๋ก ์ฝ๋์ ๊ธธ์ด๋ฅผ ๊ธธ๊ฒ ๋ง๋ค๊ธฐ ๋๋ฌธ์, ์์ค ํ์ผ์ ํฌ๊ธฐ๊ฐ ์ปค์ง ์๋ฐ์ ์์ต๋๋ค.
mangler๋ ์ฐ๋ฆฌ์ ์์ค์ฝ๋์ ์กด์ฌํ๋ ๋ค์ด๋ฐ๋ค์ ์๋ฏธ ์๋ ๋ฌธ์๋ก ๋ฐ๊ฟ๋ฒ๋ฆฝ๋๋ค. isMenuVisible
์ด๋ผ๋ ๋ณ์๋ช
์ ๋จ์ํ a
๋ก ๋ฐ๊ฟ๋ฒ๋ฆฌ๋ฉด, 13๊ธ์๋ฅผ ํ ๊ธ์๋ก ์ค์ผ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ต์ ํ ๊ณผ์ ์ ํตํด ์ค์ ํ๋ก๋์
ํ๊ฒฝ์์ ์ฌ์ฉ๋ ์ฐ๋ฆฌ์ ์ฝ๋ ์ฌ์ด์ฆ๋ฅผ ํ๊ธฐ์ ์ผ๋ก ์ค์ผ ์ ์์ต๋๋ค. ๋ฌผ๋ก ์ฐ๋ฆฌ์ ์ฝ๋๋ ์๋ง์ด ๋๊ฒ ์ง๋ง ๋ง์ด์ฃ (mangled).
Terser๊ฐ compressor๋ก์จ ํ๋ ์ญํ ์ ์ฐ๋ฆฌ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๋ถ์ํ ํ, ๋ ์งง์ ์ฝ๋๋ฅผ ํตํด ๋์ผํ ๊ธฐ๋ฅ์ ๊ตฌํํ ๋ฐฉ๋ฒ์ด ์๋์ง ํ์ธํ๊ณ ๊ทธ ๋ฐฉํฅ์ผ๋ก ์ฝ๋๋ฅผ ๋ณํํด ์ฃผ๋ ๊ฒ์ ๋๋ค.
mangle ํ๋ ๊ณผ์ ์ด๋ compress ํ๋ ๊ณผ์ ๊ณผ ๊ฐ์ด, ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ฝ๋๋ฅผ ๋์ผํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฒฝ๋ํ๋ ์ฝ๋๋ก ๋ณํํด ์ฃผ๋ ์ผ๋ จ์ ์์ ์ minify ํน์ minification(์ฝ๋ ๊ฒฝ๋ํ) ์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฝ๋ ๊ฒฝ๋ํ ์์ ์ ํด์ฃผ๋ ํด์ ์ฐ๋ฆฌ๋ minifier๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ๋ฐ๋ผ์, Terser๋ ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ํ๋ก๋์ ์์ ๋์ฑ ๊ฒฝ๋ํ๋ ์ํ๋ก ์ ๊ณต๋ ์ ์๋๋ก ๋์์ฃผ๋ minifier ๋น๋ ํด์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.
SWC(Speedy Web Compiler)โ
SWC๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ์ ์ปดํ์ผ๊ณผ ๋ฒ๋ค๋ง ๋ชจ๋์ ์ฌ์ฉ๋ ์ ์๋, Rust๋ผ๋ ์ธ์ด๋ก ์ ์๋ ๋น๋ ํด์ ๋๋ค. SWC๋ Speedy Web Compiler์ ์ฝ์๋ก, ๋ง ๊ทธ๋๋ก ๋งค์ฐ ๋น ๋ฅธ ์น ์ปดํ์ผ๋ฌ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํด์ ๋๋ค.
Next.js์์๋ SWC๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐํ ์ปดํ์ผ๋ฌ๋ฅผ ํตํด ๊ธฐ์กด ๋น๋์ ํ์ฉํ๋ ๋ฐ๋ฒจ๊ณผ Terser๋ฅผ ๋์ฒดํฉ๋๋ค. ์ฆ, Next.js์ ๋น๋ ๊ณผ์ ์ค ํธ๋์คํ์ผ๋ง์ ์ํํ๋ ๋ฐ๋ฒจ๊ณผ, ์ฝ๋ ๊ฒฝ๋ํ๋ฅผ ์ํํ๋ Terser๊ฐ SWC๋ก ๋์ฒด๋๋ค๋ ๋ป์ ๋๋ค. SWC๋ก ๊ต์ฒดํจ์ผ๋ก์จ ํธ๋์คํ์ผ๋ง์ ๋ฌด๋ ค 17๋ฐฐ๋ ๋นจ๋ผ์ก๋ค๊ณ ํ๋ฉฐ, ์ฝ๋ ๊ฒฝ๋ํ ์์ ์ 7๋ฐฐ๊ฐ ๋นจ๋ผ์ก๋ค๊ณ ํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด, SWC๋ผ๋ ํด์ด ๋ฐ๋ฒจ์ด๋ Terser๋ณด๋ค ์๋ฑํ๊ฒ ๋น ๋ฅธ ์ด์ ๊ฐ ๋์ฒด ๋ญ๊น์? ๊ฐ์ฅ ํฐ ์ด์ ๋ ๋ฐ๋ก Rust๋ผ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ์ด๋ฒคํธ ๋ฃจํ ๊ธฐ๋ฐ์ ์ฑ๊ธ ์ค๋ ๋ ์ธ์ด์ธ ์๋ฐ์คํฌ๋ฆฝํธ์๋ ๋ค๋ฅด๊ฒ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ๊ณ ๋ คํด์ ์ค๊ณ๋ ์ธ์ด๋ผ๋ ์ ์ ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ํ ๊ฐ์ ์ค๋ ๋๋ง์ ์ฌ์ฉํ๋ ์ฑ๊ธ ์ค๋ ๋ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์, ์ด๋ฌํ ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ด๋ก ๊ตฌํ๋ ๋ฐ๋ฒจ๊ณผ Terser๋ ํ ๋ฒ์ ํ ๊ฐ์ ํ์ผ๋ง์ ๋ณํํ ์ ์์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์๋ ๋ฌ๋ฆฌ ๋ณ๋ ฌ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋๋ก ์ค๊ณ๋ Rust ์ธ์ด๋ก ์์ฑ๋ SWC๋ ์์กด์ฑ์ด ์๋ ํ์ผ๋ค์ ๋์์ ๋ณํํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์, ๋ง์ฝ ํ์ฌ ์ปดํจํฐ๊ฐ ์ต๋ 4๊ฐ์ ์์ ์ ๋์์ ํ ์ ์๋ค๋ฉด SWC๋ฅผ ์ฌ์ฉํ ๋น๋ ์๋๋ ๋ฐ๋ฒจ์ด๋ Terser๋ฅผ ํตํด ๋น๋ํ์ ๋ ๋ณด๋ค ์ต๋ 4๋ฐฐ๊น์ง ๋ ๋นจ๋ผ์ง ์ ์์ ๊ฒ์ ๋๋ค.