JavaScript ์ํฌํธ ๋งต์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ํ์ฉํด ๋ณด์ธ์! ์ด ์ข ํฉ ๊ฐ์ด๋์์๋ ๋ชจ๋ ํด์์ ์ ์ดํ๊ณ , ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์์ ๊ฐํํ๋ฉฐ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ์์๋ด ๋๋ค.
JavaScript ์ํฌํธ ๋งต: ์ต์ ์น ๊ฐ๋ฐ์ ์ํ ๋ชจ๋ ํด์ ๋ง์คํฐํ๊ธฐ
๋์์์ด ๋ฐ์ ํ๋ ์น ๊ฐ๋ฐ ํ๊ฒฝ์์ JavaScript ๋ชจ๋์ ํ์ฅ ๊ฐ๋ฅํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ์ด์์ด ๋์์ต๋๋ค. ํ์ง๋ง ๋ชจ๋ ์์กด์ฑ์ ๊ด๋ฆฌํ๊ณ ์ํฌํธ ๊ฒฝ๋ก๋ฅผ ํด์ํ๋ ๊ณผ์ ์ ์ข ์ข ๋ณต์ก์ฑ์ ์ผ๊ธฐํ๊ณ ์ ์ฌ์ ์ธ ์ทจ์ฝ์ ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๋ฐ๋ก ์ด๋ JavaScript ์ํฌํธ ๋งต(Import Maps)์ด ๋ฑ์ฅํฉ๋๋ค. ์ด๋ ๋ชจ๋ ํด์์ ๋ํ ์ธ๋ฐํ ์ ์ด๋ฅผ ์ ๊ณตํ์ฌ ๋ณด์ ๊ฐํ, ์ฑ๋ฅ ํฅ์, ์ ์ฐ์ฑ ์ฆ๋๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
JavaScript ์ํฌํธ ๋งต์ด๋ ๋ฌด์์ธ๊ฐ?
์ํฌํธ ๋งต์ JavaScript ๋ชจ๋์ด ํด์๋๋ ๋ฐฉ์์ ์ ์ดํ ์ ์๊ฒ ํด์ฃผ๋ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฅ์
๋๋ค. ์ด๋ ๋ณธ์ง์ ์ผ๋ก ๋ชจ๋ ์ง์ ์(import
๋ฌธ์์ ์ฌ์ฉํ๋ ๋ฌธ์์ด)์ ๋ชจ๋์ด ์์นํ ์ค์ URL ์ฌ์ด์ ๋งคํ ์ญํ ์ ํฉ๋๋ค. ์ด ๋งคํ์ HTML์ <script type="importmap">
ํ๊ทธ ๋ด์ ์ ์๋์ด, ์ค์ ์ง์ค์ ์ด๊ณ ์ ์ธ์ ์ธ ๋ฐฉ์์ผ๋ก ๋ชจ๋ ํด์์ ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ค๋๋ค.
JavaScript ๋ชจ๋์ ์ํ ์ ๊ตํ ์ฃผ์๋ก์ด๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๋ณธ ๋ชจ๋ ํด์ ์๊ณ ๋ฆฌ์ฆ์ ์์กดํ๋ ๋์ , ์ฝ๋์์ ์ด๋ป๊ฒ ์ฐธ์กฐ๋๋์ง์ ์๊ด์์ด ๊ฐ ๋ชจ๋์ ์ด๋์ ์ฐพ์์ผ ํ๋์ง ๋ธ๋ผ์ฐ์ ์ ๋ช ์์ ์ผ๋ก ์๋ ค์ค ์ ์์ต๋๋ค.
์ํฌํธ ๋งต ์ฌ์ฉ์ ์ด์
1. ๋ณด์ ๊ฐํ
์ํฌํธ ๋งต์ ์์กด์ฑ ํผ๋ ๊ณต๊ฒฉ(dependency confusion attacks)์ ์ํ์ ์ํํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์์ ํฌ๊ฒ ํฅ์์ํต๋๋ค. ๋ชจ๋ ์ง์ ์๋ฅผ ํน์ URL์ ๋ช ์์ ์ผ๋ก ๋งคํํจ์ผ๋ก์จ, ์ ์์ ์ธ ํ์์๊ฐ ์ ์ฌํ ์ด๋ฆ์ ํจํค์ง๋ก ์์กด์ฑ์ ํ์ด์ฌํนํ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, my-library
๋ผ๋ ์ด๋ฆ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์์ ๋, ์ํฌํธ ๋งต์ด ์๋ค๋ฉด ๊ณต๊ฒฉ์๋ ์ ์ฌ์ ์ผ๋ก ๊ณต๊ฐ ๋ ์ง์คํธ๋ฆฌ์ ๊ฐ์ ์ด๋ฆ์ ํจํค์ง๋ฅผ ๋ฑ๋กํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ด ์
์ฑ ์ฝ๋๋ฅผ ๋ก๋ํ๋๋ก ์์ผ ์ ์์ต๋๋ค. ์ํฌํธ ๋งต์ ์ฌ์ฉํ๋ฉด my-library
์ ๋ํ URL์ ๋ช
์์ ์ผ๋ก ์ ์ํ์ฌ ์๋ํ ๋ชจ๋๋ง ๋ก๋๋๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค.
2. ์ฑ๋ฅ ํฅ์
์ํฌํธ ๋งต์ ๋คํธ์ํฌ ์์ฒญ ์๋ฅผ ์ค์ด๊ณ ๋ถํ์ํ ๋ฆฌ๋๋ ์ ์ ์ ๊ฑฐํ์ฌ ๋ชจ๋ ๋ก๋ฉ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค. ๋ชจ๋์ ๋ํ ์ง์ ์ ์ธ URL์ ์ ๊ณตํจ์ผ๋ก์จ ๋ธ๋ผ์ฐ์ ๋ ์ฌ๋ฌ ๋๋ ํ ๋ฆฌ๋ฅผ ํ์ํ๊ฑฐ๋ DNS ์กฐํ๋ฅผ ์ํํ ํ์๊ฐ ์์ด์ง๋๋ค.
๋ํ, ์ํฌํธ ๋งต์ ์ฌ์ฉํ๋ฉด CDN(์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ)์ ๋ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ ์ ์์ต๋๋ค. ๋ชจ๋ ์ง์ ์๋ฅผ CDN URL์ ๋งคํํ์ฌ ๋ธ๋ผ์ฐ์ ๊ฐ ์ง๋ฆฌ์ ์ผ๋ก ์ต์ ํ๋ ์๋ฒ์์ ๋ชจ๋์ ๊ฐ์ ธ์ค๊ฒ ํจ์ผ๋ก์จ, ์ง์ฐ ์๊ฐ์ ์ค์ด๊ณ ์ ๋ฐ์ ์ธ ๋ก๋ฉ ์๋๋ฅผ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์ฌ๋ฌ ๋๋ฅ์ ์ฌ์ฉ์๊ฐ ์๋ ๊ธ๋ก๋ฒ ๊ธฐ์ ์ ์๊ฐํด ๋ณด์ธ์. ์ํฌํธ ๋งต์ CDN URL์ ์ฌ์ฉํ๋ฉด ๊ฐ ์ฌ์ฉ์์๊ฒ ๊ฐ์ฅ ๊ฐ๊น์ด ์๋ฒ์์ JavaScript ํ์ผ์ ์ ๊ณตํ์ฌ ๋ก๋ฉ ์๊ฐ์ ํฌ๊ฒ ๊ฐ์ ํ ์ ์์ต๋๋ค.
3. ์ ์ฐ์ฑ ๋ฐ ์ ์ด๋ ฅ ์ฆ๋
์ํฌํธ ๋งต์ ๋ชจ๋ ์์กด์ฑ์ ๊ด๋ฆฌํ๋ ๋ฐ ์์ด ๋ ๋ณด์ ์ธ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค. ๋ชจ๋ ์ง์ ์๋ฅผ ๋ค๋ฅธ ๋ฒ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฝ๊ฒ ์ฌ๋งคํํ๊ฑฐ๋, ๋ก์ปฌ ๋ชจ๋๊ณผ ์๊ฒฉ ๋ชจ๋ ๊ฐ์ ์ ํํ๊ฑฐ๋, ํ ์คํธ ๋ชฉ์ ์ผ๋ก ๋ชจ๋์ ๋ชจ์(mock) ๊ฐ์ฒด๋ก ๋ง๋ค ์๋ ์์ต๋๋ค. ์ด๋ฌํ ์์ค์ ์ ์ด๋ ๋ณต์กํ ์์กด์ฑ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ๋๊ท๋ชจ ํ๋ก์ ํธ์์ ํนํ ์ ์ฉํฉ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฒ์ 1.0์์ 2.0์ผ๋ก ์ ๋ฐ์ดํธํด์ผ ํ๋ค๊ณ ์์ํด ๋ณด์ธ์. ์ํฌํธ ๋งต์ ์ฌ์ฉํ๋ฉด JavaScript ์ฝ๋๋ฅผ ์ ํ ์์ ํ์ง ์๊ณ ๋ ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ URL ๋งคํ๋ง ๊ฐ๋จํ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค. ์ด๋ ์ ๊ทธ๋ ์ด๋ ๊ณผ์ ์ ๋จ์ํํ๊ณ ๋ธ๋ ์ดํน ์ฒด์ธ์ง(breaking changes)๋ฅผ ๋์ ํ ์ํ์ ์ค์ฌ์ค๋๋ค.
4. ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ ๋จ์ํ
์ํฌํธ ๋งต์ ์ฝ๋์์ '๋ฒ ์ด(bare)' ๋ชจ๋ ์ง์ ์๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํ์ฌ ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ๋ฅผ ๊ฐ์ํํฉ๋๋ค. ์ด๋ ๋ค์ดํฐ๋ธ๋ก ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ ์ค์ ๋ณต์กํ ๋น๋ ๋๊ตฌ๋ ๋ชจ๋ ๋ฒ๋ค๋ฌ๊ฐ ํ์ ์์ด์ ธ ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ๋ฐ๋ณตํ๊ณ ํ ์คํธํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, import lodash from './node_modules/lodash-es/lodash.js';
๋ผ๊ณ ์์ฑํ๋ ๋์ , ๊ฐ๋จํ import lodash from 'lodash-es';
๋ผ๊ณ ์์ฑํ ์ ์์ผ๋ฉฐ, ์ํฌํธ ๋งต์ด ๋ชจ๋ ํด์์ ์ฒ๋ฆฌํด ์ค๋๋ค. ์ด๋ ์ฝ๋๋ฅผ ๋ ๊น๋ํ๊ณ ๊ฐ๋
์ฑ ์๊ฒ ๋ง๋ญ๋๋ค.
5. ๋ ๊ฑฐ์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํ ํด๋ฆฌํ๋ง
์ต์ ๋ธ๋ผ์ฐ์ ๋ค์ ์ํฌํธ ๋งต์ ๋ค์ดํฐ๋ธ๋ก ์ง์ํ์ง๋ง, ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์ ํธํ์ฑ์ ์ํด ํด๋ฆฌํ(polyfill)์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ค์ดํฐ๋ธ ์ง์์ด ๋ถ์กฑํ ํ๊ฒฝ์์๋ ์ํฌํธ ๋งต์ ์ด์ ์ ํ์ฉํ ์ ์์ต๋๋ค. ์ฌ๋ฌ ๊ฒฌ๊ณ ํ๊ณ ์ ๊ด๋ฆฌ๋๋ ํด๋ฆฌํ์ด ์ ๊ณต๋๋ฏ๋ก, ๋ธ๋ผ์ฐ์ ํธํ์ฑ์ ํฌ์ํ์ง ์๊ณ ๋ ์ํฌํธ ๋งต์ ๋์ ํ ์ ์์ต๋๋ค.
์ํฌํธ ๋งต ์ฌ์ฉ ๋ฐฉ๋ฒ
์ํฌํธ ๋งต ์ฌ์ฉ์ ๋ ๊ฐ์ง ์ฃผ์ ๋จ๊ณ๋ก ์ด๋ฃจ์ด์ง๋๋ค:
- HTML์์ ์ํฌํธ ๋งต ์ ์ํ๊ธฐ.
- JavaScript ์ฝ๋์์ ๋ชจ๋ ์ง์ ์ ์ฌ์ฉํ๊ธฐ.
1. ์ํฌํธ ๋งต ์ ์ํ๊ธฐ
์ํฌํธ ๋งต์ HTML์ <script type="importmap">
ํ๊ทธ ๋ด์ ์ ์๋ฉ๋๋ค. ์ด ํ๊ทธ์๋ ๋ชจ๋ ์ง์ ์๋ฅผ URL์ ๋งคํํ๋ JSON ๊ฐ์ฒด๊ฐ ํฌํจ๋ฉ๋๋ค.
๊ธฐ๋ณธ์ ์ธ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
<script type="importmap">
{
"imports": {
"lodash-es": "https://cdn.jsdelivr.net/npm/lodash-es@4.17.21/lodash.js",
"my-module": "/modules/my-module.js"
}
}
</script>
์ด ์์์์๋ ๋ชจ๋ ์ง์ ์ lodash-es
๋ฅผ CDN URL์, ๋ชจ๋ ์ง์ ์ my-module
์ ๋ก์ปฌ ํ์ผ์ ๋งคํํ๊ณ ์์ต๋๋ค. imports
ํค๋ ๊ฐ ํค-๊ฐ ์์ด ํ๋์ ๋งคํ์ ๋ํ๋ด๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๋๋ค. ํค๋ ๋ชจ๋ ์ง์ ์(import
๋ฌธ์์ ์ฌ์ฉํ ์ด๋ฆ)์ด๊ณ , ๊ฐ์ ๋ธ๋ผ์ฐ์ ๊ฐ ํด๋น ๋ชจ๋์ ์ฐพ์ ์ ์๋ URL์
๋๋ค.
์ค์ฝํ์ ์ฐ์ ์์
์ํฌํธ ๋งต์ HTML ๋ด ๋ค๋ฅธ ์์น์ ์ฌ๋ฌ ๊ฐ์ <script type="importmap">
ํ๊ทธ๋ฅผ ๋ฐฐ์นํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ํน์ ๋ถ๋ถ์ผ๋ก ์ค์ฝํ๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ๋ import
๋ฌธ์ ํฌํจํ๋ <script type="module">
ํ๊ทธ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ํฌํธ ๋งต์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์
์ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ํด ์๋ก ๋ค๋ฅธ ๋งคํ์ ์ ์ํ ์ ์์ต๋๋ค.
์ฌ๋ฌ ์ํฌํธ ๋งต์ด ์กด์ฌํ ๋, ๋ธ๋ผ์ฐ์ ๋ ๋ค์ ์ฐ์ ์์์ ๋ฐ๋ผ ๋ชจ๋ ์ง์ ์๋ฅผ ํด์ํฉ๋๋ค:
- ์ธ๋ผ์ธ ์ํฌํธ ๋งต (HTML ๋ด์ ์ง์ ์ ์๋จ).
- ์ธ๋ถ ํ์ผ์์ ๋ก๋๋ ์ํฌํธ ๋งต (
src
์์ฑ์ ์ฌ์ฉํ์ฌ ์ง์ ๋จ). - ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๋ณธ ๋ชจ๋ ํด์ ์๊ณ ๋ฆฌ์ฆ.
2. ๋ชจ๋ ์ง์ ์ ์ฌ์ฉํ๊ธฐ
์ํฌํธ ๋งต์ ์ ์ํ๋ค๋ฉด, ๋งคํ๋ ๋ชจ๋ ์ง์ ์๋ฅผ JavaScript ์ฝ๋์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
<script type="module">
import _ from 'lodash-es';
import { myFunction } from 'my-module';
console.log(_.shuffle([1, 2, 3, 4, 5]));
myFunction();
</script>
์ด ์์์์ ๋ธ๋ผ์ฐ์ ๋ ์ํฌํธ ๋งต์ ์ฌ์ฉํ์ฌ lodash-es
์ my-module
์ ๊ฐ๊ฐ์ URL๋ก ํด์ํ๊ณ , ๊ทธ์ ๋ฐ๋ผ ๋ชจ๋์ ๋ก๋ํฉ๋๋ค.
๊ณ ๊ธ ์ํฌํธ ๋งต ๊ธฐ๋ฒ
1. ์ํฌํธ ๋งต ์ค์ฝํ
scopes
์์ฑ์ ์ฌ์ฉํ์ฌ ์ํฌํธ ๋งต์ ์ ํ๋ฆฌ์ผ์ด์
์ ํน์ ๋ถ๋ถ์ผ๋ก ์ค์ฝํ๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ค๋ฅธ ๋๋ ํ ๋ฆฌ๋ ๋ชจ๋์ ๋ํด ์๋ก ๋ค๋ฅธ ๋งคํ์ ์ ์ํ ์ ์์ต๋๋ค.
<script type="importmap">
{
"imports": {
"lodash-es": "https://cdn.jsdelivr.net/npm/lodash-es@4.17.21/lodash.js"
},
"scopes": {
"/admin/": {
"my-module": "/admin/modules/my-module.js"
},
"/user/": {
"my-module": "/user/modules/my-module.js"
}
}
}
</script>
์ด ์์์์, my-module
์ง์ ์๋ ์ฝ๋๊ฐ /admin/
๋๋ ํ ๋ฆฌ ๋ด์์ ์คํ๋ ๋๋ /admin/modules/my-module.js
๋ก ํด์๋๊ณ , /user/
๋๋ ํ ๋ฆฌ ๋ด์์ ์คํ๋ ๋๋ /user/modules/my-module.js
๋ก ํด์๋ฉ๋๋ค.
2. ๋์ฒด(Fallback) URL
๊ธฐ๋ณธ URL์ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ํฌํธ ๋งต์ ๋์ฒด URL์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ด๋ ๋คํธ์ํฌ ์ค๋ฅ๋ CDN ์ฅ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณต์๋ ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๋น๋ก ์ํฌํธ ๋งต ์ฌ์์์ ๋ค์ดํฐ๋ธ๋ก ์ง์๋์ง๋ ์์ง๋ง, ์ด๊ธฐ ๋ชจ๋ ๋ก๋์ ์ฑ๊ณต ๋๋ ์คํจ์ ๋ฐ๋ผ JavaScript๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ์ผ๋ก ์ํฌํธ ๋งต์ ์์ ํจ์ผ๋ก์จ ์ ์ฌํ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์ต๋๋ค.
3. ์กฐ๊ฑด๋ถ ๋งคํ
์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ๋ ์ฅ์น์ ๊ฐ์ ๋ฐํ์ ์กฐ๊ฑด์ ๋ฐ๋ผ JavaScript๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ์ผ๋ก ์ํฌํธ ๋งต์ ์์ ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์ ํ๊ฒฝ์ ๊ธฐ๋ฅ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ชจ๋์ ๋ก๋ํ ์ ์์ต๋๋ค. ์ด ์ญ์ DOM์ ์กฐ์ํ๊ณ <script type="importmap">
ํ๊ทธ์ ๋ด์ฉ์ ์์ ํ๊ธฐ ์ํ ์ฝ๊ฐ์ JavaScript ์ฝ๋๊ฐ ํ์ํฉ๋๋ค.
์ํฌํธ ๋งต์ ์ค์ ์์
1. ํ๋ก๋์ ์์๋ CDN, ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ๋ก์ปฌ ํ์ผ ์ฌ์ฉํ๊ธฐ
์ด๋ ํ๋ก๋์ ํ๊ฒฝ์์๋ ์ฑ๋ฅ์ ์ํด CDN์ ์ฌ์ฉํ๊ณ , ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ๋น ๋ฅธ ๊ฐ๋ฐ ๋ฐ๋ณต์ ์ํด ๋ก์ปฌ ํ์ผ์ ์ฌ์ฉํ๊ณ ์ ํ๋ ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค์ ๋๋ค.
<script type="importmap">
{
"imports": {
"lodash-es": "{{LODASH_URL}}"
}
}
</script>
<script type="module">
import _ from 'lodash-es';
console.log(_.VERSION);
</script>
๋น๋ ๊ณผ์ ์์ {{LODASH_URL}}
์ ํ๋ก๋์
ํ๊ฒฝ์์๋ CDN URL๋ก, ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ๋ก์ปฌ ํ์ผ ๊ฒฝ๋ก๋ก ๊ต์ฒดํ ์ ์์ต๋๋ค.
2. ํ ์คํธ๋ฅผ ์ํ ๋ชจ๋ ๋ชจํน(Mocking)
์ํฌํธ ๋งต์ ์ฌ์ฉํ๋ฉด ํ ์คํธ๋ฅผ ์ํ ๋ชจ๋์ ์ฝ๊ฒ ๋ชจํนํ ์ ์์ต๋๋ค. ๋ชจ๋ ์ง์ ์๋ฅผ ๋ชจ์ ๊ตฌํ์ผ๋ก ๊ฐ๋จํ ์ฌ๋งคํํ๋ฉด ๋ฉ๋๋ค.
<script type="importmap">
{
"imports": {
"my-module": "/mocks/my-module.js"
}
}
</script>
์ด๋ฅผ ํตํด ํ ์คํธ๋ฅผ ๊ฒฉ๋ฆฌํ๊ณ ์ธ๋ถ ์์กด์ฑ์ ์ํฅ์ ๋ฐ์ง ์๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค.
3. ์ฌ๋ฌ ๋ฒ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ด๋ฆฌํ๊ธฐ
์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ๋ฌ ๋ฒ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ, ์ํฌํธ ๋งต์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์ง์ ์์ ๋ชจํธ์ฑ์ ํด์ํ ์ ์์ต๋๋ค.
<script type="importmap">
{
"imports": {
"lodash-es-v4": "https://cdn.jsdelivr.net/npm/lodash-es@4.17.21/lodash.js",
"lodash-es-v5": "https://cdn.jsdelivr.net/npm/lodash-es@4.17.15/lodash.js"
}
}
</script>
<script type="module">
import _v4 from 'lodash-es-v4';
import _v5 from 'lodash-es-v5';
console.log("lodash v4 version:", _v4.VERSION);
console.log("lodash v5 version:", _v5.VERSION);
</script>
์ด๋ฅผ ํตํด ์ฝ๋์์ ์ถฉ๋ ์์ด ๋ ๋ฒ์ ์ Lodash๋ฅผ ๋ชจ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ํธํ์ฑ ๋ฐ ํด๋ฆฌํ
์ํฌํธ ๋งต์ Chrome, Firefox, Safari, Edge๋ฅผ ํฌํจํ ๋ชจ๋ ์ฃผ์ ์ต์ ๋ธ๋ผ์ฐ์ ์์ ์ง์๋ฉ๋๋ค. ํ์ง๋ง ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์๋ ํธํ์ฑ์ ์ํด ํด๋ฆฌํ์ด ํ์ํ ์ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ธ๊ธฐ ์๋ ์ํฌํธ ๋งต ํด๋ฆฌํ์ด ์์ต๋๋ค:
- es-module-shims: ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์ ์ํฌํธ ๋งต ๋ฐ ๊ธฐํ ES ๋ชจ๋ ๊ธฐ๋ฅ์ ์ง์ํ๋ ํฌ๊ด์ ์ธ ํด๋ฆฌํ์ ๋๋ค.
- SystemJS: ์ํฌํธ ๋งต ๋ฐ ๊ธฐํ ๋ชจ๋ ํ์์ ์ง์ํ๋ ๋ชจ๋ ๋ก๋์ ๋๋ค.
ํด๋ฆฌํ์ ์ฌ์ฉํ๋ ค๋ฉด HTML์ <script type="module">
ํ๊ทธ ์์ ๊ฐ๋จํ ํฌํจ์ํค๋ฉด ๋ฉ๋๋ค.
์ํฌํธ ๋งต ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
- ์ํฌํธ ๋งต์ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ์ธ์: ์ฃผ์๊ณผ ์ผ๊ด๋ ์ด๋ฆ ๊ท์น์ ์ฌ์ฉํ์ฌ ์ํฌํธ ๋งต์ ๋ ์ฝ๊ฒ ์ดํดํ๊ณ ์ ์ง๋ณด์ํ ์ ์๋๋ก ํ์ธ์.
- ๋ฒ์ ๊ณ ์ ์ฌ์ฉ: ์๊ธฐ์น ์์ ๋ธ๋ ์ดํน ์ฒด์ธ์ง๋ฅผ ํผํ๊ธฐ ์ํด ์ํฌํธ ๋งต์ ์์กด์ฑ์ ์ ํํ ๋ฒ์ ์ ๋ช ์ํ์ธ์.
- ์ํฌํธ ๋งต์ ์ฒ ์ ํ ํ ์คํธํ์ธ์: ์ํฌํธ ๋งต์ด ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋์๊ณ ๋ชจ๋์ด ์์๋๋ก ๋ก๋๋๋์ง ํ์ธํ์ธ์.
- ๋น๋ ๋๊ตฌ ์ฌ์ฉ ๊ณ ๋ ค: ์ํฌํธ ๋งต์ด ๊ฐ๋ฐ์ ๋จ์ํํ ์ ์์ง๋ง, ์ฝ๋ ์์ถ, ๋ฒ๋ค๋ง, ์ต์ ํ์ ๊ฐ์ ์์ ์๋ ์ฌ์ ํ ๋น๋ ๋๊ตฌ๊ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
- ์์กด์ฑ์ ๋ชจ๋ํฐ๋งํ์ธ์: ์ ๊ธฐ์ ์ผ๋ก ์์กด์ฑ ์ ๋ฐ์ดํธ๋ฅผ ํ์ธํ๊ณ ๊ทธ์ ๋ฐ๋ผ ์ํฌํธ ๋งต์ ์ ๋ฐ์ดํธํ์ธ์.
- ๋ณด์์ ์ฐ์ ์ํ์ธ์: ์์กด์ฑ ํผ๋ ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ํญ์ ๋ชจ๋ ์ง์ ์๋ฅผ ์ ๋ขฐํ ์ ์๋ URL์ ๋ช ์์ ์ผ๋ก ๋งคํํ์ธ์.
ํผํด์ผ ํ ์ผ๋ฐ์ ์ธ ํจ์
- ์๋ชป๋ URL: ์ํฌํธ ๋งต์ URL์ด ์ ํํ๊ณ ์ ๊ทผ ๊ฐ๋ฅํ์ง ๋ค์ ํ์ธํ์ธ์.
- ์ถฉ๋ํ๋ ๋งคํ: ๋์ผํ ๋ชจ๋ ์ง์ ์์ ๋ํด ์ฌ๋ฌ ๋งคํ์ ์ ์ํ๋ ๊ฒ์ ํผํ์ธ์.
- ์ํ ์์กด์ฑ: ๋ชจ๋ ๊ฐ์ ์ํ ์์กด์ฑ์ ์ธ์งํ๊ณ ์ ์ ํ ์ฒ๋ฆฌ๋๋๋ก ํ์ธ์.
- ํด๋ฆฌํ์ ์๋ ๊ฒ: ๊ตฌํ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋์์ผ๋ก ํ๋ ๊ฒฝ์ฐ, ์ํฌํธ ๋งต ํด๋ฆฌํ์ ํฌํจํ๋ ๊ฒ์ ์์ง ๋ง์ธ์.
- ๊ณผ๋ํ ๋ณต์ก์ฑ: ๊ฐ๋จํ ์ํฌํธ ๋งต์ผ๋ก ์์ํ๊ณ ํ์ํ ๋๋ง ๋ณต์ก์ฑ์ ์ถ๊ฐํ์ธ์.
์ํฌํธ ๋งต vs. ๋ชจ๋ ๋ฒ๋ค๋ฌ
์ํฌํธ ๋งต๊ณผ ๋ชจ๋ ๋ฒ๋ค๋ฌ(Webpack, Parcel, Rollup ๋ฑ)๋ ์๋ก ๋ค๋ฅธ ๋ชฉ์ ์ ๊ฐ์ง๋๋ค. ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ ์ฃผ๋ก ํ๋ก๋์ ํ๊ฒฝ์์ ์ฑ๋ฅ ํฅ์์ ์ํด ์ฌ๋ฌ JavaScript ํ์ผ์ ๋จ์ผ ๋ฒ๋ค๋ก ๊ฒฐํฉํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ฐ๋ฉด์ ์ํฌํธ ๋งต์ ์ฝ๋๋ฅผ ๋ฐ๋์ ๋ฒ๋ค๋งํ์ง ์๊ณ ๋ ๋ชจ๋ ํด์์ ์ ์ดํ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
๋ชจ๋ ๋ฒ๋ค๋ฌ๋ ์ฝ๋ ๋ถํ (code splitting)์ด๋ ํธ๋ฆฌ ์์ดํน(tree shaking)๊ณผ ๊ฐ์ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์ ๊ณตํ ์ ์์ง๋ง, ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ์ ๋ณต์ก์ฑ์ ๋ํ ์๋ ์์ต๋๋ค. ์ํฌํธ ๋งต์ ํนํ ์๊ท๋ชจ ํ๋ก์ ํธ๋ ๊ฐ๋ฐ ์ค์ ๋ชจ๋ ์์กด์ฑ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ ๊ฐ๋จํ๊ณ ๊ฐ๋ฒผ์ด ๋์์ ์ ๊ณตํฉ๋๋ค.
๋ง์ ๊ฒฝ์ฐ, ์ํฌํธ ๋งต์ ๋ชจ๋ ๋ฒ๋ค๋ฌ์ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ๋ฐ ์ค์๋ ์ํฌํ๋ก์ฐ๋ฅผ ๋จ์ํํ๊ธฐ ์ํด ์ํฌํธ ๋งต์ ์ฌ์ฉํ๊ณ , ํ๋ก๋์ ์์๋ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ํฌํธ ๋งต์ ๋ฏธ๋
์ํฌํธ ๋งต์ ๋น๊ต์ ์๋ก์ด ๊ธฐ์ ์ด์ง๋ง, ์น ๊ฐ๋ฐ ์ปค๋ฎค๋ํฐ์์ ๋น ๋ฅด๊ฒ ์ธ๊ธฐ๋ฅผ ์ป๊ณ ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ์ ์ํฌํธ ๋งต ์ง์์ด ๊ณ์ํด์ ๊ฐ์ ๋จ์ ๋ฐ๋ผ, ์ด๋ ๋ชจ๋ ์์กด์ฑ์ ๊ด๋ฆฌํ๊ณ ์ต์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์์ด ์ ์ ๋ ์ค์ํ ๋๊ตฌ๊ฐ ๋ ๊ฒ์ ๋๋ค.
ํฅํ ์ํฌํธ ๋งต ๊ฐ๋ฐ์๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ ์ง์์ด ํฌํจ๋ ์ ์์ต๋๋ค:
- ๋์ ์ํฌํธ ๋งต: ํ์ด์ง ์๋ก๊ณ ์นจ ์์ด ๋ฐํ์์ ์ํฌํธ ๋งต์ ์ ๋ฐ์ดํธํ ์ ์๋๋ก ํ์ฉ.
- ๋ ๊ณ ๊ธ ์ค์ฝํ ์ต์ : ๋ชจ๋ ํด์์ ๋ํ ๋ ์ธ๋ฐํ ์ ์ด ์ ๊ณต.
- ๋ค๋ฅธ ์น ํ๋ซํผ ๊ธฐ๋ฅ๊ณผ์ ํตํฉ: ์๋น์ค ์์ปค ๋ฐ ์น ์ปดํฌ๋ํธ ๋ฑ.
๊ฒฐ๋ก
JavaScript ์ํฌํธ ๋งต์ ์ต์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ชจ๋ ํด์์ ์ ์ดํ๋ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ๋ชจ๋ ์์กด์ฑ์ ๋ํ ์ธ๋ฐํ ์ ์ด๋ฅผ ํตํด ์ํฌํธ ๋งต์ ๋ณด์์ ๊ฐํํ๊ณ , ์ฑ๋ฅ์ ํฅ์์ํค๋ฉฐ, ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ๋ฅผ ๋จ์ํํฉ๋๋ค. ์๊ท๋ชจ ๋จ์ผ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋๊ท๋ชจ ์ํฐํ๋ผ์ด์ฆ ์์คํ ์ ๊ตฌ์ถํ๋ , ์ํฌํธ ๋งต์ JavaScript ๋ชจ๋์ ๋ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ๋ ๊ฒฌ๊ณ ํ๋ฉฐ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ์ํฌํธ ๋งต์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ๋ฐ์๋ค์ด๊ณ ์ค๋ ๋ฐ๋ก ๋ชจ๋ ํด์์ ์ ์ดํด ๋ณด์ธ์!