Webpack 6์ JavaScript ๋ชจ๋ ํ๋๋ ์ด์ ์ ํตํด ์น ๊ฐ๋ฐ์ ๋ฏธ๋๋ฅผ ์ฌ์ธ์. ์ด ํ์ ์ ์ธ ๊ธฐ์ ์ด ์ด๋ป๊ฒ ํ์ฅ ๊ฐ๋ฅํ๊ณ ๋ ๋ฆฝ์ ์ธ ๊ธ๋ก๋ฒ ๋ถ์ฐ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ์ ์ธ๊ณ ํ์ ์ง์ํ๋์ง ์์๋ณด์ธ์.
Webpack 6๋ฅผ ์ด์ฉํ JavaScript ๋ชจ๋ ํ๋๋ ์ด์ : ์ฐจ์ธ๋ ๊ธ๋ก๋ฒ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋ ๊ฐํ
๋น ๋ฅด๊ฒ ์งํํ๋ ์น ๊ฐ๋ฐ ํ๊ฒฝ์์ ๋๊ท๋ชจ ์ํฐํ๋ผ์ด์ฆ๊ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๊ฒ์ ํ์ฅ์ฑ, ํ ํ์ , ์ ์ง๋ณด์์ฑ๊ณผ ๊ด๋ จ๋ ๋ณต์กํ ๊ณผ์ ๋ฅผ ์ข ์ข ์ ์ํฉ๋๋ค. ํ๋ ๋๋ฆฌ ์ฌ์ฉ๋์๋ ์ ํต์ ์ธ ๋ชจ๋๋ฆฌ์ ํ๋ก ํธ์๋ ์ํคํ ์ฒ๋ ํ๋์ ์ด๊ณ ์ ์์ผํ ๊ฐ๋ฐ ์ฃผ๊ธฐ์ ์ง๋ฆฌ์ ์ผ๋ก ๋ถ์ฐ๋ ํ์ ์๊ตฌ๋ฅผ ๋ฐ๋ผ์ก๋ ๋ฐ ์ด๋ ค์์ ๊ฒช์ต๋๋ค. ๋ ๋ชจ๋ํ๋๊ณ ๋ ๋ฆฝ์ ์ผ๋ก ๋ฐฐํฌ ๊ฐ๋ฅํ๋ฉฐ ๊ธฐ์ ์ ์ผ๋ก ์ ์ฐํ ์๋ฃจ์ ์ ์ฐพ์ผ๋ ค๋ ๋ ธ๋ ฅ์ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋์ ๊ด๋ฒ์ํ ์ฑํ์ผ๋ก ์ด์ด์ก์ต๋๋ค. ์ด๋ ๋ง์ดํฌ๋ก์๋น์ค์ ์์น์ ํ๋ก ํธ์๋๋ก ํ์ฅํ ์ํคํ ์ฒ ์คํ์ผ์ ๋๋ค.
๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๋ ๋ถ์ธํ ์ ์๋ ์ฅ์ ์ ์ ๊ณตํ์ง๋ง, ์ญ์ฌ์ ์ผ๋ก ์ฝ๋ ๊ณต์ , ์์กด์ฑ ๊ด๋ฆฌ, ๋ฐํ์ ํตํฉ์ ์ํ ๋ณต์กํ ๋ฉ์ปค๋์ฆ์ ํฌํจํด์์ต๋๋ค. ๋ฐ๋ก ์ด ์ง์ ์์ Webpack 5์์ ๋์ ๋(๊ทธ๋ฆฌ๊ณ ๊ฐ๋ ์ ์ธ "Webpack 6"์ ๊ฐ์ ๋ฏธ๋ ๋ฒ์ ์์ ๊ณ์ ์งํํ ) ํ๊ธฐ์ ์ธ ๊ธฐ๋ฅ์ธ JavaScript ๋ชจ๋ ํ๋๋ ์ด์ ์ด ํ์ ์ ์ธ ์๋ฃจ์ ์ผ๋ก ๋ฑ์ฅํฉ๋๋ค. ๋ชจ๋ ํ๋๋ ์ด์ ์ ๋ ๋ฆฝ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ๋ค์ด ๋ฐํ์์ ๋์ ์ผ๋ก ์ฝ๋์ ์์กด์ฑ์ ๊ณต์ ํ๋ ๋ฐฉ์์ ์ฌ์ฐฝ์กฐํ์ฌ, ์ฐ๋ฆฌ๊ฐ ๋ถ์ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ณ ๋ฐฐํฌํ๋ ๋ฐฉ์์ ๊ทผ๋ณธ์ ์ผ๋ก ๋ฐ๊ฟ๋๋ค. ์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ ์ฐจ์ธ๋ Webpack ๊ธฐ๋ฅ์ ๋งฅ๋ฝ์์ ๋ชจ๋ ํ๋๋ ์ด์ ์ ๊ฐ๋ ฅํจ์ ํ๊ตฌํ๊ณ , ์ง์ ์ผ๋ก ํ์ฅ ๊ฐ๋ฅํ๊ณ ํ๋ ฅ์ ์ธ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋ ์ํคํ ์ฒ๋ฅผ ๊ตฌ์ถํ๋ ค๋ ๊ธ๋ก๋ฒ ๊ฐ๋ฐํ์ ๋ฏธ์น๋ ์ฌ๋ํ ์ํฅ์ ๋ณด์ฌ์ค ๊ฒ์ ๋๋ค.
ํ๋ก ํธ์๋ ์ํคํ ์ฒ์ ์งํ: ๋ชจ๋๋ฆฌ์์์ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๋ก
๋ชจ๋ ํ๋๋ ์ด์ ์ ์ค์์ฑ์ ์ดํดํ๋ ค๋ฉด ํ๋ก ํธ์๋ ์ํคํ ์ฒ์ ์งํ ๊ณผ์ ๊ณผ ๊ทธ๊ฒ์ด ํด๊ฒฐํ๋ ๋ฌธ์ ๋ค์ ๊ฐ๋ตํ ์ดํด๋ณผ ํ์๊ฐ ์์ต๋๋ค.
๋ชจ๋๋ฆฌ์ ํ๋ก ํธ์๋: ๊ณผ๊ฑฐ์ ๊ทธ ํ๊ณ
์๋ ๋์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ํ์ค ์ ๊ทผ ๋ฐฉ์์ ๋จ์ผ์ ํฌ๊ณ ๊ธด๋ฐํ๊ฒ ๊ฒฐํฉ๋ ํ๋ก ํธ์๋ ์ฝ๋๋ฒ ์ด์ค, ์ฆ ๋ชจ๋๋ฆฌ์(monolith)์ด์์ต๋๋ค. ๋ชจ๋ ๊ธฐ๋ฅ, ์ปดํฌ๋ํธ, ๋น์ฆ๋์ค ๋ก์ง์ด ์ด ํ๋์ ์ ํ๋ฆฌ์ผ์ด์ ๋ด์ ์กด์ฌํ์ต๋๋ค. ์์ ํ๋ก์ ํธ์๋ ๊ฐ๋จํ์ง๋ง, ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฑ์ฅํจ์ ๋ฐ๋ผ ๋ชจ๋๋ฆฌ์์ ๊ธ์ธ ๋ค๋ฃจ๊ธฐ ํ๋ค์ด์ก์ต๋๋ค:
- ํ์ฅ์ฑ ๋ฌธ์ : ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ๋ถ๋ถ์์์ ์์ ๋ณ๊ฒฝ์ด ์ข ์ข ์ ์ฒด ํ๋ก ํธ์๋๋ฅผ ๋ค์ ๋น๋ํ๊ณ ์ฌ๋ฐฐํฌํด์ผ ํ๋ฏ๋ก, ์ฆ์ ์ ๋ฐ์ดํธ๊ฐ ๋ฒ๊ฑฐ๋กญ๊ณ ์ํํด์ง๋๋ค.
- ํ ๋ณ๋ชฉ ํ์: ๋จ์ผ ์ฝ๋๋ฒ ์ด์ค์์ ์์ ํ๋ ๋๊ท๋ชจ ํ์ ๋ณํฉ ์ถฉ๋(merge conflicts)์ ์์ฃผ ๊ฒช๊ฒ ๋์ด ๊ฐ๋ฐ ์ฃผ๊ธฐ๊ฐ ๋๋ ค์ง๊ณ ์์ฐ์ฑ์ด ์ ํ๋ฉ๋๋ค.
- ๊ธฐ์ ์ข ์(Lock-in): ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์๋ก์ด ๊ธฐ์ ์ ๋์ ํ๊ฑฐ๋ ๊ธฐ์กด ๊ธฐ์ ์ ์ ๊ทธ๋ ์ด๋ํ๊ธฐ ์ด๋ ค์ ํ์ ์ ์ ํดํ๊ณ ๊ธฐ์ ๋ถ์ฑ๋ฅผ ๋ง๋ญ๋๋ค.
- ๋ฐฐํฌ ๋ณต์ก์ฑ: ๋จ ํ ๋ฒ์ ๋ฐฐํฌ ์ค๋ฅ๊ฐ ์ ์ฒด ์ฌ์ฉ์ ๊ฒฝํ์ ๋ฌด๋๋จ๋ฆด ์ ์์ต๋๋ค.
๋ง์ดํฌ๋ก ํ๋ก ํธ์๋์ ๋ถ์: ๋ฏผ์ฒฉ์ฑ๊ณผ ํ์ฅ์ฑ ํ๋ณด
๋ฐฑ์๋ ๊ฐ๋ฐ์์ ๋ง์ดํฌ๋ก์๋น์ค์ ์ฑ๊ณต์ ์๊ฐ์ ๋ฐ์, ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋ ์ํคํ ์ฒ ์คํ์ผ์ ๋ชจ๋๋ฆฌ์ ํ๋ก ํธ์๋๋ฅผ ๋ ์๊ณ , ๋ ๋ฆฝ์ ์ด๋ฉฐ, ์์จ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๋ถํดํ ๊ฒ์ ์ ์ํฉ๋๋ค. ๊ฐ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๋ ์ ๋ด ๊ต์ฐจ ๊ธฐ๋ฅ ํ์ด ์์ ํ๋ฉฐ, ๊ฐ๋ฐ๋ถํฐ ๋ฐฐํฌ, ์ด์๊น์ง ์ ์ฒด ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ฑ ์์ง๋๋ค. ์ฃผ์ ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ ๋ฆฝ์ ์ธ ๊ฐ๋ฐ ๋ฐ ๋ฐฐํฌ: ํ๋ค์ ๊ฐ์์ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ๋ฐ, ํ ์คํธ, ๋ฐฐํฌํ ์ ์์ด ๊ธฐ๋ฅ ์ ๊ณต์ ๊ฐ์ํํ๊ณ ์์ฅ ์ถ์ ์๊ฐ์ ๋จ์ถํฉ๋๋ค.
- ๊ธฐ์ ๋ ๋ฆฝ์ฑ: ์๋ก ๋ค๋ฅธ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๋ ๋ค๋ฅธ ํ๋ ์์ํฌ(์: React, Vue, Angular)๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ถํ ์ ์์ด, ํ์ด ์์ ์ ๊ฐ์ฅ ์ ํฉํ ๋๊ตฌ๋ฅผ ์ ํํ๊ฑฐ๋ ๋ ๊ฑฐ์ ๊ธฐ์ ์์ ์ ์ง์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ ์ ์์ต๋๋ค.
- ํฅ์๋ ํ์ฅ์ฑ: ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ณ ๋ถ๋ถ์ ๋ ๋ฆฝ์ ์ผ๋ก ํ์ฅํ ์ ์์ผ๋ฉฐ, ์ฅ์ ๋ ํน์ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋์ ๊ตญํ๋์ด ์ ์ฒด ์์คํ ์ ํ๋ณตํ๋ ฅ์ฑ์ด ํฅ์๋ฉ๋๋ค.
- ๊ฐ์ ๋ ์ ์ง๋ณด์์ฑ: ๋ ์๊ณ ์ง์ค๋ ์ฝ๋๋ฒ ์ด์ค๋ ์ดํด, ๊ด๋ฆฌ, ๋๋ฒ๊น ์ด ๋ ์ฝ์ต๋๋ค.
์ด๋ฌํ ์ฅ์ ์๋ ๋ถ๊ตฌํ๊ณ , ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๋ ํนํ ๊ณตํต ์ฝ๋(๋์์ธ ์์คํ ์ด๋ ์ ํธ๋ฆฌํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ) ๊ณต์ , ๊ณต์ ์์กด์ฑ(์: React, Lodash) ๊ด๋ฆฌ, ๊ทธ๋ฆฌ๊ณ ๋ ๋ฆฝ์ฑ์ ํฌ์ํ์ง ์์ผ๋ฉด์ ๋ฐํ์ ํตํฉ์ ์กฐ์จํ๋ ๋ฐ ์์ด ์์ฒด์ ์ธ ๊ณผ์ ๋ฅผ ์๊ณ ์์์ต๋๋ค. ์ ํต์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ข ์ข ๋ณต์กํ ๋น๋ ํ์ ์์กด์ฑ ๊ด๋ฆฌ, ๊ณต์ npm ํจํค์ง, ๋๋ ๋น์ฉ์ด ๋ง์ด ๋๋ ๋ฐํ์ ๋ก๋ฉ ๋ฉ์ปค๋์ฆ์ ํฌํจํ์ต๋๋ค. ๋ชจ๋ ํ๋๋ ์ด์ ์ด ๋ฐ๋ก ์ด ๊ฐ๊ทน์ ๋ฉ์๋๋ค.
Webpack 6์ ๋ชจ๋ ํ๋๋ ์ด์ ์๊ฐ: ํจ๋ฌ๋ค์์ ์ ํ
๋ชจ๋ ํ๋๋ ์ด์ ์ ์ด๊ธฐ์ Webpack 5์ ํจ๊ป ์๊ฐ๋์์ง๋ง, ๊ทธ ๋ฏธ๋ ์งํฅ์ ์ธ ์ค๊ณ๋ ๊ฐ๋ ์ ์ธ "Webpack 6" ์๋์ ๊ธฐ๋๋๋ ๊ธฐ๋ฅ์ ํฌํจํ์ฌ ๋ฏธ๋์ Webpack ๋ฒ์ ์ ์ํ ์ด์์ผ๋ก ์๋ฆฌ๋งค๊นํ๊ณ ์์ต๋๋ค. ์ด๋ ์ฐ๋ฆฌ๊ฐ ๋ถ์ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ํ๊ณ ๊ตฌ์ถํ๋ ๋ฐฉ์์ ๊ทผ๋ณธ์ ์ธ ๋ณํ๋ฅผ ์๋ฏธํฉ๋๋ค.
๋ชจ๋ ํ๋๋ ์ด์ ์ด๋?
ํต์ฌ์ ์ผ๋ก, ๋ชจ๋ ํ๋๋ ์ด์ ์ ํ๋์ Webpack ๋น๋๊ฐ ์์ ์ ๋ชจ๋ ์ค ์ผ๋ถ๋ฅผ ๋ค๋ฅธ Webpack ๋น๋์ ๋ ธ์ถํ๊ณ , ๋ฐ๋๋ก ๋ค๋ฅธ Webpack ๋น๋๊ฐ ๋ ธ์ถํ ๋ชจ๋์ ์๋นํ ์ ์๊ฒ ํฉ๋๋ค. ๊ฒฐ์ ์ ์ผ๋ก, ์ด๋ ๋น๋ ํ์์ด ์๋ ๋ฐํ์์ ๋์ ์ผ๋ก ๋ฐ์ํฉ๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ค์ด ๋ ๋ฆฝ์ ์ผ๋ก ๋ฐฐํฌ๋ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ผ์ด๋ธ ์ฝ๋๋ฅผ ์ง์ ์ผ๋ก ๊ณต์ ํ๊ณ ์๋นํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
๋ฉ์ธ ์ ํ๋ฆฌ์ผ์ด์ ("ํธ์คํธ")์ด ๋ค๋ฅธ ๋ ๋ฆฝ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ("๋ฆฌ๋ชจํธ")์ ์ปดํฌ๋ํธ๋ฅผ ํ์๋ก ํ๋ ์๋๋ฆฌ์ค๋ฅผ ์์ํด ๋ณด์ญ์์ค. ๋ชจ๋ ํ๋๋ ์ด์ ์ ์ฌ์ฉํ๋ฉด, ํธ์คํธ๋ ๋จ์ํ ๋ฆฌ๋ชจํธ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๊ฒ ๋ค๋ ์๋๋ฅผ ์ ์ธํ๊ธฐ๋ง ํ๋ฉด, Webpack์ด ์ค๋ณต์ ๋ฐฉ์งํ๊ธฐ ์ํ ๊ณตํต ์์กด์ฑ์ ์ง๋ฅ์ ์ธ ๊ณต์ ๋ฅผ ํฌํจํ์ฌ ๋์ ๋ก๋ฉ๊ณผ ํตํฉ์ ์ฒ๋ฆฌํฉ๋๋ค.
๋ชจ๋ ํ๋๋ ์ด์ ์ ํต์ฌ ๊ฐ๋ :
- ํธ์คํธ(Host ๋๋ ์ปจํ ์ด๋): ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ธ์ถํ ๋ชจ๋์ ์๋นํ๋ ์ ํ๋ฆฌ์ผ์ด์ .
- ๋ฆฌ๋ชจํธ(Remote): ์์ ์ ๋ชจ๋ ์ค ์ผ๋ถ๋ฅผ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ธ์ถํ๋ ์ ํ๋ฆฌ์ผ์ด์ . ํ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์์ ํธ์คํธ์ด์ ๋ฆฌ๋ชจํธ์ผ ์ ์์ต๋๋ค.
- Exposes: ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋นํ ์ ์๋๋ก ์ ๊ณตํ๋ ๋ชจ๋.
- Remotes: ํธ์คํธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋นํ๊ณ ์ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ (๋ฐ ๊ทธ๋ค์ด ๋ ธ์ถํ ๋ชจ๋).
- Shared: ํ๋๋ ์ด์ ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ค ๊ฐ์ ๊ณตํต ์์กด์ฑ(React, Vue, Lodash ๋ฑ)์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ์ ์ํฉ๋๋ค. ์ด๋ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ต์ ํํ๊ณ ํธํ์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
๋ชจ๋ ํ๋๋ ์ด์ ์ด ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ:
๋ชจ๋ ํ๋๋ ์ด์ ์ ์ญ์ฌ์ ์ผ๋ก ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋ ์ํคํ ์ฒ๋ฅผ ๊ดด๋กญํ๋ ๋ณต์ก์ฑ์ ์ง์ ์ ์ผ๋ก ํด๊ฒฐํ๋ฉฐ, ๋นํ ๋ฐ ์๋ ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค:
- ์ง์ ํ ๋ฐํ์ ํตํฉ: iframe์ด๋ ์ปค์คํ JavaScript ๋ง์ดํฌ๋ก ์ค์ผ์คํธ๋ ์ดํฐ์ ์์กดํ๋ ์ด์ ์๋ฃจ์ ๊ณผ ๋ฌ๋ฆฌ, ๋ชจ๋ ํ๋๋ ์ด์ ์ ๋ฐํ์์ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๋๋ฅผ ์ํํ๊ฒ ํตํฉํ๊ธฐ ์ํ ๋ค์ดํฐ๋ธ Webpack ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ์ปดํฌ๋ํธ, ํจ์ ๋๋ ์ ์ฒด ํ์ด์ง๋ฅผ ๋ง์น ํธ์คํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ผ๋ถ์ธ ๊ฒ์ฒ๋ผ ๋์ ์ผ๋ก ๋ก๋ํ๊ณ ๋ ๋๋งํ ์ ์์ต๋๋ค.
- ๋น๋ ํ์ ์์กด์ฑ ์ ๊ฑฐ: ํ๋ค์ ๋ ์ด์ ๊ณตํต ์ปดํฌ๋ํธ๋ฅผ npm ๋ ์ง์คํธ๋ฆฌ์ ๊ฒ์ํ๊ณ ์ฌ๋ฌ ์ ์ฅ์์ ๊ฑธ์ณ ๋ฒ์ ์ ๊ด๋ฆฌํ ํ์๊ฐ ์์ต๋๋ค. ์ปดํฌ๋ํธ๋ ์ง์ ๋ ธ์ถ๋๊ณ ์๋น๋์ด ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ๋ฅผ ํฌ๊ฒ ๋จ์ํํฉ๋๋ค.
- ๋จ์ํ๋ ๋ชจ๋ ธ๋ ํฌ/ํด๋ฆฌ๋ ํฌ ์ ๋ต: ๋ชจ๋ ธ๋ ํฌ(๋ชจ๋ ํ๋ก์ ํธ๋ฅผ ์ํ ๋จ์ผ ์ ์ฅ์)๋ฅผ ์ ํํ๋ ํด๋ฆฌ๋ ํฌ(์ฌ๋ฌ ์ ์ฅ์)๋ฅผ ์ ํํ๋ , ๋ชจ๋ ํ๋๋ ์ด์ ์ ๊ณต์ ๋ฅผ ๊ฐ์ํํฉ๋๋ค. ๋ชจ๋ ธ๋ ํฌ์์๋ ์ค๋ณต ์ปดํ์ผ์ ํผํ์ฌ ๋น๋๋ฅผ ์ต์ ํํฉ๋๋ค. ํด๋ฆฌ๋ ํฌ์์๋ ๋ณต์กํ ๋น๋ ํ์ดํ๋ผ์ธ ๊ตฌ์ฑ ์์ด๋ ์ํํ ์ ์ฅ์ ๊ฐ ๊ณต์ ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ์ต์ ํ๋ ๊ณต์ ์์กด์ฑ:
shared๊ตฌ์ฑ์ ๊ฒ์ ์ฒด์ธ์ ์ ๋๋ค. ์ฌ๋ฌ ํ๋๋ ์ด์ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋์ผํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์: ํน์ ๋ฒ์ ์ React)์ ์์กดํ๋ ๊ฒฝ์ฐ, ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ธ์คํด์ค๊ฐ ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ์ ๋จ ํ ๋ฒ๋ง ๋ก๋๋๋๋ก ๋ณด์ฅํ์ฌ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ๋ํญ ์ค์ด๊ณ ์ ์ธ๊ณ์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค. - ๋์ ๋ก๋ฉ ๋ฐ ๋ฒ์ ๊ด๋ฆฌ: ๋ฆฌ๋ชจํธ๋ ํ์์ ๋ฐ๋ผ ๋ก๋๋ ์ ์์ผ๋ฉฐ, ์ด๋ ํ์ํ ๋๋ง ํ์ ์ฝ๋๊ฐ ๊ฐ์ ธ์์ง๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ํ, ๋ชจ๋ ํ๋๋ ์ด์ ์ ๊ณต์ ์์กด์ฑ์ ๋ค๋ฅธ ๋ฒ์ ์ ๊ด๋ฆฌํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ฌ ํธํ์ฑ๊ณผ ์์ ํ ์ ๊ทธ๋ ์ด๋๋ฅผ ์ํ ๊ฒฌ๊ณ ํ ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค.
- ๋ฐํ์์์์ ํ๋ ์์ํฌ ๋ ๋ฆฝ์ฑ: ๋ค๋ฅธ ํ๋ ์์ํฌ์ ๋ํ ์ด๊ธฐ ์ค์ ์๋ ์ฝ๊ฐ์ ์ฐจ์ด๊ฐ ์์ ์ ์์ง๋ง, ๋ชจ๋ ํ๋๋ ์ด์ ์ React ํธ์คํธ๊ฐ Vue ์ปดํฌ๋ํธ๋ฅผ ์๋นํ๊ฑฐ๋ ๊ทธ ๋ฐ๋์ ๊ฒฝ์ฐ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ๊ธฐ์ ์ ํ์ ๋ ์ ์ฐํ๊ณ ๋ฏธ๋ ์งํฅ์ ์ผ๋ก ๋ง๋ญ๋๋ค. ์ด๋ ๋ค์ํ ๊ธฐ์ ์คํ์ ๊ฐ์ง ๋๊ธฐ์ ์ด๋ ์ ์ง์ ์ธ ๋ง์ด๊ทธ๋ ์ด์ ์ค์ ํนํ ์ ์ฉํฉ๋๋ค.
๋ชจ๋ ํ๋๋ ์ด์ ๊ตฌ์ฑ ์ฌ์ธต ๋ถ์: ๊ฐ๋ ์ ์ ๊ทผ
๋ชจ๋ ํ๋๋ ์ด์
๊ตฌํ์ Webpack ๊ตฌ์ฑ ๋ด์์ ModuleFederationPlugin์ ์ค์ ํ๋ ๊ฒ์ ์ค์ฌ์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค. ํธ์คํธ ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ๋ฆฌ๋ชจํธ ์ ํ๋ฆฌ์ผ์ด์
๋ชจ๋์ ๋ํด ์ด๊ฒ์ด ์ด๋ป๊ฒ ์ค์ ๋๋์ง ๊ฐ๋
์ ์ผ๋ก ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ModuleFederationPlugin: ํต์ฌ ๊ตฌ์ฑ
์ด ํ๋ฌ๊ทธ์ธ์ webpack.config.js ํ์ผ์์ ์ธ์คํด์คํ๋ฉ๋๋ค:
new webpack.container.ModuleFederationPlugin({ /* options */ })
์ฃผ์ ๊ตฌ์ฑ ์ต์ ์ค๋ช :
-
name:ํ์ฌ Webpack ๋น๋(์ปจํ ์ด๋)์ ๊ณ ์ ํ ์ ์ญ ์ด๋ฆ์ ๋๋ค. ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ด ๋น๋์ ๋ชจ๋์ ์๋นํ๊ณ ์ ํ ๋, ์ด ์ด๋ฆ์ผ๋ก ์ฐธ์กฐํ๊ฒ ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฆ์ด "Dashboard"๋ผ๋ฉด
name์'dashboardApp'์ด ๋ ์ ์์ต๋๋ค. ์ด๋ ํ๋๋ ์ด์ ๋ ์ํ๊ณ ์ ๋ฐ์์ ์๋ณ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. -
filename:๋ฆฌ๋ชจํธ ์ํธ๋ฆฌ ํฌ์ธํธ์ ์ถ๋ ฅ ํ์ผ๋ช ์ ์ง์ ํฉ๋๋ค. ์ด๊ฒ์ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ธ์ถ๋ ๋ชจ๋์ ์ ๊ทผํ๊ธฐ ์ํด ๋ก๋ํ ํ์ผ์ ๋๋ค. ์ผ๋ฐ์ ์ธ ๊ดํ์
'remoteEntry.js'์ ๊ฐ์ด ์ด๋ฆ์ ์ง๋ ๊ฒ์ ๋๋ค. ์ด ํ์ผ์ ๋ ธ์ถ๋ ๋ชจ๋์ ๋ํ ๋งค๋ํ์คํธ ๋ฐ ๋ก๋ ์ญํ ์ ํฉ๋๋ค. -
exposes:์ด Webpack ๋น๋๊ฐ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋นํ ์ ์๋๋ก ์ ๊ณตํ๋ ๋ชจ๋์ ์ ์ํ๋ ๊ฐ์ฒด์ ๋๋ค. ํค๋ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ด๋ฌํ ๋ชจ๋์ ์ฐธ์กฐํ ๋ ์ฌ์ฉํ ์ด๋ฆ์ด๊ณ , ๊ฐ์ ํ๋ก์ ํธ ๋ด์ ์ค์ ๋ชจ๋์ ๋ํ ๋ก์ปฌ ๊ฒฝ๋ก์ ๋๋ค. ์๋ฅผ ๋ค์ด,
{'./Button': './src/components/Button.jsx'}๋ Button ์ปดํฌ๋ํธ๋ฅผButton์ผ๋ก ๋ ธ์ถํฉ๋๋ค. -
remotes:์ด Webpack ๋น๋๊ฐ ์๋นํ๊ณ ์ ํ๋ ๋ฆฌ๋ชจํธ ์ ํ๋ฆฌ์ผ์ด์ (๋ฐ ๊ทธ๋ค์ ์ํธ๋ฆฌ ํฌ์ธํธ)์ ์ ์ํ๋ ๊ฐ์ฒด์ ๋๋ค. ํค๋ ํด๋น ๋ฆฌ๋ชจํธ์์ ๋ชจ๋์ ๊ฐ์ ธ์ฌ ๋ ์ฌ์ฉํ ์ด๋ฆ(์:
'cartApp')์ด๊ณ , ๊ฐ์ ๋ฆฌ๋ชจํธ์remoteEntry.jsํ์ผ์ URL(์:'cartApp@http://localhost:3001/remoteEntry.js')์ ๋๋ค. ์ด๋ ํธ์คํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฆฌ๋ชจํธ ๋ชจ๋์ ์ ์๋ฅผ ์ด๋์ ์ฐพ์ ์ ์๋์ง ์๋ ค์ค๋๋ค. -
shared:์๋ง๋ ๊ฐ์ฅ ๊ฐ๋ ฅํ๊ณ ๋ณต์กํ ์ต์ ์ผ ๊ฒ์ ๋๋ค. ํ๋๋ ์ด์ ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ค ๊ฐ์ ๊ณตํต ์์กด์ฑ์ ์ด๋ป๊ฒ ๊ณต์ ํ ์ง ์ ์ํฉ๋๋ค. ๊ณต์ ๋์ด์ผ ํ ํจํค์ง ์ด๋ฆ ๋ชฉ๋ก(์:
['react', 'react-dom'])์ ์ง์ ํ ์ ์์ต๋๋ค. ๊ฐ ๊ณต์ ํจํค์ง์ ๋ํด ๋ค์์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค:singleton:true๋ ์ฌ๋ฌ ๋ฆฌ๋ชจํธ๊ฐ ์์ฒญํ๋๋ผ๋ ํด๋น ์์กด์ฑ์ ์ธ์คํด์ค๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋จ ํ๋๋ง ๋ก๋๋๋๋ก ๋ณด์ฅํฉ๋๋ค(React๋ Redux์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋งค์ฐ ์ค์).requiredVersion: ๊ณต์ ์์กด์ฑ์ ํ์ฉ ๊ฐ๋ฅํ ๋ฒ์ ์ ๋ํ semver ๋ฒ์๋ฅผ ์ง์ ํฉ๋๋ค.strictVersion:true๋ ํธ์คํธ์ ๋ฒ์ ์ด ๋ฆฌ๋ชจํธ์ ํ์ ๋ฒ์ ๊ณผ ์ผ์นํ์ง ์์ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค.eager: ๊ณต์ ๋ชจ๋์ ๋น๋๊ธฐ์ ์ด ์๋ ์ฆ์ ๋ก๋ํฉ๋๋ค. ์ ์คํ๊ฒ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ด ์ง๋ฅ์ ์ธ ๊ณต์ ๋ฉ์ปค๋์ฆ์ ์ค๋ณต ๋ค์ด๋ก๋๋ฅผ ๋ฐฉ์งํ๊ณ ๋ฒ์ ํธํ์ฑ์ ๋ณด์ฅํ์ฌ, ๋ถ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ ๊ฑธ์ณ ์์ ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์ค์ฉ ์์ : ํธ์คํธ ๋ฐ ๋ฆฌ๋ชจํธ ๊ตฌ์ฑ ์ค๋ช
1. ๋ฆฌ๋ชจํธ ์ ํ๋ฆฌ์ผ์ด์ (์: "์ ํ ์นดํ๋ก๊ทธ" ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋)
์ด ์ ํ๋ฆฌ์ผ์ด์
์ ์ ํ ๋ชฉ๋ก ์ปดํฌ๋ํธ๋ฅผ ๋
ธ์ถํฉ๋๋ค. webpack.config.js ํ์ผ์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค:
// ... other webpack config
plugins: [
new webpack.container.ModuleFederationPlugin({
name: 'productCatalog',
filename: 'remoteEntry.js',
exposes: {
'./ProductList': './src/components/ProductList.jsx',
'./ProductDetail': './src/components/ProductDetail.jsx'
},
shared: {
react: { singleton: true, requiredVersion: '^18.0.0' },
'react-dom': { singleton: true, requiredVersion: '^18.0.0' },
// ... other shared dependencies
}
})
]
// ...
์ฌ๊ธฐ์ productCatalog ์ ํ๋ฆฌ์ผ์ด์
์ ProductList์ ProductDetail์ ๋
ธ์ถํฉ๋๋ค. ๋ํ react์ react-dom์ ๊ณต์ ์ฑ๊ธํค์ผ๋ก ์ ์ธํ๊ณ ํน์ ๋ฒ์ ๋ฒ์๋ฅผ ์๊ตฌํฉ๋๋ค. ์ด๋ ํธ์คํธ๋ React๊ฐ ํ์ํ ๊ฒฝ์ฐ, ์ด๋ฏธ ๋ก๋๋ ๋ฒ์ ์ ์ฌ์ฉํ๊ฑฐ๋ ์ด ์ง์ ๋ ๋ฒ์ ์ ํ ๋ฒ๋ง ๋ก๋ํ๋ ค๊ณ ์๋ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
2. ํธ์คํธ ์ ํ๋ฆฌ์ผ์ด์ (์: "๋ฉ์ธ ํฌํธ" ์ ธ)
์ด ์ ํ๋ฆฌ์ผ์ด์
์ productCatalog์์ ProductList ์ปดํฌ๋ํธ๋ฅผ ์๋นํฉ๋๋ค. webpack.config.js ํ์ผ์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค:
// ... other webpack config
plugins: [
new webpack.container.ModuleFederationPlugin({
name: 'mainPortal',
remotes: {
productCatalog: 'productCatalog@http://localhost:3001/remoteEntry.js'
},
shared: {
react: { singleton: true, requiredVersion: '^18.0.0' },
'react-dom': { singleton: true, requiredVersion: '^18.0.0' },
// ... other shared dependencies
}
})
]
// ...
mainPortal์ productCatalog๋ฅผ ๋ฆฌ๋ชจํธ๋ก ์ ์ํ๊ณ , ๊ทธ ์ํธ๋ฆฌ ํ์ผ์ ๊ฐ๋ฆฌํต๋๋ค. ๋ํ React์ React DOM์ ๊ณต์ ๋ก ์ ์ธํ์ฌ ๋ฆฌ๋ชจํธ์์ ํธํ์ฑ ๋ฐ ์ค๋ณต ์ ๊ฑฐ๋ฅผ ๋ณด์ฅํฉ๋๋ค.
3. ํธ์คํธ์์ ๋ฆฌ๋ชจํธ ๋ชจ๋ ์๋นํ๊ธฐ
๊ตฌ์ฑ์ด ์๋ฃ๋๋ฉด, ํธ์คํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ก์ปฌ ๋ชจ๋์ฒ๋ผ ๋ฆฌ๋ชจํธ ๋ชจ๋์ ๋์ ์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค (๋จ, import ๊ฒฝ๋ก๋ ๋ฆฌ๋ชจํธ ์ด๋ฆ์ ๋ฐ์ํฉ๋๋ค):
import React from 'react';
// 'productCatalog' ๋ฆฌ๋ชจํธ์์ ProductList ์ปดํฌ๋ํธ๋ฅผ ๋์ ์ผ๋ก ๊ฐ์ ธ์ค๊ธฐ
const ProductList = React.lazy(() => import('productCatalog/ProductList'));
function App() {
return (
<div>
<h1>๋ฉ์ธ ํฌํธ์ ์ค์ ๊ฒ์ ํ์ํฉ๋๋ค</h1>
<React.Suspense fallback={<div>์ํ ๋ก๋ฉ ์ค...</div>}>
<ProductList />
</React.Suspense>
</div>
);
}
export default App;
์ด ์ค์ ์ mainPortal์ด productCatalog ํ์ ์ํด ์ ์ ์ผ๋ก ๊ฐ๋ฐ๋๊ณ ๋ฐฐํฌ๋ ProductList ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ์ ์๊ฒ ํ์ฌ, ์ง์ ํ ๋ฐํ์ ๊ตฌ์ฑ์ ๋ณด์ฌ์ค๋๋ค. React.lazy์ Suspense์ ์ฌ์ฉ์ ๋ฆฌ๋ชจํธ ๋ชจ๋ ๋ก๋ฉ์ ๋น๋๊ธฐ์ ํน์ฑ์ ์ฒ๋ฆฌํ์ฌ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ์ผ๋ฐ์ ์ธ ํจํด์
๋๋ค.
๋ชจ๋ ํ๋๋ ์ด์ ์ ํ์ฉํ ์ํคํ ์ฒ ํจํด ๋ฐ ์ ๋ต
๋ชจ๋ ํ๋๋ ์ด์ ์ ์ฌ๋ฌ ๊ฐ๋ ฅํ ์ํคํ ์ฒ ํจํด์ ๊ฐ๋ฅํ๊ฒ ํ์ฌ, ๊ธ๋ก๋ฒ ๊ธฐ์ ์ ์ํ ์ ์ฐํ๊ณ ๊ฒฌ๊ณ ํ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋ ๋ฐฐํฌ๋ฅผ ์ง์ํฉ๋๋ค.
๋ฐํ์ ํตํฉ ๋ฐ ์ํํ UI ๊ตฌ์ฑ
๋ชจ๋ ํ๋๋ ์ด์ ์ ํต์ฌ ์ฝ์์ ๋ฐํ์์ ์๋ก ๋ค๋ฅธ UI ์กฐ๊ฐ๋ค์ ๊ฒฐํฉํ๋ ๋ฅ๋ ฅ์ ๋๋ค. ์ด๋ ๋ค์์ ์๋ฏธํฉ๋๋ค:
- ๊ณต์ ๋ ์ด์์ ๋ฐ ์ ธ: ์ฃผ๋ "์ ธ" ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์ฒด ํ์ด์ง ๋ ์ด์์(ํค๋, ํธํฐ, ๋ค๋น๊ฒ์ด์ )์ ์ ์ํ๊ณ ์ง์ ๋ ์์ญ์ ๋ค์ํ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๋ฅผ ๋์ ์ผ๋ก ๋ก๋ํ์ฌ ์ผ๊ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ง๋ญ๋๋ค.
- ์ปดํฌ๋ํธ ์ฌ์ฌ์ฉ์ฑ: ๊ฐ๋ณ ์ปดํฌ๋ํธ(์: ๋ฒํผ, ํผ, ๋ฐ์ดํฐ ํ ์ด๋ธ, ์๋ฆผ ์์ ฏ)๋ '์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ' ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋์ ์ํด ๋ ธ์ถ๋๊ณ ์ฌ๋ฌ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋น๋์ด ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ณ ๊ฐ๋ฐ์ ๊ฐ์ํํฉ๋๋ค.
- ์ด๋ฒคํธ ๊ธฐ๋ฐ ํต์ : ๋ชจ๋ ํ๋๋ ์ด์ ์ด ๋ชจ๋ ๋ก๋ฉ์ ์ฒ๋ฆฌํ๋ ๋์, ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋ ๊ฐ ํต์ ์ ์ข ์ข ์ด๋ฒคํธ ๋ฒ์ค ํจํด, ๊ณต์ ์ํ ๊ด๋ฆฌ(์ ์คํ๊ฒ ๊ด๋ฆฌ๋ ๊ฒฝ์ฐ), ๋๋ ์ ์ญ ๋ฐํ-๊ตฌ๋ ๋ฉ์ปค๋์ฆ์ ์์กดํฉ๋๋ค. ์ด๋ฅผ ํตํด ํ๋๋ ์ด์ ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ค์ด ๊ธด๋ฐํ ๊ฒฐํฉ ์์ด ์ํธ ์์ฉํ๋ฉฐ ๋ ๋ฆฝ์ฑ์ ์ ์งํ ์ ์์ต๋๋ค.
๋ชจ๋ ํ๋๋ ์ด์ ์ ์ฌ์ฉํ ๋ชจ๋ ธ๋ ํฌ vs. ํด๋ฆฌ๋ ํฌ
๋ชจ๋ ํ๋๋ ์ด์ ์ ๋ ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์ ์ฅ์ ์ ๋ต์ ๋ชจ๋ ์ฐ์ํ๊ฒ ์ง์ํฉ๋๋ค:
- ๋ชจ๋ ธ๋ ํฌ ๊ฐํ: ๋ชจ๋ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๊ฐ ๋จ์ผ ์ ์ฅ์์ ์๋ ๋ชจ๋ ธ๋ ํฌ์์๋ ๋ชจ๋ ํ๋๋ ์ด์ ์ ๋งค์ฐ ์ ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ํด๋น ๋ชจ๋ ธ๋ ํฌ ๋ด์์ ๋ณ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๋ฆฝ์ ์ผ๋ก ๋น๋ํ๊ณ ๋ฐฐํฌํ ์ ์์ด, ์ฌ์ํ ๋ณ๊ฒฝ์ ์ํด ์ ์ฒด ์ ์ฅ์๋ฅผ ๋ค์ ๋น๋ํ ํ์๊ฐ ์์ต๋๋ค. ๊ณต์ ์์กด์ฑ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌ๋์ด ์ ์ฒด ๋น๋ ์๊ฐ์ ์ค์ด๊ณ ๊ฐ๋ฐ ํ์ดํ๋ผ์ธ ์ ๋ฐ์ ๊ฑธ์ณ ์บ์ ํ์ฉ๋๋ฅผ ํฅ์์ํต๋๋ค.
- ํด๋ฆฌ๋ ํฌ ๊ฐํ: ๊ฐ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋์ ๋ํด ๋ณ๋์ ์ ์ฅ์๋ฅผ ์ ํธํ๋ ์กฐ์ง์๊ฒ ๋ชจ๋ ํ๋๋ ์ด์ ์ ๊ฒ์ ์ฒด์ธ์ ์ ๋๋ค. ์ด๋ ์ ์ฅ์ ๊ฐ ์ฝ๋ ๊ณต์ ๋ฐ ๋ฐํ์ ํตํฉ์ ์ํ ๊ฒฌ๊ณ ํ๊ณ ๋ค์ดํฐ๋ธํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ฌ, ๋ณต์กํ ๋ด๋ถ ํจํค์ง ๊ฒ์ ์ํฌํ๋ก์ฐ๋ ์ปค์คํ ํ๋๋ ์ด์ ๋๊ตฌ์ ํ์์ฑ์ ์ ๊ฑฐํฉ๋๋ค. ํ๋ค์ ํตํฉ๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ฒฝํ์ ๊ธฐ์ฌํ๋ฉด์๋ ์์ ๋ค์ ์ ์ฅ์์ ๋ํ ์์ ํ ์์จ์ฑ์ ์ ์งํ ์ ์์ต๋๋ค.
๋์ ๋ก๋ฉ, ๋ฒ์ ๊ด๋ฆฌ ๋ฐ ํซ ๋ชจ๋ ๊ต์ฒด
๋ชจ๋ ํ๋๋ ์ด์ ์ ๋์ ์ธ ํน์ฑ์ ์๋นํ ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- ์จ๋๋งจ๋ ๋ก๋ฉ: ๋ฆฌ๋ชจํธ ๋ชจ๋์ ๋น๋๊ธฐ์ ์ผ๋ก ๊ทธ๋ฆฌ๊ณ ํ์ํ ๋๋ง(์:
React.lazy()๋๋ ๋์ import()์ฌ์ฉ) ๋ก๋๋ ์ ์์ด, ์ด๊ธฐ ํ์ด์ง ๋ก๋ ์๊ฐ์ ๊ฐ์ ํ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ์ด๊ธฐ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์ ๋๋ค. - ๊ฒฌ๊ณ ํ ๋ฒ์ ๊ด๋ฆฌ:
shared๊ตฌ์ฑ์ ํตํด ์์กด์ฑ ๋ฒ์ ์ ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์์ต๋๋ค. ์ ํํ ๋ฒ์ , ๋ฒ์ ๋ฒ์ ๋๋ ํด๋ฐฑ์ ์ง์ ํ์ฌ ์์ ํ๊ณ ํต์ ๋ ์ ๊ทธ๋ ์ด๋๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ด๋ ๋๊ท๋ชจ ๋ถ์ฐ ์์คํ ์์ "์์กด์ฑ ์ง์ฅ"์ ๋ฐฉ์งํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. - ํซ ๋ชจ๋ ๊ต์ฒด(HMR): ๊ฐ๋ฐ ์ค์ HMR์ ํ๋๋ ์ด์ ๋ ๋ชจ๋ ๊ฐ์ ์๋ํ ์ ์์ต๋๋ค. ๋ฆฌ๋ชจํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ฒด ํ์ด์ง ๋ฆฌ๋ก๋ ์์ด ํธ์คํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์๋์ด ๊ฐ๋ฐ ํผ๋๋ฐฑ ๋ฃจํ๋ฅผ ๊ฐ์ํํฉ๋๋ค.
์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR) ๋ฐ ์ฃ์ง ์ปดํจํ
์ฃผ๋ก ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๊ธฐ๋ฅ์ด์ง๋ง, ๋ชจ๋ ํ๋๋ ์ด์ ์ ์ฑ๋ฅ๊ณผ SEO๋ฅผ ํฅ์์ํค๊ธฐ ์ํด SSR ์ ๋ต๊ณผ ํตํฉ๋ ์ ์์ต๋๋ค:
- ์ด๊ธฐ ๋ก๋๋ฅผ ์ํ SSR: ์ค์ํ ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ, ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๋ฅผ ์๋ฒ์์ ๋ ๋๋งํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด๊ฐ ์ฑ๋ฅ๊ณผ SEO๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ชจ๋ ํ๋๋ ์ด์ ์ ํด๋ผ์ด์ธํธ ์ฌ์ด๋์์ ์ด๋ฌํ ์ฌ์ ๋ ๋๋ง๋ ์ปดํฌ๋ํธ๋ฅผ ํ์ด๋๋ ์ด์ (hydrate)ํ ์ ์์ต๋๋ค.
- ์ฃ์ง ์ฌ์ด๋ ๊ตฌ์ฑ: ๋ชจ๋ ํ๋๋ ์ด์ ์ ์์น์ ์ฃ์ง ์ปดํจํ ํ๊ฒฝ์ผ๋ก ํ์ฅ๋ ์ ์์ด, ์ฌ์ฉ์์๊ฒ ๋ ๊ฐ๊น์ด ๊ณณ์์ ์น ๊ฒฝํ์ ๋์ ๊ตฌ์ฑ ๋ฐ ๊ฐ์ธํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ๊ธ๋ก๋ฒ ์ฌ์ฉ์์ ์ง์ฐ ์๊ฐ์ ์ ์ฌ์ ์ผ๋ก ์ค์ผ ์ ์์ต๋๋ค. ์ด๋ ํ๋ฐํ ํ์ ์ด ์ด๋ฃจ์ด์ง๊ณ ์๋ ๋ถ์ผ์ ๋๋ค.
๊ธ๋ก๋ฒ ํ ๋ฐ ๊ธฐ์ ์ ์ํ ๋ชจ๋ ํ๋๋ ์ด์ ์ ์ด์
๋ชจ๋ ํ๋๋ ์ด์ ์ ๊ธฐ์ ์ ์ธ ์๋ฃจ์ ์ด์์ผ๋ก, ์ ์ธ๊ณ์์ ํ๋ํ๋ ๋ค์ํ ํ์ ์ํด ์์จ์ฑ, ํจ์จ์ฑ, ์ ์ฐ์ฑ์ ์ด์งํ๋ ์กฐ์ง์ ์กฐ๋ ฅ์์ ๋๋ค.
ํฅ์๋ ํ์ฅ์ฑ ๋ฐ ๋ ๋ฆฝ์ ์ธ ๊ฐ๋ฐ
- ๋ถ์ฐ๋ ์์ ๊ถ: ์๋ก ๋ค๋ฅธ ์๊ฐ๋์ ์ง๋ฆฌ์ ์์น์ ์๋ ํ๋ค์ด ๊ฐ์์ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ์์ , ๊ฐ๋ฐ, ๋ฐฐํฌํ ์ ์์ต๋๋ค. ์ด๋ ํ ๊ฐ ์์กด์ฑ์ ์ค์ด๊ณ ๋ณ๋ ฌ ๊ฐ๋ฐ ์คํธ๋ฆผ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ๋ ๋น ๋ฅธ ๊ธฐ๋ฅ ์ ๊ณต: ๋ ๋ฆฝ์ ์ธ ๋ฐฐํฌ ํ์ดํ๋ผ์ธ์ ํตํด ํ๋ค์ ๋ชจ๋๋ฆฌ์ ๋ฆด๋ฆฌ์ค ์ฃผ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์์ ์ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋์ ๋ํ ์๋ก์ด ๊ธฐ๋ฅ์ด๋ ๋ฒ๊ทธ ์์ ์ ๋ฆด๋ฆฌ์คํ ์ ์์ต๋๋ค. ์ด๋ ์ฌ์ฉ์๊ฐ ์ด๋์ ์๋ ๊ฐ์น๋ฅผ ์ ๋ฌํ๋ ์๋๋ฅผ ํฌ๊ฒ ๊ฐ์ํํฉ๋๋ค.
- ์ปค๋ฎค๋์ผ์ด์ ์ค๋ฒํค๋ ๊ฐ์: ๋ชจ๋ ๊ฒฝ๊ณ์ ์ธํฐํ์ด์ค๋ฅผ ๋ช ํํ๊ฒ ์ ์ํจ์ผ๋ก์จ, ๋ชจ๋ ํ๋๋ ์ด์ ์ ํ ๊ฐ์ ์ง์์ ์ธ ๋๊ธฐ์ ์ปค๋ฎค๋์ผ์ด์ ํ์์ฑ์ ์ต์ํํ์ฌ, ํ๋ค์ด ์์ ๋ค์ ๋๋ฉ์ธ๋ณ ์ฑ ์์ ์ง์คํ ์ ์๋๋ก ํฉ๋๋ค.
๊ธฐ์ ๋ ๋ฆฝ์ฑ ๋ฐ ์ ์ง์ ๋ง์ด๊ทธ๋ ์ด์
- ๋ค์ํ ๊ธฐ์ ์คํ: ๊ธ๋ก๋ฒ ๊ธฐ์ ๋ค์ ์ข ์ข ๋ค์ํ ํ๋ก ํธ์๋ ํ๋ ์์ํฌ๋ฅผ ์์๋ฐ๊ฑฐ๋ ์ฑํํฉ๋๋ค. ๋ชจ๋ ํ๋๋ ์ด์ ์ ์๋ฅผ ๋ค์ด React๋ก ๊ตฌ์ถ๋ ๋ฉ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ด Vue, Angular ๋๋ ์ฌ์ง์ด ๋ ์ค๋๋ ํ๋ ์์ํฌ๋ก ๊ตฌ์ถ๋ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๋ฅผ ์ํํ๊ฒ ํตํฉํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ ๋น์ฉ์ด ๋ง์ด ๋๋ ์ผ๊ด์ ์ธ ๋ง์ด๊ทธ๋ ์ด์ ์ ํ์์ฑ์ ์์ ์ค๋๋ค.
- ๋จ๊ณ์ ํ๋ํ: ๋ ๊ฑฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ง์ ์ผ๋ก ํ๋ํํ ์ ์์ต๋๋ค. ์๋ก์ด ๊ธฐ๋ฅ์ด๋ ์น์ ์ ์ต์ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๋ก ๊ฐ๋ฐํ๊ณ , ๊ธฐ์กด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ง์ ์ผ๋ก ํตํฉํ์ฌ ์ํ์ ์ค์ด๊ณ ํต์ ๋ ์ ํ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
ํฅ์๋ ์ฑ๋ฅ ๋ฐ ์ฌ์ฉ์ ๊ฒฝํ
- ์ต์ ํ๋ ๋ฒ๋ค ํฌ๊ธฐ: ์์กด์ฑ์ ์ง๋ฅ์ ์ธ ๊ณต์ ๋ฅผ ํตํด ๋ชจ๋ ํ๋๋ ์ด์ ์ ๊ณตํต ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ ๋ฒ๋ง ๋ก๋๋๋๋ก ๋ณด์ฅํ์ฌ, ์ฌ์ฉ์๊ฐ ๋ค์ด๋ก๋ํ๋ ์ด JavaScript ์์ ํฌ๊ฒ ์ค์ ๋๋ค. ์ด๋ ํนํ ๋๋ฆฐ ๋คํธ์ํฌ๋ ๋ชจ๋ฐ์ผ ์ฅ์น๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ์์๊ฒ ์ ์ตํ๋ฉฐ, ์ ์ธ๊ณ์ ์ผ๋ก ๋ก๋ ์๊ฐ์ ๊ฐ์ ํฉ๋๋ค.
- ํจ์จ์ ์ธ ์บ์ฑ: ํ๋๋ ์ด์ ๋ ๋ชจ๋์ ๋ ๋ฆฝ์ ์ด๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ์์ ๊ฐ๋ณ์ ์ผ๋ก ์บ์๋ ์ ์์ต๋๋ค. ๋ฆฌ๋ชจํธ ๋ชจ๋์ด ์ ๋ฐ์ดํธ๋๋ฉด ํด๋น ํน์ ๋ชจ๋์ ์บ์๋ง ๋ฌดํจํํ๊ณ ๋ค์ ๋ค์ด๋ก๋ํ๋ฉด ๋๋ฏ๋ก ํ์ ๋ก๋๊ฐ ๋ ๋นจ๋ผ์ง๋๋ค.
- ๋ ๋น ๋ฅธ ์ฒด๊ฐ ์ฑ๋ฅ: ๋ฆฌ๋ชจํธ๋ฅผ ์ง์ฐ ๋ก๋ฉ(lazy loading)ํ๋ฉด ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ๋ ํ์ฌ ์ํธ ์์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ถ๋ถ์ ๋ํ ์ฝ๋๋ง ๋ค์ด๋ก๋ํ๋ฏ๋ก, ๋ ๋น ๋ฅด๊ณ ๋ฐ์์ฑ์ด ์ข์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ฒฝํํ๊ฒ ๋ฉ๋๋ค.
๋น์ฉ ํจ์จ์ฑ ๋ฐ ์์ ์ต์ ํ
- ์ค๋ณต ์์ ๊ฐ์: ์ปดํฌ๋ํธ, ๋์์ธ ์์คํ , ์ ํธ๋ฆฌํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ์ด ๊ณต์ ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํจ์ผ๋ก์จ, ๋ชจ๋ ํ๋๋ ์ด์ ์ ๋ค๋ฅธ ํ๋ค์ด ๋์ผํ ๊ธฐ๋ฅ์ ์ฌ๊ตฌ์ถํ๋ ๊ฒ์ ๋ฐฉ์งํ์ฌ ๊ฐ๋ฐ ์๊ฐ๊ณผ ์์์ ์ ์ฝํฉ๋๋ค.
- ๊ฐ์ํ๋ ๋ฐฐํฌ ํ์ดํ๋ผ์ธ: ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋์ ๋ ๋ฆฝ์ ์ธ ๋ฐฐํฌ๋ ๋ชจ๋๋ฆฌ์ ๋ฐฐํฌ์ ๊ด๋ จ๋ ๋ณต์ก์ฑ๊ณผ ์ํ์ ์ค์ ๋๋ค. CI/CD ํ์ดํ๋ผ์ธ์ ๋ ๊ฐ๋จํ๊ณ ๋นจ๋ผ์ง๋ฉฐ, ๋ ์ ์ ์์๊ณผ ์กฐ์ ์ ํ์๋ก ํฉ๋๋ค.
- ๊ธ๋ก๋ฒ ์ธ์ฌ ๊ธฐ์ฌ ๊ทน๋ํ: ํ๋ค์ ์ ์ธ๊ณ์ ๋ถ์ฐ๋ ์ ์์ผ๋ฉฐ, ๊ฐ ํ์ ์์ ์ ํน์ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋์ ์ง์คํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์กฐ์ง์ ๊ธด๋ฐํ๊ฒ ๊ฒฐํฉ๋ ์์คํ ์ ์ํคํ ์ฒ์ ์ ์ฝ ์์ด ๊ธ๋ก๋ฒ ์ธ์ฌ ํ์ ๋ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ ์ ์์ต๋๋ค.
์ค์ฉ์ ์ธ ๊ณ ๋ ค ์ฌํญ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
๋ชจ๋ ํ๋๋ ์ด์ ์ ์์ฒญ๋ ํ์ ์ ๊ณตํ์ง๋ง, ์ฑ๊ณต์ ์ธ ๊ตฌํ์ ์ํด์๋ ์ ์คํ ๊ณํ๊ณผ ๋ชจ๋ฒ ์ฌ๋ก ์ค์๊ฐ ํ์ํ๋ฉฐ, ํนํ ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ๋ณต์กํ ์์คํ ์ ๊ด๋ฆฌํ ๋๋ ๋์ฑ ๊ทธ๋ ์ต๋๋ค.
์์กด์ฑ ๊ด๋ฆฌ: ํ๋๋ ์ด์ ์ ํต์ฌ
- ์ ๋ต์ ๊ณต์ : ์ด๋ค ์์กด์ฑ์ ๊ณต์ ํ ์ง ์ ์คํ๊ฒ ๊ณ ๋ คํ์ญ์์ค. ๊ณผ๋ํ๊ฒ ๊ณต์ ํ๋ฉด ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋์ง ์์ ๊ฒฝ์ฐ ์ด๊ธฐ ๋ฒ๋ค์ด ์ปค์ง ์ ์๊ณ , ์ ๊ฒ ๊ณต์ ํ๋ฉด ์ค๋ณต ๋ค์ด๋ก๋๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค. React, Angular, Vue, Redux ๋๋ ์ค์ UI ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ์ ํฌ๊ณ ๊ณตํต์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ณต์ ํ๋ ๊ฒ์ ์ฐ์ ์์๋ก ๋์ญ์์ค.
-
์ฑ๊ธํค ์์กด์ฑ: React, React DOM ๋๋ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์: Redux, Vuex, NgRx)์ ๊ฐ์ ์ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํญ์ ์ฑ๊ธํค(
singleton: true)์ผ๋ก ๊ตฌ์ฑํ์ญ์์ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋จ ํ๋์ ์ธ์คํด์ค๋ง ์กด์ฌํ๋๋ก ๋ณด์ฅํ์ฌ ๋ฏธ๋ฌํ ๋ฒ๊ทธ์ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํฉ๋๋ค. -
๋ฒ์ ํธํ์ฑ:
requiredVersion๊ณผstrictVersion์ ์ ์คํ๊ฒ ์ฌ์ฉํ์ญ์์ค. ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ต๋ํ์ ์ ์ฐ์ฑ์ ์ํด ๋์จํrequiredVersion์ด ํ์ฉ๋ ์ ์์ต๋๋ค. ํ๋ก๋์ ํ๊ฒฝ, ํนํ ์ค์ํ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฝ์ฐstrictVersion: true๋ ๋ ํฐ ์์ ์ฑ์ ์ ๊ณตํ๊ณ ๋ฒ์ ๋ถ์ผ์น๋ก ์ธํ ์๊ธฐ์น ์์ ๋์์ ๋ฐฉ์งํฉ๋๋ค.
์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ํ๋ณตํ๋ ฅ์ฑ
-
๊ฒฌ๊ณ ํ ํด๋ฐฑ(Fallback): ๋ฆฌ๋ชจํธ ๋ชจ๋์ ๋คํธ์ํฌ ๋ฌธ์ , ๋ฐฐํฌ ์ค๋ฅ ๋๋ ์๋ชป๋ ๊ตฌ์ฑ์ผ๋ก ์ธํด ๋ก๋์ ์คํจํ ์ ์์ต๋๋ค. ํญ์ ๋น ํ๋ฉด ๋์ ์ฐ์ํ ์ฑ๋ฅ ์ ํ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ ์ํด ํด๋ฐฑ UI(์: ์ปค์คํ
๋ก๋ฉ ํ์๊ธฐ ๋๋ ์ค๋ฅ ๊ฒฝ๊ณ๊ฐ ์๋
React.Suspense์ฌ์ฉ)๋ฅผ ๊ตฌํํ์ญ์์ค. - ๋ชจ๋ํฐ๋ง ๋ฐ ๋ก๊น : ๋ชจ๋ ํ๋๋ ์ด์ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฑธ์ณ ํฌ๊ด์ ์ธ ๋ชจ๋ํฐ๋ง ๋ฐ ๋ก๊น ์ ๊ตฌํํ์ญ์์ค. ์ค์ ์ง์ค์ ์ค๋ฅ ์ถ์ ๋ฐ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ ๋ฌธ์ ์ ์์ธ์ด ์ด๋์ ์๋ ๋ถ์ฐ ํ๊ฒฝ์์ ๋ฌธ์ ๋ฅผ ์ ์ํ๊ฒ ์๋ณํ๋ ๋ฐ ํ์์ ์ ๋๋ค.
- ๋ฐฉ์ด์ ํ๋ก๊ทธ๋๋ฐ: ๋ฆฌ๋ชจํธ ๋ชจ๋์ ์ธ๋ถ ์๋น์ค๋ก ์ทจ๊ธํ์ญ์์ค. ๊ทธ๋ค ์ฌ์ด์ ์ ๋ฌ๋๋ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ฆํ๊ณ , ์๊ธฐ์น ์์ ์ ๋ ฅ์ ์ฒ๋ฆฌํ๋ฉฐ, ์ด๋ค ๋ฆฌ๋ชจํธ ํธ์ถ์ด๋ ์คํจํ ์ ์๋ค๊ณ ๊ฐ์ ํ์ญ์์ค.
๋ฒ์ ๊ด๋ฆฌ ๋ฐ ํธํ์ฑ
- ์๋งจํฑ ๋ฒ์ ๊ด๋ฆฌ(Semantic Versioning): ๋ ธ์ถ๋ ๋ชจ๋๊ณผ ๋ฆฌ๋ชจํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋งจํฑ ๋ฒ์ ๊ด๋ฆฌ(Major.Minor.Patch)๋ฅผ ์ ์ฉํ์ญ์์ค. ์ด๋ ์๋น์์๊ฒ ๋ช ํํ ๊ณ์ฝ์ ์ ๊ณตํ๊ณ ํธํ์ฑ์ด ๊นจ์ง๋ ๋ณ๊ฒฝ(breaking change)์ ๊ด๋ฆฌํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ํ์ ํธํ์ฑ: ๋ ธ์ถ๋ ๋ชจ๋์ ์ ๋ฐ์ดํธํ ๋ ํ์ ํธํ์ฑ์ ์ ์งํ๊ธฐ ์ํด ๋ ธ๋ ฅํ์ญ์์ค. ํธํ์ฑ์ด ๊นจ์ง๋ ๋ณ๊ฒฝ์ด ๋ถ๊ฐํผํ ๊ฒฝ์ฐ, ์ด๋ฅผ ๋ช ํํ๊ฒ ์ ๋ฌํ๊ณ ๋ง์ด๊ทธ๋ ์ด์ ๊ฒฝ๋ก๋ฅผ ์ ๊ณตํ์ญ์์ค. ๋ง์ด๊ทธ๋ ์ด์ ๊ธฐ๊ฐ ๋์ ์ผ์์ ์ผ๋ก ๋ชจ๋์ ์ฌ๋ฌ ๋ฒ์ ์ ๋ ธ์ถํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
- ํต์ ๋ ๋กค์์: ๋ฆฌ๋ชจํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฒ์ ์ ๋ํด ํต์ ๋ ๋กค์์ ์ ๋ต(์: ์นด๋๋ฆฌ ๋ฐฐํฌ, ๊ธฐ๋ฅ ํ๋๊ทธ)์ ๊ตฌํํ์ญ์์ค. ์ด๋ฅผ ํตํด ์ ์ฒด ๊ธ๋ก๋ฒ ๋ฆด๋ฆฌ์ค ์ ์ ์์์ ์ฌ์ฉ์์ ํจ๊ป ์ ๋ฒ์ ์ ํ ์คํธํ์ฌ ๋ฌธ์ ๋ฐ์ ์ ์ํฅ์ ์ต์ํํ ์ ์์ต๋๋ค.
์ฑ๋ฅ ์ต์ ํ
- ๋ฆฌ๋ชจํธ ์ง์ฐ ๋ก๋ฉ: ์ด๊ธฐ ํ์ด์ง ๋ ๋๋ง์ ์ ๋์ ์ผ๋ก ํ์ํ์ง ์์ ํ, ํญ์ ๋ฆฌ๋ชจํธ ๋ชจ๋์ ์ง์ฐ ๋ก๋ฉํ์ญ์์ค. ์ด๋ ์ด๊ธฐ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ํฌ๊ฒ ์ค์ด๊ณ ์ฒด๊ฐ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
-
์ ๊ทน์ ์ธ ์บ์ฑ:
remoteEntry.jsํ์ผ๊ณผ ๋ ธ์ถ๋ ๋ชจ๋์ ๋ํด ๋ธ๋ผ์ฐ์ ์บ์ฑ๊ณผ CDN(์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ) ์บ์ฑ์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ์ญ์์ค. ์ ๋ต์ ์ธ ์บ์ ๋ฒ์คํ ์ ์ฌ์ฉ์๊ฐ ํ์ํ ๋ ํญ์ ์ต์ ์ฝ๋๋ฅผ ์ป๋๋ก ๋ณด์ฅํ๋ฉด์, ๋ค์ํ ์ง๋ฆฌ์ ์์น์์ ๋ณ๊ฒฝ๋์ง ์์ ๋ชจ๋์ ๋ํ ์บ์ ํํธ์จ์ ๊ทน๋ํํฉ๋๋ค. - ์ฌ์ ๋ก๋ฉ ๋ฐ ์ฌ์ ์ธ์ถ(Preloading and Prefetching): ๊ณง ์ ๊ทผํ ๊ฐ๋ฅ์ฑ์ด ๋์ ๋ชจ๋์ ๊ฒฝ์ฐ, ์ฌ์ ๋ก๋ฉ(์ฆ์ ๊ฐ์ ธ์ค์ง๋ง ์คํํ์ง ์์) ๋๋ ์ฌ์ ์ธ์ถ(๋ธ๋ผ์ฐ์ ์ ํด ์๊ฐ์ ๊ฐ์ ธ์ด)์ ๊ณ ๋ คํ์ฌ ์ด๊ธฐ ์ค์ ๋ ๋๋ง ๊ฒฝ๋ก์ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉด์ ์ฒด๊ฐ ๋ก๋ ์๊ฐ์ ๋์ฑ ์ต์ ํํ์ญ์์ค.
๋ณด์ ๊ณ ๋ ค ์ฌํญ
-
์ ๋ขฐํ ์ ์๋ ์ถ์ฒ: ์ ๋ขฐํ ์ ์๊ณ ๊ฒ์ฆ๋ ์ถ์ฒ์์๋ง ๋ฆฌ๋ชจํธ ๋ชจ๋์ ๋ก๋ํ์ญ์์ค. ์
์์ ์ธ ์ฝ๋ ์ฃผ์
์ ๋ฐฉ์งํ๊ธฐ ์ํด
remoteEntry.jsํ์ผ์ด ํธ์คํ ๋๊ณ ์ ๊ทผ๋๋ ์์น๋ฅผ ์ ์คํ๊ฒ ์ ์ดํ์ญ์์ค. - ์ฝํ ์ธ ๋ณด์ ์ ์ฑ (CSP): ๋์ ์ผ๋ก ๋ก๋๋ ์ฝํ ์ธ ์ ๊ด๋ จ๋ ์ํ์ ์ํํ๊ธฐ ์ํด ๊ฐ๋ ฅํ CSP๋ฅผ ๊ตฌํํ์ฌ, ์คํฌ๋ฆฝํธ ๋ฐ ๊ธฐํ ๋ฆฌ์์ค๊ฐ ๋ก๋๋ ์ ์๋ ์์ค๋ฅผ ์ ํํ์ญ์์ค.
- ์ฝ๋ ๊ฒํ ๋ฐ ์ค์บ: ๋ค๋ฅธ ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ฑ ์์์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ชจ๋ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋์ ๋ํด ์๊ฒฉํ ์ฝ๋ ๊ฒํ ํ๋ก์ธ์ค๋ฅผ ์ ์งํ๊ณ ์๋ํ๋ ๋ณด์ ์ค์บ ๋๊ตฌ๋ฅผ ํตํฉํ์ญ์์ค.
๊ฐ๋ฐ์ ๊ฒฝํ(DX)
- ์ผ๊ด๋ ๊ฐ๋ฐ ํ๊ฒฝ: ์์น์ ๊ด๊ณ์์ด ๋ชจ๋ ํ์ ๊ฑธ์ณ ์ผ๊ด๋ ๋ก์ปฌ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ช ํํ ๊ฐ์ด๋๋ผ์ธ๊ณผ ์ ์ฌ์ ์ผ๋ก ํ์คํ๋ ๋๊ตฌ ๋๋ Docker ์ค์ ์ ์ ๊ณตํ์ญ์์ค.
- ๋ช ํํ ์ปค๋ฎค๋์ผ์ด์ ํ๋กํ ์ฝ: ์ํธ ์์กด์ ์ธ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๋ฅผ ๊ฐ๋ฐํ๋ ํ๋ค์ ์ํด ๋ช ํํ ์ปค๋ฎค๋์ผ์ด์ ์ฑ๋๊ณผ ํ๋กํ ์ฝ์ ์ค์ ํ์ญ์์ค. ์ ๊ธฐ์ ์ธ ์ฑํฌ์ , ๊ณต์ ๋ฌธ์ ๋ฐ API ๊ณ์ฝ์ ํ์์ ์ ๋๋ค.
- ๋๊ตฌ ๋ฐ ๋ฌธ์ํ: ๋ชจ๋ ํ๋๋ ์ด์ ์ค์ ์ ๋ํ ๋ฌธ์์ ํฌ์ํ๊ณ , ๋ก์ปฌ์์ ์ฌ๋ฌ ํ๋๋ ์ด์ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ผ๋ฐ์ ์ธ ์์ ์ ๋จ์ํํ๊ธฐ ์ํด ๋ง์ถคํ ๋๊ตฌ๋ ์คํฌ๋ฆฝํธ๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
๋ชจ๋ ํ๋๋ ์ด์ ์ ํตํ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋์ ๋ฏธ๋
๋ชจ๋ ํ๋๋ ์ด์ ์ ์ด๋ฏธ ์ ์ธ๊ณ์ ์ผ๋ก ์๋ง์ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ทธ ๊ฐ์น๋ฅผ ์ ์ฆํ์ง๋ง, ๊ทธ ์ฌ์ ์ ์์ง ๋๋์ง ์์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ช ๊ฐ์ง ์ฃผ์ ๋ฐ์ ์ ์์ํ ์ ์์ต๋๋ค:
- Webpack์ ๋์ด์๋ ํ์ฅ: Webpack ๊ณ ์ ๊ธฐ๋ฅ์ด์ง๋ง, ๋ชจ๋ ํ๋๋ ์ด์ ์ ํต์ฌ ๊ฐ๋ ์ Rspack์ด๋ Vite ํ๋ฌ๊ทธ์ธ๊ณผ ๊ฐ์ ๋ค๋ฅธ ๋น๋ ๋๊ตฌ์ ์ํด ํ์๋๊ณ ์ฑํ๋๊ณ ์์ต๋๋ค. ์ด๋ ๊ทธ ํ์ ๋ํ ๊ด๋ฒ์ํ ์ ๊ณ์ ์ธ์์ ๋ํ๋ด๋ฉฐ, ๋ณด๋ค ๋ณดํธ์ ์ธ ๋ชจ๋ ๊ณต์ ํ์ค์ ํฅํ ์์ง์์ ์์ฌํฉ๋๋ค.
- ํ์คํ ๋ ธ๋ ฅ: ์ด ํจํด์ด ์ธ๊ธฐ๋ฅผ ์ป์์ ๋ฐ๋ผ, ๋ชจ๋ ํ๋๋ ์ด์ ๊ตฌ์ฑ๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ํ์คํํ๋ ค๋ ์ปค๋ฎค๋ํฐ ์ฃผ๋์ ๋ ธ๋ ฅ์ด ๋์ฑ ํ๋ฐํด์ง ๊ฒ์ด๋ฉฐ, ์ด๋ ๋ค์ํ ํ๊ณผ ๊ธฐ์ ์ด ์ํธ ์ด์ฉํ๊ธฐ๋ฅผ ํจ์ฌ ์ฝ๊ฒ ๋ง๋ค ๊ฒ์ ๋๋ค.
- ํฅ์๋ ๋๊ตฌ ๋ฐ ์ํ๊ณ: ํ๋๋ ์ด์ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ํ๊ธฐ ์ํด ํน๋ณํ ์ค๊ณ๋ ๊ฐ๋ฐ ๋๊ตฌ, ๋๋ฒ๊น ๋ณด์กฐ ๋๊ตฌ, ๋ฐฐํฌ ํ๋ซํผ์ ๋ ํ๋ถํ ์ํ๊ณ๋ฅผ ๊ธฐ๋ํ ์ ์์ผ๋ฉฐ, ์ด๋ ์ ์ธ๊ณ์ ์ผ๋ก ๋ถ์ฐ๋ ํ์ ๊ฐ๋ฐ์ ๊ฒฝํ์ ๊ฐ์ํํ ๊ฒ์ ๋๋ค.
- ์ฑํ ์ฆ๊ฐ: ๊ทธ ์ด์ ์ด ๋ ๋๋ฆฌ ์ดํด๋จ์ ๋ฐ๋ผ, ๋ชจ๋ ํ๋๋ ์ด์ ์ ๋๊ท๋ชจ ์ํฐํ๋ผ์ด์ฆ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํจ์ฌ ๋ ํฐ ์ฑํ์ ์ํด ์ค๋น๋์ด ์์ผ๋ฉฐ, ๊ธฐ์ ์ด ์ ์ธ๊ณ์ ์ผ๋ก ์น ์กด์ฌ๊ฐ๊ณผ ๋์งํธ ์ ํ์ ์ ๊ทผํ๋ ๋ฐฉ์์ ๋ณํ์ํฌ ๊ฒ์ ๋๋ค.
๊ฒฐ๋ก
Webpack 6(๊ทธ๋ฆฌ๊ณ Webpack 5์ ๊ธฐ๋ฐ ๊ธฐ๋ฅ)์ ์ฌ์ฉํ JavaScript ๋ชจ๋ ํ๋๋ ์ด์ ์ ํ๋ก ํธ์๋ ๊ฐ๋ฐ ์ธ๊ณ์์ ๊ธฐ๋ ๋น์ ์ธ ๋์ฝ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ํนํ ๊ธ๋ก๋ฒ ๊ฐ๋ฐํ์ ๋ณด์ ํ๊ณ ๋ ๋ฆฝ์ ์ด๊ณ ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ ํ๋ ฅ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ํ์ํ ์กฐ์ง์ ์ํด ๋๊ท๋ชจ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋ ์ํคํ ์ฒ๋ฅผ ๊ตฌ์ถํ๊ณ ์ ์งํ๋ ๊ฒ๊ณผ ๊ด๋ จ๋ ๊ฐ์ฅ ์ง์์ ์ธ ๋ฌธ์ ์ค ์ผ๋ถ๋ฅผ ์ฐ์ํ๊ฒ ํด๊ฒฐํฉ๋๋ค.
๋ชจ๋์ ๋์ ๋ฐํ์ ๊ณต์ ์ ์ง๋ฅ์ ์ธ ์์กด์ฑ ๊ด๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํจ์ผ๋ก์จ, ๋ชจ๋ ํ๋๋ ์ด์ ์ ๊ฐ๋ฐํ์ด ์ง์ ์ผ๋ก ์์จ์ ์ผ๋ก ์์ ํ๊ณ , ๊ธฐ๋ฅ ์ ๊ณต์ ๊ฐ์ํํ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ํฅ์์ํค๊ณ , ๊ธฐ์ ์ ๋ค์์ฑ์ ํฌ์ฉํ ์ ์๋๋ก ํ์ ์ค์ด์ค๋๋ค. ์ด๋ ๋ณต์กํ๊ณ ๊ธด๋ฐํ๊ฒ ๊ฒฐํฉ๋ ์์คํ ์ ์ ๋ก ์๋ ๋ฏผ์ฒฉ์ฑ์ผ๋ก ์ ์ํ๊ณ ์งํํ ์ ์๋ ์ ์ฐํ๊ณ ๊ตฌ์ฑ ๊ฐ๋ฅํ ์ํ๊ณ๋ก ๋ณํ์ํต๋๋ค.
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฏธ๋์ ๋๋นํ๊ณ , ๊ตญ์ ํ ๊ฐ์ ํ์ ์ ์ต์ ํํ๋ฉฐ, ์ ์ธ๊ณ์ ์ผ๋ก ๋นํ ๋ฐ ์๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๊ณ ์ ํ๋ ๋ชจ๋ ๊ธฐ์ ์๊ฒ JavaScript ๋ชจ๋ ํ๋๋ ์ด์ ์ ์์ฉํ๋ ๊ฒ์ ๋จ์ง ์ ํ ์ฌํญ์ด ์๋๋ผ ์ ๋ต์ ํ์ ๊ณผ์ ์ ๋๋ค. ๋ฐ์ด๋ค์ด ์คํํ๊ณ , ์กฐ์ง์ ์ํ ์ฐจ์ธ๋ ์น ๊ฐ๋ฐ์ ๋ฌธ์ ์ฌ์ญ์์ค.