ํ์ฅ ๊ฐ๋ฅํ๊ณ ์ ์ง๋ณด์ ์ฉ์ดํ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋ ์ํคํ ์ฒ ๊ตฌ์ถ์ ์ํ JavaScript ๋ชจ๋ ํ๋๋ ์ด์ ์ ๊ณ ๊ธ ๋ฐํ์ ์์กด์ฑ ํด๊ฒฐ ๊ธฐ์ ์ ํ๊ตฌํฉ๋๋ค.
JavaScript ๋ชจ๋ ํ๋๋ ์ด์ : ๋ฐํ์ ์์กด์ฑ ํด๊ฒฐ ์ฌ์ธต ๋ถ์
Webpack 5์์ ๋์ ๋ ๊ธฐ๋ฅ์ธ ๋ชจ๋ ํ๋๋ ์ด์ (Module Federation)์ ์ฐ๋ฆฌ๊ฐ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋ ์ํคํ ์ฒ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ์์ ํ๋ช ์ ์ผ์ผ์ผฐ์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ณ๋๋ก ์ปดํ์ผ๋๊ณ ๋ฐฐํฌ๋ ์ ํ๋ฆฌ์ผ์ด์ (๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ผ๋ถ)์ด ๋ฐํ์์ ์ฝ๋์ ์์กด์ฑ์ ๊ณต์ ํ ์ ์์ต๋๋ค. ํต์ฌ ๊ฐ๋ ์ ๋น๊ต์ ๊ฐ๋จํ์ง๋ง, ๋ฐํ์ ์์กด์ฑ ํด๊ฒฐ์ ๋ณต์ก์ฑ์ ๋ง์คํฐํ๋ ๊ฒ์ ๊ฒฌ๊ณ ํ๊ณ ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ ์ ์ง๋ณด์ ๊ฐ๋ฅํ ์์คํ ์ ๊ตฌ์ถํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋์์๋ ๋ชจ๋ ํ๋๋ ์ด์ ์ ๋ฐํ์ ์์กด์ฑ ํด๊ฒฐ์ ๋ํด ๊น์ด ํ๊ณ ๋ค์ด ๋ค์ํ ๊ธฐ์ , ๊ณผ์ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ํ๊ตฌํ ๊ฒ์ ๋๋ค.
๋ฐํ์ ์์กด์ฑ ํด๊ฒฐ ์ดํดํ๊ธฐ
์ ํต์ ์ธ JavaScript ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์ข ์ข ๋ชจ๋ ์์กด์ฑ์ ๋จ์ผ ๋ชจ๋๋ฆฌ์ ๋ฒ๋ค๋ก ๋ฌถ๋ ๋ฐ ์์กดํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ชจ๋ ํ๋๋ ์ด์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐํ์์ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ (์๊ฒฉ ๋ชจ๋)์ ๋ชจ๋์ ์๋นํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ ์ด๋ฌํ ์์กด์ฑ์ ๋์ ์ผ๋ก ํด๊ฒฐํ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ์ ํ์์ฑ์ ๋์ ํฉ๋๋ค. ๋ฐํ์ ์์กด์ฑ ํด๊ฒฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์ค ๋ชจ๋์ด ์์ฒญ๋ ๋ ํ์ํ ์์กด์ฑ์ ์๋ณ, ์์น ์ง์ ๋ฐ ๋ก๋ํ๋ ํ๋ก์ธ์ค์ ๋๋ค.
ProductCatalog์ ShoppingCart๋ผ๋ ๋ ๊ฐ์ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๊ฐ ์๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ด ์๋ค. ProductCatalog๋ ProductCard๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ ธ์ถํ ์ ์์ผ๋ฉฐ, ShoppingCart๋ ์ด ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ฅ๋ฐ๊ตฌ๋์ ํญ๋ชฉ์ ํ์ํ๊ณ ์ ํฉ๋๋ค. ๋ชจ๋ ํ๋๋ ์ด์ ์ ์ฌ์ฉํ๋ฉด ShoppingCart๋ ๋ฐํ์์ ProductCatalog์์ ProductCard ์ปดํฌ๋ํธ๋ฅผ ๋์ ์ผ๋ก ๋ก๋ํ ์ ์์ต๋๋ค. ๋ฐํ์ ์์กด์ฑ ํด๊ฒฐ ๋ฉ์ปค๋์ฆ์ ProductCard์ ํ์ํ ๋ชจ๋ ์์กด์ฑ(์: UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์ ํธ๋ฆฌํฐ ํจ์)๋ ์ฌ๋ฐ๋ฅด๊ฒ ๋ก๋๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
ํต์ฌ ๊ฐ๋ ๋ฐ ๊ตฌ์ฑ ์์
๊ธฐ์ ์ ๋ํด ์์๋ณด๊ธฐ ์ ์ ๋ช ๊ฐ์ง ํต์ฌ ๊ฐ๋ ์ ์ ์ํด ๋ณด๊ฒ ์ต๋๋ค:
- ํธ์คํธ(Host): ์๊ฒฉ ๋ชจ๋์ ์๋นํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ค. ์ฐ๋ฆฌ ์์ ์์ ShoppingCart๊ฐ ํธ์คํธ์ ๋๋ค.
- ์๊ฒฉ(Remote): ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋นํ ์ ์๋๋ก ๋ชจ๋์ ๋ ธ์ถํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ค. ์ฐ๋ฆฌ ์์ ์์ ProductCatalog๊ฐ ์๊ฒฉ์ ๋๋ค.
- ๊ณต์ ์ค์ฝํ(Shared Scope): ํธ์คํธ์ ์๊ฒฉ ๊ฐ์ ์์กด์ฑ์ ๊ณต์ ํ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ์ด๋ฅผ ํตํด ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋์ผํ ๋ฒ์ ์ ์์กด์ฑ์ ์ฌ์ฉํ์ฌ ์ถฉ๋์ ๋ฐฉ์งํฉ๋๋ค.
- ์๊ฒฉ ์ํธ๋ฆฌ(Remote Entry): ์๊ฒฉ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋นํ ์ ์๋ ๋ชจ๋ ๋ชฉ๋ก์ ๋ ธ์ถํ๋ ํ์ผ(์ผ๋ฐ์ ์ผ๋ก JavaScript ํ์ผ)์ ๋๋ค.
- Webpack์ `ModuleFederationPlugin`: ๋ชจ๋ ํ๋๋ ์ด์ ์ ํ์ฑํํ๋ ํต์ฌ ํ๋ฌ๊ทธ์ธ์ ๋๋ค. ํธ์คํธ ๋ฐ ์๊ฒฉ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๊ณ , ๊ณต์ ์ค์ฝํ๋ฅผ ์ ์ํ๋ฉฐ, ์๊ฒฉ ๋ชจ๋ ๋ก๋๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
๋ฐํ์ ์์กด์ฑ ํด๊ฒฐ์ ์ํ ๊ธฐ์
๋ชจ๋ ํ๋๋ ์ด์ ์์ ๋ฐํ์ ์์กด์ฑ ํด๊ฒฐ์ ์ํด ์ฌ๋ฌ ๊ธฐ์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ธฐ์ ์ ํ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ์๊ตฌ ์ฌํญ๊ณผ ์์กด์ฑ์ ๋ณต์ก์ฑ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
1. ์์์ ์์กด์ฑ ๊ณต์
๊ฐ์ฅ ๊ฐ๋จํ ์ ๊ทผ ๋ฐฉ์์ `ModuleFederationPlugin` ๊ตฌ์ฑ์ `shared` ์ต์ ์ ์์กดํ๋ ๊ฒ์ ๋๋ค. ์ด ์ต์ ์ ์ฌ์ฉํ๋ฉด ํธ์คํธ์ ์๊ฒฉ ๊ฐ์ ๊ณต์ ๋์ด์ผ ํ๋ ์์กด์ฑ ๋ชฉ๋ก์ ์ง์ ํ ์ ์์ต๋๋ค. Webpack์ ์ด๋ฌํ ๊ณต์ ์์กด์ฑ์ ๋ฒ์ ๊ด๋ฆฌ ๋ฐ ๋ก๋ฉ์ ์๋์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค.
์์:
ProductCatalog(์๊ฒฉ)์ ShoppingCart(ํธ์คํธ) ๋ชจ๋์์ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์ฑ์ ๊ฐ์ง ์ ์์ต๋๋ค:
new ModuleFederationPlugin({
// ... ๋ค๋ฅธ ๊ตฌ์ฑ
shared: {
react: { singleton: true, eager: true, requiredVersion: '^17.0.0' },
'react-dom': { singleton: true, eager: true, requiredVersion: '^17.0.0' },
// ... ๋ค๋ฅธ ๊ณต์ ์์กด์ฑ
},
})
์ด ์์์์ `react`์ `react-dom`์ ๊ณต์ ์์กด์ฑ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. `singleton: true` ์ต์ ์ ๊ฐ ์์กด์ฑ์ ์ธ์คํด์ค๊ฐ ํ๋๋ง ๋ก๋๋๋๋ก ๋ณด์ฅํ์ฌ ์ถฉ๋์ ๋ฐฉ์งํฉ๋๋ค. `eager: true` ์ต์ ์ ์์กด์ฑ์ ๋ฏธ๋ฆฌ ๋ก๋ํ์ฌ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. `requiredVersion` ์ต์ ์ ํ์ํ ์์กด์ฑ์ ์ต์ ๋ฒ์ ์ ์ง์ ํฉ๋๋ค.
์ฅ์ :
- ๊ตฌํ์ด ๊ฐ๋จํฉ๋๋ค.
- Webpack์ด ๋ฒ์ ๊ด๋ฆฌ ๋ฐ ๋ก๋ฉ์ ์๋์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
๋จ์ :
- ๋ชจ๋ ์๊ฒฉ์ด ๋์ผํ ์์กด์ฑ์ ํ์๋ก ํ์ง ์๋ ๊ฒฝ์ฐ ๋ถํ์ํ ์์กด์ฑ ๋ก๋ฉ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ํธํ๋๋ ๋ฒ์ ์ ๊ณต์ ์์กด์ฑ์ ์ฌ์ฉํ๋๋ก ์ ์คํ ๊ณํ๊ณผ ์กฐ์จ์ด ํ์ํฉ๋๋ค.
2. `import()`๋ฅผ ์ฌ์ฉํ ๋ช ์์ ์์กด์ฑ ๋ก๋ฉ
์์กด์ฑ ๋ก๋ฉ์ ๋ ์ธ๋ฐํ๊ฒ ์ ์ดํ๋ ค๋ฉด `import()` ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์๊ฒฉ ๋ชจ๋์ ๋์ ์ผ๋ก ๋ก๋ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ค์ ๋ก ํ์ํ ๋๋ง ์์กด์ฑ์ ๋ก๋ํ ์ ์์ต๋๋ค.
์์:
ShoppingCart(ํธ์คํธ)์์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค:
async function loadProductCard() {
try {
const ProductCard = await import('ProductCatalog/ProductCard');
// ProductCard ์ปดํฌ๋ํธ ์ฌ์ฉ
return ProductCard;
} catch (error) {
console.error('Failed to load ProductCard', error);
// ์ค๋ฅ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ
return null;
}
}
loadProductCard();
์ด ์ฝ๋๋ `import('ProductCatalog/ProductCard')`๋ฅผ ์ฌ์ฉํ์ฌ ProductCatalog ์๊ฒฉ์์ ProductCard ์ปดํฌ๋ํธ๋ฅผ ๋ก๋ํฉ๋๋ค. `await` ํค์๋๋ ์ปดํฌ๋ํธ๊ฐ ์ฌ์ฉ๋๊ธฐ ์ ์ ๋ก๋๋๋๋ก ๋ณด์ฅํฉ๋๋ค. `try...catch` ๋ธ๋ก์ ๋ก๋ฉ ๊ณผ์ ์์ ๋ฐ์ํ ์ ์๋ ์ ์ฌ์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
์ฅ์ :
- ์์กด์ฑ ๋ก๋ฉ์ ๋ํ ๋ ๋ง์ ์ ์ด๊ถ์ ๊ฐ์ง๋๋ค.
- ๋ฏธ๋ฆฌ ๋ก๋๋๋ ์ฝ๋์ ์์ ์ค์ ๋๋ค.
- ์์กด์ฑ์ ์ง์ฐ ๋ก๋ฉ(lazy loading)์ ํ์ฉํฉ๋๋ค.
๋จ์ :
- ๊ตฌํ์ ๋ ๋ง์ ์ฝ๋๊ฐ ํ์ํฉ๋๋ค.
- ์์กด์ฑ์ด ๋๋ฌด ๋ฆ๊ฒ ๋ก๋๋๋ฉด ์ง์ฐ ์๊ฐ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ์คํ ์ค๋ฅ ์ฒ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
3. ๋ฒ์ ๊ด๋ฆฌ ๋ฐ ์ ์์ ๋ฒ์ ๊ด๋ฆฌ(SemVer)
๋ฐํ์ ์์กด์ฑ ํด๊ฒฐ์ ์ค์ํ ์ธก๋ฉด์ ๊ณต์ ์์กด์ฑ์ ๋ค๋ฅธ ๋ฒ์ ์ ๊ด๋ฆฌํ๋ ๊ฒ์ ๋๋ค. ์ ์์ ๋ฒ์ ๊ด๋ฆฌ(SemVer)๋ ์์กด์ฑ์ ๋ค๋ฅธ ๋ฒ์ ๊ฐ์ ํธํ์ฑ์ ์ง์ ํ๋ ํ์คํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
`ModuleFederationPlugin`์ `shared` ๊ตฌ์ฑ์์ SemVer ๋ฒ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฉ ๊ฐ๋ฅํ ์์กด์ฑ ๋ฒ์ ์ ์ง์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, `requiredVersion: '^17.0.0'`๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด 17.0.0 ์ด์์ด๋ฉด์ 18.0.0 ๋ฏธ๋ง์ธ React ๋ฒ์ ์ ํ์๋ก ํจ์ ์ง์ ํฉ๋๋ค.
Webpack์ ๋ชจ๋ ํ๋๋ ์ด์ ํ๋ฌ๊ทธ์ธ์ ํธ์คํธ์ ์๊ฒฉ์ ์ง์ ๋ SemVer ๋ฒ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ์ ํ ๋ฒ์ ์ ์์กด์ฑ์ ์๋์ผ๋ก ํด๊ฒฐํฉ๋๋ค. ํธํ ๊ฐ๋ฅํ ๋ฒ์ ์ ์ฐพ์ ์ ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก:
- SemVer ๋ฒ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฉ ๊ฐ๋ฅํ ์์กด์ฑ ๋ฒ์ ์ ์ง์ ํ์ญ์์ค.
- ๋ฒ๊ทธ ์์ ๋ฐ ์ฑ๋ฅ ํฅ์์ ์ด์ ์ ์ป์ผ๋ ค๋ฉด ์์กด์ฑ์ ์ต์ ์ํ๋ก ์ ์งํ์ญ์์ค.
- ์์กด์ฑ์ ์ ๊ทธ๋ ์ด๋ํ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒ ์ ํ ํ ์คํธํ์ญ์์ค.
- ์์กด์ฑ ๊ด๋ฆฌ๋ฅผ ๋๊ธฐ ์ํด npm-check-updates์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
4. ๋น๋๊ธฐ ์์กด์ฑ ์ฒ๋ฆฌ
์ผ๋ถ ์์กด์ฑ์ ๋น๋๊ธฐ์ ์ผ ์ ์์ผ๋ฉฐ, ์ด๋ ๋ก๋ ๋ฐ ์ด๊ธฐํ์ ์ถ๊ฐ ์๊ฐ์ด ํ์ํจ์ ์๋ฏธํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์์กด์ฑ์ ์๊ฒฉ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ๋ณต์กํ ๊ณ์ฐ์ ์ํํด์ผ ํ ์ ์์ต๋๋ค.
๋น๋๊ธฐ ์์กด์ฑ์ ๋ค๋ฃฐ ๋๋ ์์กด์ฑ์ด ์ฌ์ฉ๋๊ธฐ ์ ์ ์์ ํ ์ด๊ธฐํ๋์๋์ง ํ์ธํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. `async/await` ๋๋ Promise๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ๋ก๋ฉ ๋ฐ ์ด๊ธฐํ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์์:
async function initializeDependency() {
try {
const dependency = await import('my-async-dependency');
await dependency.initialize(); // ์์กด์ฑ์ initialize() ๋ฉ์๋๊ฐ ์๋ค๊ณ ๊ฐ์
return dependency;
} catch (error) {
console.error('Failed to initialize dependency', error);
// ์ค๋ฅ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ
return null;
}
}
async function useDependency() {
const myDependency = await initializeDependency();
if (myDependency) {
// ์์กด์ฑ ์ฌ์ฉ
myDependency.doSomething();
}
}
useDependency();
์ด ์ฝ๋๋ ๋จผ์ `import()`๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์์กด์ฑ์ ๋ก๋ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์์กด์ฑ์ `initialize()` ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์์ ํ ์ด๊ธฐํ๋์๋์ง ํ์ธํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก ์์กด์ฑ์ ์ฌ์ฉํ์ฌ ์ผ๋ถ ์์ ์ ์ํํฉ๋๋ค.
5. ๊ณ ๊ธ ์๋๋ฆฌ์ค: ์์กด์ฑ ๋ฒ์ ๋ถ์ผ์น ๋ฐ ํด๊ฒฐ ์ ๋ต
๋ณต์กํ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋ ์ํคํ ์ฒ์์๋ ๋ค๋ฅธ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๊ฐ ๋์ผํ ์์กด์ฑ์ ๋ค๋ฅธ ๋ฒ์ ์ ์๊ตฌํ๋ ์๋๋ฆฌ์ค๊ฐ ํํ ๋ฐ์ํฉ๋๋ค. ์ด๋ ์์กด์ฑ ์ถฉ๋ ๋ฐ ๋ฐํ์ ์ค๋ฅ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ๋ฌ ์ ๋ต์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
- ๋ฒ์ ๊ด๋ฆฌ ๋ณ์นญ(Versioning Aliases): Webpack ๊ตฌ์ฑ์์ ๋ณ์นญ์ ๋ง๋ค์ด ๋ค๋ฅธ ๋ฒ์ ์๊ตฌ ์ฌํญ์ ๋จ์ผ ํธํ ๋ฒ์ ์ผ๋ก ๋งคํํฉ๋๋ค. ์ด๋ ํธํ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ ์คํ ํ ์คํธ๊ฐ ํ์ํฉ๋๋ค.
- ์๋ DOM(Shadow DOM): ๊ฐ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๋ฅผ ์๋ DOM ๋ด์ ์บก์ํํ์ฌ ์์กด์ฑ์ ๊ฒฉ๋ฆฌํฉ๋๋ค. ์ด๋ ์ถฉ๋์ ๋ฐฉ์งํ์ง๋ง ํต์ ๋ฐ ์คํ์ผ๋ง์ ๋ณต์ก์ฑ์ ์ด๋ํ ์ ์์ต๋๋ค.
- ์์กด์ฑ ๊ฒฉ๋ฆฌ(Dependency Isolation): ์ปจํ ์คํธ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ฒ์ ์ ์์กด์ฑ์ ๋ก๋ํ๋ ์ฌ์ฉ์ ์ง์ ์์กด์ฑ ํด๊ฒฐ ๋ก์ง์ ๊ตฌํํฉ๋๋ค. ์ด๋ ๊ฐ์ฅ ๋ณต์กํ ์ ๊ทผ ๋ฐฉ์์ด์ง๋ง ๊ฐ์ฅ ํฐ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค.
์์: ๋ฒ์ ๊ด๋ฆฌ ๋ณ์นญ
๋ง์ดํฌ๋กํ๋ก ํธ์๋ A๋ React ๋ฒ์ 16์, ๋ง์ดํฌ๋กํ๋ก ํธ์๋ B๋ React ๋ฒ์ 17์ ํ์๋ก ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๋ง์ดํฌ๋กํ๋ก ํธ์๋ A์ ๋ํ ๊ฐ์ํ๋ webpack ๊ตฌ์ฑ์ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค:
resolve: {
alias: {
'react': path.resolve(__dirname, 'node_modules/react-16') // React 16์ด ์ด ํ๋ก์ ํธ์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค๊ณ ๊ฐ์
}
}
๋ง์ฐฌ๊ฐ์ง๋ก ๋ง์ดํฌ๋กํ๋ก ํธ์๋ B์ ๊ฒฝ์ฐ:
resolve: {
alias: {
'react': path.resolve(__dirname, 'node_modules/react-17') // React 17์ด ์ด ํ๋ก์ ํธ์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค๊ณ ๊ฐ์
}
}
๋ฒ์ ๊ด๋ฆฌ ๋ณ์นญ์ ๋ํ ์ค์ ๊ณ ๋ ค ์ฌํญ: ์ด ์ ๊ทผ ๋ฐฉ์์ ์๊ฒฉํ ํ ์คํธ๋ฅผ ์๊ตฌํฉ๋๋ค. ๋ค๋ฅธ ๋ง์ดํฌ๋กํ๋ก ํธ์๋์ ์ปดํฌ๋ํธ๋ค์ด ์ฝ๊ฐ ๋ค๋ฅธ ๋ฒ์ ์ ๊ณต์ ์์กด์ฑ์ ์ฌ์ฉํ๋๋ผ๋ ํจ๊ป ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํด์ผ ํฉ๋๋ค.
๋ชจ๋ ํ๋๋ ์ด์ ์์กด์ฑ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
๋ชจ๋ ํ๋๋ ์ด์ ํ๊ฒฝ์์ ์์กด์ฑ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๊ณต์ ์์กด์ฑ ์ต์ํ: ์ ๋์ ์ผ๋ก ํ์ํ ์์กด์ฑ๋ง ๊ณต์ ํ์ญ์์ค. ๋๋ฌด ๋ง์ ์์กด์ฑ์ ๊ณต์ ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ๊ณ ์ ์ง ๊ด๋ฆฌ๊ฐ ๋ ์ด๋ ค์์ง ์ ์์ต๋๋ค.
- ์ ์์ ๋ฒ์ ๊ด๋ฆฌ ์ฌ์ฉ: SemVer๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฉ ๊ฐ๋ฅํ ์์กด์ฑ ๋ฒ์ ์ ์ง์ ํ์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค๋ฅธ ๋ฒ์ ์ ์์กด์ฑ๊ณผ ํธํ๋๋๋ก ๋ณด์ฅํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ์์กด์ฑ ์ต์ ์ํ ์ ์ง: ๋ฒ๊ทธ ์์ ๋ฐ ์ฑ๋ฅ ํฅ์์ ์ด์ ์ ์ป์ผ๋ ค๋ฉด ์์กด์ฑ์ ์ต์ ์ํ๋ก ์ ์งํ์ญ์์ค.
- ์ฒ ์ ํ ํ ์คํธ: ์์กด์ฑ์ ๋ณ๊ฒฝํ ํ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒ ์ ํ ํ ์คํธํ์ญ์์ค.
- ์์กด์ฑ ๋ชจ๋ํฐ๋ง: ๋ณด์ ์ทจ์ฝ์ ๋ฐ ์ฑ๋ฅ ๋ฌธ์ ์ ๋ํด ์์กด์ฑ์ ๋ชจ๋ํฐ๋งํ์ญ์์ค. Snyk ๋ฐ Dependabot๊ณผ ๊ฐ์ ๋๊ตฌ๊ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ๋ช ํํ ์์ ๊ถ ์ค์ : ๊ณต์ ์์กด์ฑ์ ๋ํ ๋ช ํํ ์์ ๊ถ์ ์ ์ํ์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด ์์กด์ฑ์ด ์ ์ ํ๊ฒ ์ ์ง ๊ด๋ฆฌ๋๊ณ ์ ๋ฐ์ดํธ๋๋๋ก ๋ณด์ฅํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ์ค์ ์ง์ค์ ์์กด์ฑ ๊ด๋ฆฌ: ๋ชจ๋ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋์ ๊ฑธ์ณ ์์กด์ฑ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ค์ ์ง์ค์ ์์กด์ฑ ๊ด๋ฆฌ ์์คํ ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ์ด๋ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ณ ์ถฉ๋์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ๋น๊ณต๊ฐ npm ๋ ์ง์คํธ๋ฆฌ๋ ์ฌ์ฉ์ ์ง์ ์์กด์ฑ ๊ด๋ฆฌ ์์คํ ๊ณผ ๊ฐ์ ๋๊ตฌ๊ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
- ๋ชจ๋ ๊ฒ ๋ฌธ์ํ: ๋ชจ๋ ๊ณต์ ์์กด์ฑ๊ณผ ๊ทธ ๋ฒ์ ์ ๋ช ํํ๊ฒ ๋ฌธ์ํํ์ญ์์ค. ์ด๋ ๊ฐ๋ฐ์๊ฐ ์์กด์ฑ์ ์ดํดํ๊ณ ์ถฉ๋์ ํผํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
๋๋ฒ๊น ๋ฐ ๋ฌธ์ ํด๊ฒฐ
๋ฐํ์ ์์กด์ฑ ํด๊ฒฐ ๋ฌธ์ ๋ ๋๋ฒ๊น ํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ฝ์ ํ์ธ: ๋ธ๋ผ์ฐ์ ์ฝ์์์ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ฐพ์ผ์ญ์์ค. ์ด๋ฌํ ๋ฉ์์ง๋ ๋ฌธ์ ์ ์์ธ์ ๋ํ ๋จ์๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
- Webpack์ Devtool ์ฌ์ฉ: Webpack์ devtool ์ต์ ์ ์ฌ์ฉํ์ฌ ์์ค ๋งต์ ์์ฑํ์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ๋๋ฒ๊น ํ ์ ์์ต๋๋ค.
- ๋คํธ์ํฌ ํธ๋ํฝ ๊ฒ์ฌ: ๋ธ๋ผ์ฐ์ ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋คํธ์ํฌ ํธ๋ํฝ์ ๊ฒ์ฌํ์ญ์์ค. ์ด๋ฅผ ํตํด ์ด๋ค ์์กด์ฑ์ด ์ธ์ ๋ก๋๋๋์ง ํ์ธํ ์ ์์ต๋๋ค.
- ๋ชจ๋ ํ๋๋ ์ด์ ์๊ฐํ ๋๊ตฌ ์ฌ์ฉ: ๋ชจ๋ ํ๋๋ ์ด์ ์๊ฐํ ๋๊ตฌ์ ๊ฐ์ ๋๊ตฌ๋ ์์กด์ฑ ๊ทธ๋ํ๋ฅผ ์๊ฐํํ๊ณ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ๊ตฌ์ฑ ๋จ์ํ: ๋ฌธ์ ๋ฅผ ๊ฒฉ๋ฆฌํ๊ธฐ ์ํด ๋ชจ๋ ํ๋๋ ์ด์ ๊ตฌ์ฑ์ ๋จ์ํํด ๋ณด์ญ์์ค.
- ๋ฒ์ ํ์ธ: ํธ์คํธ์ ์๊ฒฉ ๊ฐ์ ๊ณต์ ์์กด์ฑ์ ๋ฒ์ ์ด ํธํ๋๋์ง ํ์ธํ์ญ์์ค.
- ์บ์ ์ง์ฐ๊ธฐ: ๋ธ๋ผ์ฐ์ ์บ์๋ฅผ ์ง์ฐ๊ณ ๋ค์ ์๋ํ์ญ์์ค. ๋๋๋ก ์บ์๋ ๋ฒ์ ์ ์์กด์ฑ์ด ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค.
- ๋ฌธ์ ์ฐธ์กฐ: ๋ชจ๋ ํ๋๋ ์ด์ ์ ๋ํ ์์ธํ ์ ๋ณด๋ Webpack ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
- ์ปค๋ฎค๋ํฐ ์ง์: ์ง์์ ์ํด ์จ๋ผ์ธ ๋ฆฌ์์ค ๋ฐ ์ปค๋ฎค๋ํฐ ํฌ๋ผ์ ํ์ฉํ์ญ์์ค. Stack Overflow ๋ฐ GitHub๊ณผ ๊ฐ์ ํ๋ซํผ์ ๊ท์คํ ๋ฌธ์ ํด๊ฒฐ ์ง์นจ์ ์ ๊ณตํฉ๋๋ค.
์ค์ ์ฌ๋ก ๋ฐ ์ผ์ด์ค ์คํฐ๋
๋ช๋ช ๋๊ธฐ์ ์ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋ ์ํคํ ์ฒ ๊ตฌ์ถ์ ๋ชจ๋ ํ๋๋ ์ด์ ์ ์ฑ๊ณต์ ์ผ๋ก ์ฑํํ์ต๋๋ค. ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Spotify: ์น ํ๋ ์ด์ด ๋ฐ ๋ฐ์คํฌํฑ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํด ๋ชจ๋ ํ๋๋ ์ด์ ์ ์ฌ์ฉํฉ๋๋ค.
- Netflix: ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํด ๋ชจ๋ ํ๋๋ ์ด์ ์ ์ฌ์ฉํฉ๋๋ค.
- IKEA: ์ ์ ์๊ฑฐ๋ ํ๋ซํผ์ ๊ตฌ์ถํ๊ธฐ ์ํด ๋ชจ๋ ํ๋๋ ์ด์ ์ ์ฌ์ฉํฉ๋๋ค.
์ด ํ์ฌ๋ค์ ๋ชจ๋ ํ๋๋ ์ด์ ์ฌ์ฉ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์๋นํ ์ด์ ์ ๋ณด๊ณ ํ์ต๋๋ค:
- ๊ฐ๋ฐ ์๋ ํฅ์.
- ํ์ฅ์ฑ ์ฆ๊ฐ.
- ๋ณต์ก์ฑ ๊ฐ์.
- ์ ์ง๋ณด์์ฑ ํฅ์.
์๋ฅผ ๋ค์ด, ์ฌ๋ฌ ์ง์ญ์์ ์ ํ์ ํ๋งคํ๋ ๊ธ๋ก๋ฒ ์ ์ ์๊ฑฐ๋ ํ์ฌ๋ฅผ ์๊ฐํด ๋ด ์๋ค. ๊ฐ ์ง์ญ์ ํ์ง ์ธ์ด์ ํตํ๋ก ์ ํ์ ํ์ํ๋ ์์ฒด ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ๋ชจ๋ ํ๋๋ ์ด์ ์ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๊ฐ ๊ณตํต ์ปดํฌ๋ํธ์ ์์กด์ฑ์ ๊ณต์ ํ๋ฉด์๋ ๋ ๋ฆฝ์ฑ๊ณผ ์์จ์ฑ์ ์ ์งํ ์ ์์ต๋๋ค. ์ด๋ ๊ฐ๋ฐ ์๊ฐ์ ํฌ๊ฒ ๋จ์ถํ๊ณ ์ ๋ฐ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๋ชจ๋ ํ๋๋ ์ด์ ์ ๋ฏธ๋
๋ชจ๋ ํ๋๋ ์ด์ ์ ๋น ๋ฅด๊ฒ ๋ฐ์ ํ๋ ๊ธฐ์ ์ ๋๋ค. ํฅํ ๊ฐ๋ฐ์๋ ๋ค์์ด ํฌํจ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค:
- ์๋ฒ ์ธก ๋ ๋๋ง ์ง์ ํฅ์.
- ๋ ๊ณ ๊ธ ์์กด์ฑ ๊ด๋ฆฌ ๊ธฐ๋ฅ.
- ๋ค๋ฅธ ๋น๋ ๋๊ตฌ์์ ๋ ๋์ ํตํฉ.
- ๊ฐํ๋ ๋ณด์ ๊ธฐ๋ฅ.
๋ชจ๋ ํ๋๋ ์ด์ ์ด ์ฑ์ํจ์ ๋ฐ๋ผ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋ ์ํคํ ์ฒ ๊ตฌ์ถ์ ๋์ฑ ์ธ๊ธฐ ์๋ ์ ํ์ด ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
๊ฒฐ๋ก
๋ฐํ์ ์์กด์ฑ ํด๊ฒฐ์ ๋ชจ๋ ํ๋๋ ์ด์ ์ ์ค์ํ ์ธก๋ฉด์ ๋๋ค. ๋ค์ํ ๊ธฐ์ ๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํดํจ์ผ๋ก์จ ๊ฒฌ๊ณ ํ๊ณ ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ ์ ์ง๋ณด์ ๊ฐ๋ฅํ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋ ์ํคํ ์ฒ๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์ด๊ธฐ ์ค์ ์๋ ํ์ต ๊ณก์ ์ด ํ์ํ ์ ์์ง๋ง, ๊ฐ๋ฐ ์๋ ํฅ์ ๋ฐ ๋ณต์ก์ฑ ๊ฐ์์ ๊ฐ์ ๋ชจ๋ ํ๋๋ ์ด์ ์ ์ฅ๊ธฐ์ ์ธ ์ด์ ์ ํฌ์ํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ๋ชจ๋ ํ๋๋ ์ด์ ์ ๋์ ์ธ ํน์ฑ์ ๋ฐ์๋ค์ด๊ณ ์งํํ๋ ๊ธฐ๋ฅ์ ๊ณ์ ํ์ํ์ญ์์ค. ์ฆ๊ฑฐ์ด ์ฝ๋ฉ ๋์ธ์!