๋ ๊ฑฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ต์ ๋ชจ๋ ์์คํ (ESM, CommonJS, AMD, UMD)์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๊ธฐ ์ํ ์ข ํฉ ๊ฐ์ด๋์ ๋๋ค. ์ํํ ์ ํ์ ์ํ ์ ๋ต, ๋๊ตฌ, ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๋ง์ด๊ทธ๋ ์ด์ : ๋ ๊ฑฐ์ ์ฝ๋๋ฒ ์ด์ค ํ๋ํ
๋์์์ด ์งํํ๋ ์น ๊ฐ๋ฐ ์ธ๊ณ์์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ต์ ์ํ๋ก ์ ์งํ๋ ๊ฒ์ ์ฑ๋ฅ, ์ ์ง๋ณด์์ฑ, ๋ณด์์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๊ฐ์ฅ ์ค์ํ ํ๋ํ ์์ ์ค ํ๋๋ ๋ ๊ฑฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ต์ ๋ชจ๋ ์์คํ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๊ฒ์ ๋๋ค. ์ด ๊ธ์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ํ ์ข ํฉ์ ์ธ ๊ฐ์ด๋๋ก, ์ํํ๊ณ ์ฑ๊ณต์ ์ธ ์ ํ์ ์ํ ์ด๋ก ์ ๊ทผ๊ฑฐ, ์ ๋ต, ๋๊ตฌ, ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.
์ ๋ชจ๋๋ก ๋ง์ด๊ทธ๋ ์ด์ ํด์ผ ํ๋๊ฐ?
"์ด๋ป๊ฒ"๋ฅผ ์์๋ณด๊ธฐ ์ ์ "์"๋ฅผ ์ดํดํด ๋ด ์๋ค. ๋ ๊ฑฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ ์ข ์ข ์ ์ญ ์ค์ฝํ ์ค์ผ, ์๋ ์์กด์ฑ ๊ด๋ฆฌ, ๋ณต์กํ ๋ก๋ฉ ๋ฉ์ปค๋์ฆ์ ์์กดํฉ๋๋ค. ์ด๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฌธ์ ๋ก ์ด์ด์ง ์ ์์ต๋๋ค:
- ๋ค์์คํ์ด์ค ์ถฉ๋: ์ ์ญ ๋ณ์๋ ์ฝ๊ฒ ์ถฉ๋ํ์ฌ ์์์น ๋ชปํ ๋์๊ณผ ๋๋ฒ๊น ํ๊ธฐ ์ด๋ ค์ด ์ค๋ฅ๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค.
- ์์กด์ฑ ์ง์ฅ: ์ฝ๋๋ฒ ์ด์ค๊ฐ ์ปค์ง์ ๋ฐ๋ผ ์์กด์ฑ์ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ ์ ์ ๋ ๋ณต์กํด์ง๋๋ค. ๋ฌด์์ด ๋ฌด์์ ์์กดํ๋์ง ์ถ์ ํ๊ธฐ ์ด๋ ค์ ์ํ ์์กด์ฑ๊ณผ ๋ก๋ฉ ์์ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํฉ๋๋ค.
- ๋ถ์คํ ์ฝ๋ ๊ตฌ์ฑ: ๋ชจ๋ ๊ตฌ์กฐ๊ฐ ์์ผ๋ฉด ์ฝ๋๊ฐ ๊ฑฐ๋ํด์ง๊ณ ์ดํด, ์ ์ง๋ณด์, ํ ์คํธ๊ฐ ์ด๋ ค์์ง๋๋ค.
- ์ฑ๋ฅ ๋ฌธ์ : ๋ถํ์ํ ์ฝ๋๋ฅผ ๋ฏธ๋ฆฌ ๋ก๋ํ๋ฉด ํ์ด์ง ๋ก๋ ์๊ฐ์ ์๋นํ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
- ๋ณด์ ์ทจ์ฝ์ : ์ค๋๋ ์์กด์ฑ๊ณผ ์ ์ญ ์ค์ฝํ์ ์ทจ์ฝ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์ ์ํ์ ๋ ธ์ถ์ํฌ ์ ์์ต๋๋ค.
์ต์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ์์คํ ์ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค:
- ์บก์ํ: ๋ชจ๋์ ๊ฒฉ๋ฆฌ๋ ์ค์ฝํ๋ฅผ ์์ฑํ์ฌ ๋ค์์คํ์ด์ค ์ถฉ๋์ ๋ฐฉ์งํฉ๋๋ค.
- ๋ช ์์ ์์กด์ฑ: ๋ชจ๋์ ์์กด์ฑ์ ๋ช ํํ๊ฒ ์ ์ํ์ฌ ์ดํดํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
- ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ: ๋ชจ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์์ ๊ธฐ๋ฅ์ ๊ฐ์ ธ์ค๊ณ ๋ด๋ณด๋ผ ์ ์๊ฒ ํ์ฌ ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ์ ์ด์งํฉ๋๋ค.
- ์ฑ๋ฅ ํฅ์: ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ ์ฌ์ฉํ์ง ์๋ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๊ณ , ํ์ผ์ ์์ถํ๋ฉฐ, ์ฝ๋๋ฅผ ์์ ๋ฉ์ด๋ฆฌ๋ก ๋ถํ ํ์ฌ ํ์ํ ๋ ๋ก๋ํจ์ผ๋ก์จ ์ฝ๋๋ฅผ ์ต์ ํํ ์ ์์ต๋๋ค.
- ๋ณด์ ๊ฐํ: ์ ์ ์๋ ๋ชจ๋ ์์คํ ๋ด์์ ์์กด์ฑ์ ์ ๊ทธ๋ ์ด๋ํ๊ธฐ๊ฐ ๋ ์ฌ์์ ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์์ด ๊ฐํ๋ฉ๋๋ค.
์ฃผ์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ์์คํ
์๋ ์ ๊ฑธ์ณ ์ฌ๋ฌ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ์์คํ ์ด ๋ฑ์ฅํ์ต๋๋ค. ๋ง์ด๊ทธ๋ ์ด์ ์ ์ํด ์ฌ๋ฐ๋ฅธ ์์คํ ์ ์ ํํ๋ ค๋ฉด ๊ทธ ์ฐจ์ด์ ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- ES ๋ชจ๋(ESM): ๊ณต์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ค ๋ชจ๋ ์์คํ
์ผ๋ก, ์ต์ ๋ธ๋ผ์ฐ์ ์ Node.js์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์๋ฉ๋๋ค.
import
์export
๊ตฌ๋ฌธ์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ์๋ก์ด ํ๋ก์ ํธ์ ๊ธฐ์กด ํ๋ก์ ํธ ํ๋ํ์ ์ผ๋ฐ์ ์ผ๋ก ์ ํธ๋๋ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. - CommonJS: ์ฃผ๋ก Node.js ํ๊ฒฝ์์ ์ฌ์ฉ๋ฉ๋๋ค.
require()
์module.exports
๊ตฌ๋ฌธ์ ์ฌ์ฉํฉ๋๋ค. ์ค๋๋ Node.js ํ๋ก์ ํธ์์ ํํ ๋ณผ ์ ์์ต๋๋ค. - ๋น๋๊ธฐ ๋ชจ๋ ์ ์(AMD): ๋น๋๊ธฐ ๋ก๋ฉ์ ์ํด ์ค๊ณ๋์์ผ๋ฉฐ, ์ฃผ๋ก ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ์ฌ์ฉ๋ฉ๋๋ค.
define()
๊ตฌ๋ฌธ์ ์ฌ์ฉํฉ๋๋ค. RequireJS์ ์ํด ๋์คํ๋์์ต๋๋ค. - ๋ฒ์ฉ ๋ชจ๋ ์ ์(UMD): ์ฌ๋ฌ ๋ชจ๋ ์์คํ (ESM, CommonJS, AMD, ์ ์ญ ์ค์ฝํ)๊ณผ ํธํ๋๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ ํจํด์ ๋๋ค. ๋ค์ํ ํ๊ฒฝ์์ ์คํ๋์ด์ผ ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์ฉํ ์ ์์ต๋๋ค.
๊ถ์ฅ ์ฌํญ: ๋๋ถ๋ถ์ ์ต์ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ์์๋ ํ์คํ, ๊ธฐ๋ณธ ๋ธ๋ผ์ฐ์ ์ง์, ์ ์ ๋ถ์ ๋ฐ ํธ๋ฆฌ ์์ดํน(tree shaking)๊ณผ ๊ฐ์ ์ฐ์ํ ๊ธฐ๋ฅ ๋๋ฌธ์ ES ๋ชจ๋(ESM)์ด ๊ถ์ฅ๋๋ ์ ํ์ ๋๋ค.
๋ชจ๋ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ต
๋๊ท๋ชจ ๋ ๊ฑฐ์ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ชจ๋๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๊ฒ์ ์ด๋ ค์ด ์์ ์ผ ์ ์์ต๋๋ค. ํจ๊ณผ์ ์ธ ์ ๋ต์ ๋ค์๊ณผ ๊ฐ์ด ๋ถ์ํฉ๋๋ค:
1. ํ๊ฐ ๋ฐ ๊ณํ
์ฝ๋ฉ์ ์์ํ๊ธฐ ์ ์ ์๊ฐ์ ๋ด์ด ํ์ฌ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ํ๊ฐํ๊ณ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ต์ ๊ณํํ์ธ์. ์ฌ๊ธฐ์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค:
- ์ฝ๋ ์ธ๋ฒคํ ๋ฆฌ: ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๊ณผ ๊ทธ ์์กด์ฑ์ ์๋ณํฉ๋๋ค. `madge`์ ๊ฐ์ ๋๊ตฌ๋ ์ฌ์ฉ์ ์ ์ ์คํฌ๋ฆฝํธ๊ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ์์กด์ฑ ๊ทธ๋ํ: ํ์ผ ๊ฐ์ ์์กด์ฑ์ ์๊ฐํํฉ๋๋ค. ์ด๋ ์ ์ฒด ์ํคํ ์ฒ๋ฅผ ์ดํดํ๊ณ ์ ์ฌ์ ์ธ ์ํ ์์กด์ฑ์ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ๋ชจ๋ ์์คํ ์ ํ: ๋์ ๋ชจ๋ ์์คํ (ESM, CommonJS ๋ฑ)์ ์ ํํฉ๋๋ค. ์์ ์ธ๊ธํ๋ฏ์ด, ESM์ด ์ผ๋ฐ์ ์ผ๋ก ํ๋ ํ๋ก์ ํธ์ ๊ฐ์ฅ ์ข์ ์ ํ์ ๋๋ค.
- ๋ง์ด๊ทธ๋ ์ด์ ๊ฒฝ๋ก: ํ์ผ์ ๋ง์ด๊ทธ๋ ์ด์ ํ ์์๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ๋ฆฌํ ๋ ธ๋(์์กด์ฑ์ด ์๋ ํ์ผ)์์ ์์ํ์ฌ ์์กด์ฑ ๊ทธ๋ํ๋ฅผ ๋ฐ๋ผ ์๋ก ์ฌ๋ผ๊ฐ๋๋ค.
- ๋๊ตฌ ์ค์ : ๋น๋ ๋๊ตฌ(์: Webpack, Rollup, Parcel)์ ๋ฆฐํฐ(์: ESLint)๋ฅผ ๋์ ๋ชจ๋ ์์คํ ์ ์ง์ํ๋๋ก ๊ตฌ์ฑํฉ๋๋ค.
- ํ ์คํธ ์ ๋ต: ๋ง์ด๊ทธ๋ ์ด์ ์ผ๋ก ์ธํด ํ๊ท(regression)๊ฐ ๋ฐ์ํ์ง ์๋๋ก ๊ฒฌ๊ณ ํ ํ ์คํธ ์ ๋ต์ ์๋ฆฝํฉ๋๋ค.
์์: ์ ์์๊ฑฐ๋ ํ๋ซํผ์ ํ๋ก ํธ์๋๋ฅผ ํ๋ํํ๋ค๊ณ ์์ํด ๋ณด์ธ์. ํ๊ฐ ๊ฒฐ๊ณผ ์ ํ ํ์, ์ฅ๋ฐ๊ตฌ๋ ๊ธฐ๋ฅ, ์ฌ์ฉ์ ์ธ์ฆ๊ณผ ๊ด๋ จ๋ ์ฌ๋ฌ ์ ์ญ ๋ณ์๊ฐ ์์์ ๋ฐ๊ฒฌํ ์ ์์ต๋๋ค. ์์กด์ฑ ๊ทธ๋ํ๋ `productDisplay.js` ํ์ผ์ด `cart.js`์ `auth.js`์ ์์กดํจ์ ๋ณด์ฌ์ค๋๋ค. ๋ฒ๋ค๋ง์ ์ํด Webpack์ ์ฌ์ฉํ์ฌ ESM์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๊ธฐ๋ก ๊ฒฐ์ ํฉ๋๋ค.
2. ์ ์ง์ ๋ง์ด๊ทธ๋ ์ด์
๋ชจ๋ ๊ฒ์ ํ ๋ฒ์ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ค๊ณ ํ์ง ๋ง์ธ์. ๋์ ์ ์ง์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ฑํํ์ธ์:
- ์๊ฒ ์์ํ๊ธฐ: ์์กด์ฑ์ด ๊ฑฐ์ ์๋ ์๊ณ ๋ ๋ฆฝ์ ์ธ ๋ชจ๋๋ถํฐ ์์ํ์ธ์.
- ์ฒ ์ ํ ํ ์คํธํ๊ธฐ: ๊ฐ ๋ชจ๋์ ๋ง์ด๊ทธ๋ ์ด์ ํ ํ ํ ์คํธ๋ฅผ ์คํํ์ฌ ์ฌ์ ํ ์์๋๋ก ์๋ํ๋์ง ํ์ธํ์ธ์.
- ์ ์ง์ ์ผ๋ก ํ์ฅํ๊ธฐ: ์ด์ ์ ๋ง์ด๊ทธ๋ ์ด์ ํ ์ฝ๋์ ๊ธฐ๋ฐ ์์ ๋ ๋ณต์กํ ๋ชจ๋์ ์ ์ง์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ์ธ์.
- ์์ฃผ ์ปค๋ฐํ๊ธฐ: ์งํ ์ํฉ์ ์์ ์ํ์ ์ต์ํํ๊ณ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ์ฝ๊ฒ ๋๋๋ฆด ์ ์๋๋ก ๋ณ๊ฒฝ ์ฌํญ์ ์์ฃผ ์ปค๋ฐํ์ธ์.
์์: ์ ์์๊ฑฐ๋ ํ๋ซํผ ์์๋ฅผ ๊ณ์ ์ด์ด๊ฐ๋ฉด, `formatCurrency.js`(์ฌ์ฉ์์ ๋ก์ผ์ผ์ ๋ฐ๋ผ ๊ฐ๊ฒฉ ํ์์ ์ง์ ํ๋)์ ๊ฐ์ ์ ํธ๋ฆฌํฐ ํจ์๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๊ฒ๋ถํฐ ์์ํ ์ ์์ต๋๋ค. ์ด ํ์ผ์ ์์กด์ฑ์ด ์์ผ๋ฏ๋ก ์ด๊ธฐ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ข์ ํ๋ณด์ ๋๋ค.
3. ์ฝ๋ ๋ณํ
๋ง์ด๊ทธ๋ ์ด์ ํ๋ก์ธ์ค์ ํต์ฌ์ ๋ ๊ฑฐ์ ์ฝ๋๋ฅผ ์๋ก์ด ๋ชจ๋ ์์คํ ์ ์ฌ์ฉํ๋๋ก ๋ณํํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค์์ ํฌํจํฉ๋๋ค:
- ์ฝ๋๋ฅผ ๋ชจ๋๋ก ๊ฐ์ธ๊ธฐ: ์ฝ๋๋ฅผ ๋ชจ๋ ์ค์ฝํ ๋ด์ ์บก์ํํฉ๋๋ค.
- ์ ์ญ ๋ณ์ ๊ต์ฒด: ์ ์ญ ๋ณ์์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ช ์์ import๋ก ๊ต์ฒดํฉ๋๋ค.
- ๋ด๋ณด๋ด๊ธฐ(Export) ์ ์: ๋ค๋ฅธ ๋ชจ๋์์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ค๋ ํจ์, ํด๋์ค, ๋ณ์๋ฅผ ๋ด๋ณด๋ ๋๋ค.
- ๊ฐ์ ธ์ค๊ธฐ(Import) ์ถ๊ฐ: ์ฝ๋๊ฐ ์์กดํ๋ ๋ชจ๋์ ๊ฐ์ ธ์ต๋๋ค.
- ์ํ ์์กด์ฑ ํด๊ฒฐ: ์ํ ์์กด์ฑ์ ๋ฐ๊ฒฌํ๋ฉด ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ์ฌ ์ํ์ ๋์ต๋๋ค. ์ด๋ ๊ณต์ ์ ํธ๋ฆฌํฐ ๋ชจ๋์ ๋ง๋๋ ๊ฒ์ ํฌํจํ ์ ์์ต๋๋ค.
์์: ๋ง์ด๊ทธ๋ ์ด์ ์ `productDisplay.js`๋ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค:
// productDisplay.js
function displayProductDetails(product) {
var formattedPrice = formatCurrency(product.price);
// ...
}
window.displayProductDetails = displayProductDetails;
ESM์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ ํ์๋ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค:
// productDisplay.js
import { formatCurrency } from './utils/formatCurrency.js';
function displayProductDetails(product) {
const formattedPrice = formatCurrency(product.price);
// ...
}
export { displayProductDetails };
4. ๋๊ตฌ ๋ฐ ์๋ํ
์ฌ๋ฌ ๋๊ตฌ๊ฐ ๋ชจ๋ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ก์ธ์ค๋ฅผ ์๋ํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค:
- ๋ชจ๋ ๋ฒ๋ค๋ฌ(Webpack, Rollup, Parcel): ์ด ๋๊ตฌ๋ค์ ๋ชจ๋์ ๋ฐฐํฌ์ฉ์ผ๋ก ์ต์ ํ๋ ๋ฒ๋ค๋ก ๋ฌถ์ต๋๋ค. ๋ํ ์์กด์ฑ ํด๊ฒฐ ๋ฐ ์ฝ๋ ๋ณํ์ ์ฒ๋ฆฌํฉ๋๋ค. Webpack์ ๊ฐ์ฅ ์ธ๊ธฐ ์๊ณ ๋ค์ฌ๋ค๋ฅํ๋ฉฐ, Rollup์ ํธ๋ฆฌ ์์ดํน์ ์ค์ ์ ๋์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ข ์ข ์ ํธ๋ฉ๋๋ค. Parcel์ ์ฌ์ฉ ํธ์์ฑ๊ณผ ์ ๋ก ๊ตฌ์ฑ ์ค์ ์ผ๋ก ์ ๋ช ํฉ๋๋ค.
- ๋ฆฐํฐ(ESLint): ๋ฆฐํฐ๋ ์ฝ๋ฉ ํ์ค์ ๊ฐ์ ํ๊ณ ์ ์ฌ์ ์ธ ์ค๋ฅ๋ฅผ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ESLint๋ฅผ ๊ตฌ์ฑํ์ฌ ๋ชจ๋ ๊ตฌ๋ฌธ์ ๊ฐ์ ํ๊ณ ์ ์ญ ๋ณ์ ์ฌ์ฉ์ ๋ฐฉ์งํ์ธ์.
- ์ฝ๋ ๋ชจ๋ ๋๊ตฌ(jscodeshift): ์ด ๋๊ตฌ๋ค์ ์ฌ์ฉํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋ ๋ณํ์ ์๋ํํ ์ ์์ต๋๋ค. ์ ์ญ ๋ณ์์ ๋ชจ๋ ์ธ์คํด์ค๋ฅผ import๋ก ๋ฐ๊พธ๋ ๊ฒ๊ณผ ๊ฐ์ ๋๊ท๋ชจ ๋ฆฌํฉํ ๋ง ์์ ์ ํนํ ์ ์ฉํ ์ ์์ต๋๋ค.
- ์๋ ๋ฆฌํฉํ ๋ง ๋๊ตฌ(์: IntelliJ IDEA, VS Code ํ์ฅ ํ๋ก๊ทธ๋จ): ์ต์ IDE๋ CommonJS๋ฅผ ESM์ผ๋ก ์๋ ๋ณํํ๊ฑฐ๋ ์์กด์ฑ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์์: `eslint-plugin-import` ํ๋ฌ๊ทธ์ธ๊ณผ ํจ๊ป ESLint๋ฅผ ์ฌ์ฉํ์ฌ ESM ๊ตฌ๋ฌธ์ ๊ฐ์ ํ๊ณ ๋๋ฝ๋๊ฑฐ๋ ์ฌ์ฉ๋์ง ์๋ import๋ฅผ ๊ฐ์งํ ์ ์์ต๋๋ค. ๋ํ jscodeshift๋ฅผ ์ฌ์ฉํ์ฌ `window.displayProductDetails`์ ๋ชจ๋ ์ธ์คํด์ค๋ฅผ import ๋ฌธ์ผ๋ก ์๋ ๊ต์ฒดํ ์ ์์ต๋๋ค.
5. ํ์ด๋ธ๋ฆฌ๋ ์ ๊ทผ ๋ฐฉ์(ํ์ํ ๊ฒฝ์ฐ)
๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ชจ๋ ์์คํ ์ ํผํฉํ๋ ํ์ด๋ธ๋ฆฌ๋ ์ ๊ทผ ๋ฐฉ์์ ์ฑํํด์ผ ํ ์๋ ์์ต๋๋ค. ์ด๋ ํน์ ๋ชจ๋ ์์คํ ์์๋ง ์ฌ์ฉํ ์ ์๋ ์์กด์ฑ์ด ์๋ ๊ฒฝ์ฐ ์ ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, Node.js ํ๊ฒฝ์์๋ CommonJS ๋ชจ๋์ ์ฌ์ฉํ๊ณ ๋ธ๋ผ์ฐ์ ์์๋ ESM ๋ชจ๋์ ์ฌ์ฉํด์ผ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ํ์ด๋ธ๋ฆฌ๋ ์ ๊ทผ ๋ฐฉ์์ ๋ณต์ก์ฑ์ ๋ํ ์ ์์ผ๋ฏ๋ก ๊ฐ๋ฅํ๋ค๋ฉด ํผํด์ผ ํฉ๋๋ค. ๋จ์์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ์ํด ๋ชจ๋ ๊ฒ์ ๋จ์ผ ๋ชจ๋ ์์คํ (๊ฐ๊ธ์ ESM)์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ์ธ์.
6. ํ ์คํธ ๋ฐ ๊ฒ์ฆ
ํ ์คํธ๋ ๋ง์ด๊ทธ๋ ์ด์ ๊ณผ์ ์ ๋ฐ์ ๊ฑธ์ณ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ชจ๋ ์ค์ํ ๊ธฐ๋ฅ์ ๋ค๋ฃจ๋ ํฌ๊ด์ ์ธ ํ ์คํธ ์ค์ํธ๊ฐ ์์ด์ผ ํฉ๋๋ค. ๊ฐ ๋ชจ๋์ ๋ง์ด๊ทธ๋ ์ด์ ํ ํ ํ ์คํธ๋ฅผ ์คํํ์ฌ ํ๊ท๊ฐ ๋ฐ์ํ์ง ์์๋์ง ํ์ธํ์ธ์.
๋จ์ ํ ์คํธ ์ธ์๋ ํตํฉ ํ ์คํธ์ ์๋ํฌ์๋ ํ ์คํธ๋ฅผ ์ถ๊ฐํ์ฌ ๋ง์ด๊ทธ๋ ์ด์ ๋ ์ฝ๋๊ฐ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปจํ ์คํธ์์ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
7. ๋ฌธ์ํ ๋ฐ ์ปค๋ฎค๋์ผ์ด์
๋ง์ด๊ทธ๋ ์ด์ ์ ๋ต๊ณผ ์งํ ์ํฉ์ ๋ฌธ์ํํ์ธ์. ์ด๋ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ๋ณ๊ฒฝ ์ฌํญ์ ์ดํดํ๊ณ ์ค์๋ฅผ ํผํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค. ํ๊ณผ ์ ๊ธฐ์ ์ผ๋ก ์ํตํ์ฌ ๋ชจ๋ ์ฌ๋์๊ฒ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ณ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ธ์.
์ค์ฉ์ ์ธ ์์ ๋ฐ ์ฝ๋ ์ค๋ํซ
๋ ๊ฑฐ์ ํจํด์์ ESM ๋ชจ๋๋ก ์ฝ๋๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๋ ์ค์ฉ์ ์ธ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
์์ 1: ์ ์ญ ๋ณ์ ๊ต์ฒด
๋ ๊ฑฐ์ ์ฝ๋:
// utils.js
window.appName = 'My Awesome App';
window.formatCurrency = function(amount) {
return '$' + amount.toFixed(2);
};
// main.js
console.log('Welcome to ' + window.appName);
console.log('Price: ' + window.formatCurrency(123.45));
๋ง์ด๊ทธ๋ ์ด์ ๋ ์ฝ๋ (ESM):
// utils.js
const appName = 'My Awesome App';
function formatCurrency(amount) {
return '$' + amount.toFixed(2);
}
export { appName, formatCurrency };
// main.js
import { appName, formatCurrency } from './utils.js';
console.log('Welcome to ' + appName);
console.log('Price: ' + formatCurrency(123.45));
์์ 2: ์ฆ์ ์คํ ํจ์ ํํ์(IIFE)์ ๋ชจ๋๋ก ๋ณํํ๊ธฐ
๋ ๊ฑฐ์ ์ฝ๋:
// myModule.js
(function() {
var privateVar = 'secret';
window.myModule = {
publicFunction: function() {
console.log('Inside publicFunction, privateVar is: ' + privateVar);
}
};
})();
๋ง์ด๊ทธ๋ ์ด์ ๋ ์ฝ๋ (ESM):
// myModule.js
const privateVar = 'secret';
function publicFunction() {
console.log('Inside publicFunction, privateVar is: ' + privateVar);
}
export { publicFunction };
์์ 3: ์ํ ์์กด์ฑ ํด๊ฒฐ
์ํ ์์กด์ฑ์ ๋ ์ด์์ ๋ชจ๋์ด ์๋ก ์์กดํ์ฌ ์ํ์ ๋ง๋ค ๋ ๋ฐ์ํฉ๋๋ค. ์ด๋ ์์์น ๋ชปํ ๋์๊ณผ ๋ก๋ฉ ์์ ๋ฌธ์ ๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค.
๋ฌธ์ ๊ฐ ์๋ ์ฝ๋:
// moduleA.js
import { moduleBFunction } from './moduleB.js';
function moduleAFunction() {
console.log('moduleAFunction');
moduleBFunction();
}
export { moduleAFunction };
// moduleB.js
import { moduleAFunction } from './moduleA.js';
function moduleBFunction() {
console.log('moduleBFunction');
moduleAFunction();
}
export { moduleBFunction };
ํด๊ฒฐ์ฑ : ๊ณต์ ์ ํธ๋ฆฌํฐ ๋ชจ๋์ ๋ง๋ค์ด ์ํ์ ๋์ต๋๋ค.
// utils.js
function log(message) {
console.log(message);
}
export { log };
// moduleA.js
import { moduleBFunction } from './moduleB.js';
import { log } from './utils.js';
function moduleAFunction() {
log('moduleAFunction');
moduleBFunction();
}
export { moduleAFunction };
// moduleB.js
import { log } from './utils.js';
function moduleBFunction() {
log('moduleBFunction');
}
export { moduleBFunction };
์ผ๋ฐ์ ์ธ ๋ฌธ์ ํด๊ฒฐ
๋ชจ๋ ๋ง์ด๊ทธ๋ ์ด์ ์ด ํญ์ ๊ฐ๋จํ์ง๋ ์์ต๋๋ค. ๋ค์์ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋๋ค:
- ๋ ๊ฑฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: ์ผ๋ถ ๋ ๊ฑฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ต์ ๋ชจ๋ ์์คํ ๊ณผ ํธํ๋์ง ์์ ์ ์์ต๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ชจ๋๋ก ๊ฐ์ธ๊ฑฐ๋ ์ต์ ๋์์ ์ฐพ์์ผ ํ ์ ์์ต๋๋ค.
- ์ ์ญ ์ค์ฝํ ์์กด์ฑ: ๋ชจ๋ ์ ์ญ ๋ณ์ ์ฐธ์กฐ๋ฅผ ์๋ณํ๊ณ ๊ต์ฒดํ๋ ๊ฒ์ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค. ์ฝ๋ ๋ชจ๋ ๋๊ตฌ์ ๋ฆฐํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ด ํ๋ก์ธ์ค๋ฅผ ์๋ํํ์ธ์.
- ํ ์คํธ ๋ณต์ก์ฑ: ๋ชจ๋๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ฉด ํ ์คํธ ์ ๋ต์ ์ํฅ์ ์ค ์ ์์ต๋๋ค. ํ ์คํธ๊ฐ ์๋ก์ด ๋ชจ๋ ์์คํ ๊ณผ ํจ๊ป ์๋ํ๋๋ก ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋์๋์ง ํ์ธํ์ธ์.
- ๋น๋ ํ๋ก์ธ์ค ๋ณ๊ฒฝ: ๋น๋ ํ๋ก์ธ์ค๋ฅผ ์ ๋ฐ์ดํธํ์ฌ ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ด๋ ๋น๋ ์คํฌ๋ฆฝํธ์ ๊ตฌ์ฑ ํ์ผ์ ์๋นํ ๋ณ๊ฒฝ์ด ํ์ํ ์ ์์ต๋๋ค.
- ํ์ ์ ํญ: ์ผ๋ถ ๊ฐ๋ฐ์๋ ๋ณํ์ ์ ํญํ ์ ์์ต๋๋ค. ๋ชจ๋ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ด์ ์ ๋ช ํํ๊ฒ ์ ๋ฌํ๊ณ ๊ทธ๋ค์ด ์ ์ํ ์ ์๋๋ก ๊ต์ก๊ณผ ์ง์์ ์ ๊ณตํ์ธ์.
์ํํ ์ ํ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
์ํํ๊ณ ์ฑ๊ณต์ ์ธ ๋ชจ๋ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด์ธ์:
- ์ ์คํ๊ฒ ๊ณํํ๊ธฐ: ๋ง์ด๊ทธ๋ ์ด์ ํ๋ก์ธ์ค๋ฅผ ์๋๋ฅด์ง ๋ง์ธ์. ์๊ฐ์ ๋ด์ด ์ฝ๋๋ฒ ์ด์ค๋ฅผ ํ๊ฐํ๊ณ , ์ ๋ต์ ๊ณํํ๋ฉฐ, ํ์ค์ ์ธ ๋ชฉํ๋ฅผ ์ค์ ํ์ธ์.
- ์๊ฒ ์์ํ๊ธฐ: ์๊ณ ๋ ๋ฆฝ์ ์ธ ๋ชจ๋๋ถํฐ ์์ํ์ฌ ์ ์ฐจ ๋ฒ์๋ฅผ ํ์ฅํ์ธ์.
- ์ฒ ์ ํ ํ ์คํธํ๊ธฐ: ๊ฐ ๋ชจ๋์ ๋ง์ด๊ทธ๋ ์ด์ ํ ํ ํ ์คํธ๋ฅผ ์คํํ์ฌ ํ๊ท๊ฐ ๋ฐ์ํ์ง ์์๋์ง ํ์ธํ์ธ์.
- ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์๋ํํ๊ธฐ: ์ฝ๋ ๋ชจ๋ ๋๊ตฌ๋ ๋ฆฐํฐ์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋ ๋ณํ์ ์๋ํํ๊ณ ์ฝ๋ฉ ํ์ค์ ๊ฐ์ ํ์ธ์.
- ์ ๊ธฐ์ ์ผ๋ก ์ํตํ๊ธฐ: ํ์ ์งํ ์ํฉ์ ์๋ฆฌ๊ณ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ธ์.
- ๋ชจ๋ ๊ฒ์ ๋ฌธ์ํํ๊ธฐ: ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ต, ์งํ ์ํฉ, ๊ทธ๋ฆฌ๊ณ ๋ง์ฃผ์น ๋ชจ๋ ์ด๋ ค์์ ๋ฌธ์ํํ์ธ์.
- ์ง์์ ํตํฉ ์์ฉํ๊ธฐ: ๋ชจ๋ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ง์์ ํตํฉ(CI) ํ์ดํ๋ผ์ธ์ ํตํฉํ์ฌ ์ค๋ฅ๋ฅผ ์กฐ๊ธฐ์ ๋ฐ๊ฒฌํ์ธ์.
๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ
๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ํ๋ํํ ๋ ๋ค์ ์์๋ฅผ ๊ณ ๋ คํ์ธ์:
- ํ์งํ: ๋ชจ๋์ ํ์งํ ํ์ผ๊ณผ ๋ก์ง์ ๊ตฌ์ฑํ๋ ๋ฐ ๋์์ด ๋์ด ์ฌ์ฉ์์ ๋ก์ผ์ผ์ ๋ฐ๋ผ ์ ์ ํ ์ธ์ด ๋ฆฌ์์ค๋ฅผ ๋์ ์ผ๋ก ๋ก๋ํ ์ ์๊ฒ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์์ด, ์คํ์ธ์ด, ํ๋์ค์ด ๋ฐ ๊ธฐํ ์ธ์ด์ ๋ํ ๋ณ๋์ ๋ชจ๋์ ๊ฐ์ง ์ ์์ต๋๋ค.
- ๊ตญ์ ํ(i18n): ๋ชจ๋ ๋ด์์ `i18next`๋ `Globalize`์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๊ฐ ๊ตญ์ ํ๋ฅผ ์ง์ํ๋๋ก ํ์ธ์. ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ค์ํ ๋ ์ง ํ์, ์ซ์ ํ์, ํตํ ๊ธฐํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ์ ๊ทผ์ฑ(a11y): ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๋ชจ๋ํํ๋ฉด ์ ๊ทผ์ฑ ๊ธฐ๋ฅ์ ๊ด๋ฆฌํ๊ณ ํ ์คํธํ๊ธฐ ์ฌ์์ ธ ์ ๊ทผ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ํค๋ณด๋ ํ์, ARIA ์์ฑ ๋ฐ ๊ธฐํ ์ ๊ทผ์ฑ ๊ด๋ จ ์์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ณ๋์ ๋ชจ๋์ ๋ง๋์ธ์.
- ์ฑ๋ฅ ์ต์ ํ: ์ฝ๋ ์คํ๋ฆฌํ ์ ์ฌ์ฉํ์ฌ ๊ฐ ์ธ์ด ๋๋ ์ง์ญ์ ํ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ง ๋ก๋ํ์ธ์. ์ด๋ ์ธ๊ณ ์ฌ๋ฌ ์ง์ญ์ ์ฌ์ฉ์๋ฅผ ์ํด ํ์ด์ง ๋ก๋ ์๊ฐ์ ํฌ๊ฒ ๊ฐ์ ํ ์ ์์ต๋๋ค.
- ์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ(CDN): CDN์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์๊ฒ ๋ ๊ฐ๊น์ด ์๋ฒ์์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์ ์ ๊ณตํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์. ์ด๋ ์ง์ฐ ์๊ฐ์ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์์: ๊ตญ์ ๋ด์ค ์น์ฌ์ดํธ๋ ์ฌ์ฉ์์ ์์น์ ๋ฐ๋ผ ๋ค๋ฅธ ์คํ์ผ์ํธ, ์คํฌ๋ฆฝํธ, ์ฝํ ์ธ ๋ฅผ ๋ก๋ํ๊ธฐ ์ํด ๋ชจ๋์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ผ๋ณธ์ ์ฌ์ฉ์๋ ์ผ๋ณธ์ด ๋ฒ์ ์ ์น์ฌ์ดํธ๋ฅผ ๋ณด๊ฒ ๋๊ณ , ๋ฏธ๊ตญ์ ์ฌ์ฉ์๋ ์์ด ๋ฒ์ ์ ๋ณด๊ฒ ๋ฉ๋๋ค.
๊ฒฐ๋ก
์ต์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋๋ก์ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ฝ๋๋ฒ ์ด์ค์ ์ ์ง๋ณด์์ฑ, ์ฑ๋ฅ, ๋ณด์์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์๋ ๊ฐ์น ์๋ ํฌ์์ ๋๋ค. ์ด ๊ธ์์ ์ค๋ช ํ ์ ๋ต๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด ์ ํ์ ์ํํ๊ฒ ํ๊ณ ๋ณด๋ค ๋ชจ๋ํ๋ ์ํคํ ์ฒ์ ์ด์ ์ ๋๋ฆด ์ ์์ต๋๋ค. ์ ์คํ๊ฒ ๊ณํํ๊ณ , ์๊ฒ ์์ํ๊ณ , ์ฒ ์ ํ ํ ์คํธํ๋ฉฐ, ํ๊ณผ ์ ๊ธฐ์ ์ผ๋ก ์ํตํ๋ ๊ฒ์ ๊ธฐ์ตํ์ธ์. ๋ชจ๋์ ์์ฉํ๋ ๊ฒ์ ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ๊ฒฌ๊ณ ํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ค์ํ ๋จ๊ณ์ ๋๋ค.
์ ํ์ ์ฒ์์๋ ๋ฒ ์ฐจ๊ฒ ๋ณด์ผ ์ ์์ง๋ง, ์ ์คํ ๊ณํ๊ณผ ์คํ์ ํตํด ๋ ๊ฑฐ์ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ํ๋ํํ๊ณ ๋์์์ด ์งํํ๋ ์น ๊ฐ๋ฐ ์ธ๊ณ์์ ์ฅ๊ธฐ์ ์ธ ์ฑ๊ณต์ ์ํ ํ๋ก์ ํธ๋ฅผ ํฌ์ง์ ๋ํ ์ ์์ต๋๋ค.