์ํฌํธ ๋งต์ผ๋ก ํจ์จ์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ํด์์ ๊ฒฝํํ์ธ์. ์ด ๋ธ๋ผ์ฐ์ ๋ค์ดํฐ๋ธ ๊ธฐ๋ฅ์ด ์ด๋ป๊ฒ ์์กด์ฑ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ๊ณ , ์ํฌํธ๋ฅผ ์ ๋ฆฌํ๋ฉฐ, ๊ธ๋ก๋ฒ ์น ํ๋ก์ ํธ์ ๊ฐ๋ฐ์ ๊ฒฝํ์ ํฅ์์ํค๋์ง ์์๋ณด์ธ์.
์๋ฐ์คํฌ๋ฆฝํธ ์ํฌํธ ๋งต(Import Maps): ์ ์ธ๊ณ ์น์ ์ํ ๋ชจ๋ ํด์ ๋ฐ ์์กด์ฑ ๊ด๋ฆฌ์ ํ์
๊ดํํ๊ณ ์ํธ ์ฐ๊ฒฐ๋ ํ๋ ์น ๊ฐ๋ฐ ํ๊ฒฝ์์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋๊ณผ ๊ทธ ์์กด์ฑ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ, ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์กดํ๋ ๋ค์ํ ์ฝ๋ ํจํค์ง๋ฅผ ๋ก๋ํ๊ณ , ํด์ํ๋ฉฐ, ์ ๋ฐ์ดํธํ๋ ๊ฒ๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ๋ค๋ ํจ๊ป ์ปค์ง๋๋ค. ๋๋ฅ์ ๋์ด ๋ถ์ฐ๋ ๊ฐ๋ฐํ์ด ๋๊ท๋ชจ ํ๋ก์ ํธ์์ ํ์ ํ ๋, ์ด๋ฌํ ๋ฌธ์ ๋ค์ ์์ฐ์ฑ, ์ ์ง๋ณด์์ฑ, ๊ทธ๋ฆฌ๊ณ ๊ถ๊ทน์ ์ผ๋ก ์ต์ข ์ฌ์ฉ์ ๊ฒฝํ์ ์ํฅ์ ๋ฏธ์น๋ฉฐ ์ฆํญ๋ ์ ์์ต๋๋ค.
์ด๋ ๋ฑ์ฅํ ๊ฒ์ด ๋ฐ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ์ํฌํธ ๋งต(JavaScript Import Maps)์ ๋๋ค. ์ด ๊ฐ๋ ฅํ ๋ธ๋ผ์ฐ์ ๋ค์ดํฐ๋ธ ๊ธฐ๋ฅ์ ์ฐ๋ฆฌ๊ฐ ๋ชจ๋ ํด์ ๋ฐ ์์กด์ฑ ๊ด๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ๊ทผ๋ณธ์ ์ผ๋ก ๋ฐ๊ฟ ๊ฒ์ ์ฝ์ํฉ๋๋ค. ์ํฌํธ ๋งต์ ๋ฒ ์ด ๋ชจ๋ ์ง์ ์(bare module specifier)๊ฐ ์ค์ URL๋ก ํด์๋๋ ๋ฐฉ์์ ์ ์ดํ๋ ์ ์ธ์ ๋ฐฉ๋ฒ์ ์ ๊ณตํจ์ผ๋ก์จ, ์ค๋ ๊ณจ์นซ๊ฑฐ๋ฆฌ์ ๋ํ ์ฐ์ํ ํด๊ฒฐ์ฑ ์ ์ ์ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ๋ฅผ ๊ฐ์ํํ๊ณ , ์ฑ๋ฅ์ ํฅ์์ํค๋ฉฐ, ์ ์ธ๊ณ ๋ชจ๋ ์ฌ๋์ ์ํด ๋ ๊ฒฌ๊ณ ํ๊ณ ์ ๊ทผ์ฑ ๋์ ์น ์ํ๊ณ๋ฅผ ์กฐ์ฑํฉ๋๋ค.
์ด ์ข ํฉ ๊ฐ์ด๋์์๋ ์ํฌํธ ๋งต์ ๋ณต์กํ ๋ด์ฉ๋ค์ ๊น์ด ํ๊ณ ๋ค์ด, ์ํฌํธ ๋งต์ด ํด๊ฒฐํ๋ ๋ฌธ์ ๋ค, ์ค์ ์ ์ฉ ์ฌ๋ก, ๊ทธ๋ฆฌ๊ณ ๊ธ๋ก๋ฒ ๊ฐ๋ฐํ์ด ๋ ํ๋ ฅ ์๊ณ ์ฑ๋ฅ ์ข์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ด๋ป๊ฒ ํ์ ์ค์ด์ค ์ ์๋์ง ํ๊ตฌํ ๊ฒ์ ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ํด์์ ์ค๋ ๊ณผ์
์ํฌํธ ๋งต์ ์ฐ์ํจ์ ์์ ํ ์ดํดํ๊ธฐ ์ ์, ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ํด์์ ๊ดด๋กญํ์จ ์ญ์ฌ์ ๋งฅ๋ฝ๊ณผ ์ง์์ ์ธ ๊ณผ์ ๋ค์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์ ์ญ ์ค์ฝํ์์ ES ๋ชจ๋๊น์ง: ๊ฐ๋ตํ ์ญ์ฌ
- ์ด์ฐฝ๊ธฐ (์ ์ญ ์ค์ฝํ & <script> ํ๊ทธ): ์น์ ์ฌ๋ช
๊ธฐ์๋ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋ณดํต ๊ฐ๋จํ
<script>ํ๊ทธ๋ฅผ ํตํด ๋ก๋๋์๊ณ , ๋ชจ๋ ๋ณ์๋ ์ ์ญ ์ค์ฝํ์ ์์์ก์ต๋๋ค. ์์กด์ฑ์ ์คํฌ๋ฆฝํธ๊ฐ ์ฌ๋ฐ๋ฅธ ์์๋ก ๋ก๋๋๋๋ก ์๋์ผ๋ก ๊ด๋ฆฌ๋์์ต๋๋ค. ์ด ๋ฐฉ์์ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ๊ธ๋ฐฉ ๊ด๋ฆฌ ๋ถ๊ฐ๋ฅํด์ก๊ณ , ์ด๋ฆ ์ถฉ๋๊ณผ ์์ธก ๋ถ๊ฐ๋ฅํ ๋์์ผ๋ก ์ด์ด์ก์ต๋๋ค. - IIFE์ ๋ชจ๋ ํจํด์ ๋ถ์: ์ ์ญ ์ค์ฝํ ์ค์ผ์ ์ํํ๊ธฐ ์ํด ๊ฐ๋ฐ์๋ค์ ์ฆ์ ์คํ ํจ์ ํํ์(IIFE)๊ณผ ๋ค์ํ ๋ชจ๋ ํจํด(์: ๋๋ฌ๋๋ ๋ชจ๋ ํจํด)์ ์ฑํํ์ต๋๋ค. ์ด๋ ๋ ๋์ ์บก์ํ๋ฅผ ์ ๊ณตํ์ง๋ง, ์์กด์ฑ ๊ด๋ฆฌ๋ ์ฌ์ ํ ์ ์คํ ์๋ ์์ ์ง์ ์ด๋ ์ปค์คํ ๋ก๋๋ฅผ ํ์๋ก ํ์ต๋๋ค.
- ์๋ฒ ์ฌ์ด๋ ์๋ฃจ์
(CommonJS, AMD, UMD): Node.js ํ๊ฒฝ์ ๋๊ธฐ์ ๋ชจ๋ ๋ก๋ฉ ์์คํ
(
require(),module.exports)์ ์ ๊ณตํ๋ CommonJS๋ฅผ ๋์ ํ์ต๋๋ค. ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํด์๋ RequireJS์ ๊ฐ์ ๋๊ตฌ์ ํจ๊ป ๋น๋๊ธฐ ๋ชจ๋ ์ ์(AMD)๊ฐ ๋ฑ์ฅํ๊ณ , ๋ฒ์ฉ ๋ชจ๋ ์ ์(UMD)๋ CommonJS์ AMD ์ฌ์ด์ ๊ฐ๊ทน์ ๋ฉ์ฐ๋ ค ์๋ํ๋ฉฐ ๋ชจ๋์ด ๋ค์ํ ํ๊ฒฝ์์ ์คํ๋ ์ ์๋๋ก ํ์ต๋๋ค. ํ์ง๋ง ์ด๋ฌํ ํด๊ฒฐ์ฑ ๋ค์ ๋ณดํต ๋ค์ดํฐ๋ธ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฅ์ด ์๋ ์ ์ ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ต๋๋ค. - ES ๋ชจ๋(ESM) ํ๋ช
: ECMAScript 2015(ES6)์ ํจ๊ป ๋ค์ดํฐ๋ธ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋(ESM)์ด ๋ง์นจ๋ด ํ์คํ๋์ด
import์export๊ตฌ๋ฌธ์ ์ธ์ด์ ์ง์ ๋์ ํ์ต๋๋ค. ์ด๋ ๋ธ๋ผ์ฐ์ ์ Node.js ๋ชจ๋์ ํ์คํ๋๊ณ ์ ์ธ์ ์ด๋ฉฐ ๋น๋๊ธฐ์ ์ธ ๋ชจ๋ ์์คํ ์ ๊ฐ์ ธ์จ ๊ธฐ๋ ๋น์ ์ธ ์ง์ ์ด์์ต๋๋ค. ์ด์ ๋ธ๋ผ์ฐ์ ๋<script type="module">์ ํตํด ESM์ ๋ค์ดํฐ๋ธ๋ก ์ง์ํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ๋ค์ดํฐ๋ธ ES ๋ชจ๋์ ํ์ฌ ์ฅ์ ๋ฌผ
๋ค์ดํฐ๋ธ ES ๋ชจ๋์ด ์๋นํ ์ด์ ์ ์ ๊ณตํ์ง๋ง, ๋ธ๋ผ์ฐ์ ์์์ ์ฑํ์ ํนํ ์์กด์ฑ ๊ด๋ฆฌ ๋ฐ ๊ฐ๋ฐ์ ๊ฒฝํ๊ณผ ๊ด๋ จํ์ฌ ์๋ก์ด ์ค์ฉ์ ์ธ ๋ฌธ์ ๋ค์ ๋๋ฌ๋์ต๋๋ค:
-
์๋ ๊ฒฝ๋ก์ ์ฅํฉํจ: ๋ก์ปฌ ๋ชจ๋์ ๊ฐ์ ธ์ฌ ๋, ์ข ์ข ์ฅํฉํ ์๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค:
import { someFunction } from './../../utils/helpers.js'; import { AnotherComponent } from '../components/AnotherComponent.js';์ด ์ ๊ทผ ๋ฐฉ์์ ๊นจ์ง๊ธฐ ์ฝ์ต๋๋ค. ํ์ผ์ ์ด๋ํ๊ฑฐ๋ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ฆฌํฉํ ๋งํ๋ฉด ์ฝ๋๋ฒ ์ด์ค ์ ์ฒด์ ๊ฑธ์ณ ์๋ง์ import ๊ฒฝ๋ก๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํฉ๋๋ค. ์ด๋ ์ด๋ค ๊ฐ๋ฐ์์๊ฒ๋, ํนํ ๊ธ๋ก๋ฒ ํ๋ก์ ํธ์์ ์์ ํ๋ ๋๊ท๋ชจ ํ์๊ฒ๋ ํํ๊ณ ์ข์ ์ค๋ฌ์ด ์์ ์ ๋๋ค. ํนํ ๋ค๋ฅธ ํ์๋ค์ด ๋์์ ํ๋ก์ ํธ์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ฌ๊ตฌ์ฑํ ์ ์์ ๋ ์๋นํ ์๊ฐ ๋ญ๋น๊ฐ ๋ฉ๋๋ค.
-
๋ฒ ์ด ๋ชจ๋ ์ง์ ์: ๋น ์ง ์กฐ๊ฐ: Node.js์์๋ ๋ณดํต
import React from 'react';์ ๊ฐ์ "๋ฒ ์ด ๋ชจ๋ ์ง์ ์(bare module specifiers)"๋ฅผ ์ฌ์ฉํ์ฌ ์๋ํํฐ ํจํค์ง๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. Node.js ๋ฐํ์์'react'๋ฅผ ์ค์น๋node_modules/reactํจํค์ง๋ก ํด์ํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์์ต๋๋ค. ํ์ง๋ง ๋ธ๋ผ์ฐ์ ๋ ๋ณธ์ง์ ์ผ๋ก ๋ฒ ์ด ๋ชจ๋ ์ง์ ์๋ฅผ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ์ ์ฒด URL์ด๋ ์๋ ๊ฒฝ๋ก๋ฅผ ๊ธฐ๋ํฉ๋๋ค. ์ด๋ก ์ธํด ๊ฐ๋ฐ์๋ค์ ์ ์ฒด URL(์ข ์ข CDN์ ๊ฐ๋ฆฌํด)์ ์ฌ์ฉํ๊ฑฐ๋, ๋น๋ ๋๊ตฌ์ ์์กดํ์ฌ ์ด๋ฌํ ๋ฒ ์ด ์ง์ ์๋ฅผ ์ฌ์์ฑํด์ผ ํฉ๋๋ค:// ๋ธ๋ผ์ฐ์ ๋ 'react'๋ฅผ ์ดํดํ์ง ๋ชปํฉ๋๋ค import React from 'react'; // ๋์ , ํ์ฌ๋ ๋ค์๊ณผ ๊ฐ์ด ํด์ผ ํฉ๋๋ค: import React from 'https://unpkg.com/react@18/umd/react.production.min.js';CDN์ด ๊ธ๋ก๋ฒ ๋ฐฐํฌ์ ์บ์ฑ์ ํ์์ ์ด๊ธด ํ์ง๋ง, ๋ชจ๋ import ๋ฌธ์ CDN URL์ ์ง์ ํ๋์ฝ๋ฉํ๋ ๊ฒ์ ๊ทธ ์์ฒด๋ก ๋ฌธ์ ๋ฅผ ๋ง๋ญ๋๋ค. CDN URL์ด ๋ณ๊ฒฝ๋๋ฉด ์ด๋ป๊ฒ ํ ๊น์? ๋ค๋ฅธ ๋ฒ์ ์ผ๋ก ์ ํํ๊ณ ์ถ๋ค๋ฉด์? ํ๋ก๋์ CDN ๋์ ๋ก์ปฌ ๊ฐ๋ฐ ๋น๋๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? ์ด๋ ํนํ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์งํํ๋ ์์กด์ฑ์ ๊ฐ์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ง ๊ด๋ฆฌํ๋ ๋ฐ ์์ด ์ฌ์ํ ๋ฌธ์ ๊ฐ ์๋๋๋ค.
-
์์กด์ฑ ๋ฒ์ ๊ด๋ฆฌ ๋ฐ ์ถฉ๋: ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ์ฌ๋ฌ ์ํธ ์์กด์ ์ธ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋์ ๊ฑธ์ณ ๊ณต์ ์์กด์ฑ์ ๋ฒ์ ์ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ ๋ชฝ์ด ๋ ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ๋ค์ด ์ค์๋ก ๋์ผํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ค๋ฅธ ๋ฒ์ ์ ๊ฐ์ ธ์ ์๊ธฐ์น ์์ ๋์, ๋ฒ๋ค ํฌ๊ธฐ ์ฆ๊ฐ, ํธํ์ฑ ๋ฌธ์ ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์ด๋ ๋ค์ํ ํ์ด ๋ณต์กํ ์์คํ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ ์ง ๊ด๋ฆฌํ ์ ์๋ ๋๊ท๋ชจ ์กฐ์ง์์ ํํ ๋ฌธ์ ์ ๋๋ค.
-
๋ก์ปฌ ๊ฐ๋ฐ ๋ ํ๋ก๋์ ๋ฐฐํฌ: ๊ฐ๋ฐ ์ค์๋ ๋ก์ปฌ ํ์ผ(์:
node_modules๋๋ ๋ก์ปฌ ๋น๋์์ ๊ฐ์ ธ์ค๊ธฐ)์ ์ฌ์ฉํ๊ณ , ํ๋ก๋์ ๋ฐฐํฌ ์์๋ ๊ธ๋ก๋ฒ ์บ์ฑ ๋ฐ ๋ฐฐํฌ๋ฅผ ํ์ฉํ๊ธฐ ์ํด CDN URL๋ก ์ ํํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ธ ํจํด์ ๋๋ค. ์ด๋ฌํ ์ ํ์ ์ข ์ข ๋ณต์กํ ๋น๋ ๊ตฌ์ฑ์ด๋ ์๋ ์ฐพ๊ธฐ-๋ฐ๊พธ๊ธฐ ์์ ์ ํ์๋ก ํ์ฌ ๊ฐ๋ฐ ๋ฐ ๋ฐฐํฌ ํ์ดํ๋ผ์ธ์ ๋ง์ฐฐ์ ๋ํฉ๋๋ค. -
๋ชจ๋ ธ๋ ํฌ์ ๋ด๋ถ ํจํค์ง: ์ฌ๋ฌ ํ๋ก์ ํธ๋ ํจํค์ง๊ฐ ๋จ์ผ ์ ์ฅ์์ ์๋ ๋ชจ๋ ธ๋ ํฌ ์ค์ ์์, ๋ด๋ถ ํจํค์ง๋ค์ ์ข ์ข ์๋ก๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค. ์ํฌํธ ๋งต๊ณผ ๊ฐ์ ๋ฉ์ปค๋์ฆ ์์ด๋, ์ด๋ ๋ณต์กํ ์๋ ๊ฒฝ๋ก๋ฅผ ํฌํจํ๊ฑฐ๋, ๊นจ์ง๊ธฐ ์ฝ๊ณ ๊ฐ๋ฐ ํ๊ฒฝ ์ ๋ฐ์ ๊ฑธ์ณ ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์ด `npm link`(๋๋ ์ ์ฌํ ๋๊ตฌ)์ ์์กดํด์ผ ํ ์ ์์ต๋๋ค.
์ด๋ฌํ ๊ณผ์ ๋ค์ ์ด์ฒด์ ์ผ๋ก ๋ชจ๋ ํด์์ ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์์ ์๋นํ ๋ง์ฐฐ์ ์์ธ์ผ๋ก ๋ง๋ญ๋๋ค. ์ด๋ค์ ๋ชจ๋์ ์ ์ฒ๋ฆฌํ๊ณ ๋ฒ๋ค๋งํ๊ธฐ ์ํด ๋ณต์กํ ๋น๋ ๋๊ตฌ(Webpack, Rollup, Parcel, Vite ๋ฑ)๋ฅผ ํ์๋ก ํ๋ฉฐ, ์ด๋ ์ข ์ข ๊ธฐ๋ณธ ๋ชจ๋ ๊ทธ๋ํ๋ฅผ ๋ชจํธํ๊ฒ ๋ง๋๋ ์ถ์ํ์ ๋ณต์ก์ฑ์ ๊ณ์ธต์ ์ถ๊ฐํฉ๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ค์ด ๋ฏฟ์ ์ ์์ ์ ๋๋ก ๊ฐ๋ ฅํ์ง๋ง, ํนํ ๊ฐ๋ฐ ์ค์ ๋ฌด๊ฑฐ์ด ๋น๋ ๋จ๊ณ์ ๋ํ ์์กด์ฑ์ ์ค์ด๋ ๋ ๊ฐ๋จํ๊ณ ๋ค์ดํฐ๋ธํ ์๋ฃจ์ ์ ๋ํ ์๊ตฌ๊ฐ ์ปค์ง๊ณ ์์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์ํฌํธ ๋งต ์๊ฐ: ๋ค์ดํฐ๋ธ ์๋ฃจ์
์ํฌํธ ๋งต์ ์ด๋ฌํ ์ง์์ ์ธ ๋ชจ๋ ํด์ ๋ฌธ์ ์ ๋ํ ๋ธ๋ผ์ฐ์ ์ ๋ค์ดํฐ๋ธ ๋ต๋ณ์ผ๋ก ๋ฑ์ฅํฉ๋๋ค. ์น ์ธํ๋ฒ ์ดํฐ ์ปค๋ฎค๋ํฐ ๊ทธ๋ฃน(WICG)์ ์ํด ํ์คํ๋ ์ํฌํธ ๋งต์ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์ ํด์ํ๋ ๋ฐฉ๋ฒ์ ์ ์ดํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ฉฐ, ๋ชจ๋ ์ง์ ์๋ฅผ ์ค์ URL์ ๋งคํํ๋ ๊ฐ๋ ฅํ๊ณ ์ ์ธ์ ์ธ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
์ํฌํธ ๋งต์ด๋ ๋ฌด์์ธ๊ฐ?
ํต์ฌ์ ์ผ๋ก, ์ํฌํธ ๋งต์ HTML์ <script type="importmap"> ํ๊ทธ ๋ด์ ์ ์๋ JSON ๊ฐ์ฒด์
๋๋ค. ์ด JSON ๊ฐ์ฒด๋ ๋ธ๋ผ์ฐ์ ์๊ฒ ํน์ ๋ชจ๋ ์ง์ ์(ํนํ ๋ฒ ์ด ๋ชจ๋ ์ง์ ์)๋ฅผ ํด๋น ์ ์ฒด URL๋ก ํด์ํ๋ ๋ฐฉ๋ฒ์ ์๋ ค์ฃผ๋ ๋งคํ์ ํฌํจํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ import๋ฅผ ์ํ ๋ธ๋ผ์ฐ์ ๋ค์ดํฐ๋ธ ๋ณ์นญ ์์คํ
์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
๋ธ๋ผ์ฐ์ ๋ ๋ชจ๋์ ๊ฐ์ ธ์ค๊ธฐ ์์ํ๊ธฐ *์ ์* ์ด ์ํฌํธ ๋งต์ ํ์ฑํฉ๋๋ค. import ๋ฌธ(์: import { SomeFeature } from 'my-library';)์ ๋ง๋๋ฉด, ๋จผ์ ์ํฌํธ ๋งต์ ํ์ธํฉ๋๋ค. ์ผ์นํ๋ ํญ๋ชฉ์ด ๋ฐ๊ฒฌ๋๋ฉด ์ ๊ณต๋ URL์ ์ฌ์ฉํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ํ์ค ์๋/์ ๋ URL ํด์์ผ๋ก ๋์ฒด๋ฉ๋๋ค.
ํต์ฌ ์์ด๋์ด: ๋ฒ ์ด ์ง์ ์ ๋งคํ
์ํฌํธ ๋งต์ ์ฃผ๋ ํ์ ๋ฒ ์ด ๋ชจ๋ ์ง์ ์๋ฅผ ๋งคํํ๋ ๋ฅ๋ ฅ์ ์์ต๋๋ค. ์ด๋ ๋ง์นจ๋ด ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ ES ๋ชจ๋์์ ๊น๋ํ Node.js ์คํ์ผ์ import๋ฅผ ์์ฑํ ์ ์์์ ์๋ฏธํฉ๋๋ค:
์ํฌํธ ๋งต ์์ด:
// ๋งค์ฐ ๊ตฌ์ฒด์ ์ด๊ณ ๊นจ์ง๊ธฐ ์ฌ์ด ๊ฒฝ๋ก ๋๋ CDN URL
import { render } from 'https://cdn.jsdelivr.net/npm/lit-html@2.8.0/lit-html.js';
import { globalConfig } from '../../config/global.js';
์ํฌํธ ๋งต ์ฌ์ฉ:
// ๊น๋ํ๊ณ ์ด์์ฑ ์๋ ๋ฒ ์ด ์ง์ ์
import { render } from 'lit-html';
import { globalConfig } from 'app-config/global';
์ด ์ฌ์ํด ๋ณด์ด๋ ๋ณํ๋ ๊ฐ๋ฐ์ ๊ฒฝํ, ํ๋ก์ ํธ ์ ์ง๋ณด์์ฑ, ๊ทธ๋ฆฌ๊ณ ์ ๋ฐ์ ์ธ ์น ๊ฐ๋ฐ ์ํ๊ณ์ ์ฌ์คํ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์ฝ๋๋ฅผ ๋จ์ํํ๊ณ , ๋ฆฌํฉํ ๋ง ๋ ธ๋ ฅ์ ์ค์ด๋ฉฐ, ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋์ ๋ค๋ฅธ ํ๊ฒฝ๊ณผ ๋ฐฐํฌ ์ ๋ต์ ๊ฑธ์ณ ๋ ์ด์์ฑ ์๊ฒ ๋ง๋ญ๋๋ค.
์ํฌํธ ๋งต์ ๊ตฌ์กฐ: ๊ตฌ์กฐ ํ์
์ํฌํธ ๋งต์ imports์ scopes๋ผ๋ ๋ ๊ฐ์ ์ฃผ์ ์ต์์ ํค๋ฅผ ๊ฐ์ง JSON ๊ฐ์ฒด์
๋๋ค.
<script type="importmap"> ํ๊ทธ
์ํฌํธ ๋งต์ HTML ๋ฌธ์, ๋ณดํต <head> ์น์
์ ์ ์๋๋ฉฐ, ์ด๋ฅผ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ๋ชจ๋ ์คํฌ๋ฆฝํธ๋ณด๋ค ์์ ์์นํฉ๋๋ค. ํ์ด์ง์๋ ์ฌ๋ฌ ๊ฐ์ <script type="importmap"> ํ๊ทธ๊ฐ ์์ ์ ์์ผ๋ฉฐ, ๋ธ๋ผ์ฐ์ ๋ ๋ํ๋๋ ์์๋๋ก ์ด๋ฅผ ๋ณํฉํฉ๋๋ค. ๋์ค์ ๋งต์ด ์ด์ ์ ๋งคํ์ ๋ฎ์ด์ธ ์ ์์ต๋๋ค. ํ์ง๋ง, ์ข
์ข
๋จ์ผ์ ํฌ๊ด์ ์ธ ๋งต์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋ ๊ฐ๋จํฉ๋๋ค.
์ ์ ์์:
<script type="importmap">
{
"imports": {
"react": "https://unpkg.com/react@18/umd/react.production.min.js",
"react-dom": "https://unpkg.com/react-dom@18/umd/react-dom.production.min.js",
"lodash-es/": "https://unpkg.com/lodash-es@4.17.21/",
"./utils/": "/assets/js/utils/"
},
"scopes": {
"/admin/": {
"react": "https://unpkg.com/react@17/umd/react.production.min.js"
}
}
}
</script>
imports ํ๋: ์ ์ญ ๋งคํ
imports ํ๋๋ ์ํฌํธ ๋งต์์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ถ๋ถ์
๋๋ค. ํค๋ ๋ชจ๋ ์ง์ ์(import ๋ฌธ์ ์์ฑํ๋ ๋ฌธ์์ด)์ด๊ณ ๊ฐ์ ํด๋น ์ง์ ์๊ฐ ํด์๋์ด์ผ ํ URL์ธ ๊ฐ์ฒด์
๋๋ค. ํค์ ๊ฐ ๋ชจ๋ ๋ฌธ์์ด์ด์ด์ผ ํฉ๋๋ค.
1. ๋ฒ ์ด ๋ชจ๋ ์ง์ ์ ๋งคํ: ์ด๊ฒ์ด ๊ฐ์ฅ ๊ฐ๋จํ๊ณ ๊ฐ๋ ฅํ ์ฌ์ฉ ์ฌ๋ก์ ๋๋ค.
- ํค: ๋ฒ ์ด ๋ชจ๋ ์ง์ ์ (์:
"my-library"). - ๊ฐ: ๋ชจ๋์ ์ ๋ ๋๋ ์๋ URL (์:
"https://cdn.example.com/my-library.js"๋๋"/node_modules/my-library/index.js").
์์:
"imports": {
"vue": "https://unpkg.com/vue@3/dist/vue.esm-browser.js",
"d3": "https://cdn.skypack.dev/d3@7"
}
์ด ๋งต์ ์ฌ์ฉํ๋ฉด, import Vue from 'vue'; ๋๋ import * as d3 from 'd3';๋ฅผ ํฌํจํ๋ ๋ชจ๋ ๋ชจ๋์ด ์ง์ ๋ CDN URL๋ก ์ฌ๋ฐ๋ฅด๊ฒ ํด์๋ฉ๋๋ค.
2. ์ ๋์ฌ(ํ์ ๊ฒฝ๋ก) ๋งคํ: ์ํฌํธ ๋งต์ ์ ๋์ฌ๋ ๋งคํํ ์ ์์ด, ๋ชจ๋์ ํ์ ๊ฒฝ๋ก๋ฅผ ํด์ํ ์ ์์ต๋๋ค. ์ด๋ ์ฌ๋ฌ ์ง์ ์ ์ ๋ ธ์ถํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋ก์ ํธ์ ๋ด๋ถ ๋ชจ๋์ ๊ตฌ์ฑํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
- ํค: ์ฌ๋์๋ก ๋๋๋ ๋ชจ๋ ์ง์ ์ (์:
"my-utils/"). - ๊ฐ: ์ฌ๋์๋ก ๋๋๋ URL (์:
"/src/utility-functions/").
๋ธ๋ผ์ฐ์ ๊ฐ ํค๋ก ์์ํ๋ import๋ฅผ ๋ง๋๋ฉด, ํค๋ฅผ ๊ฐ์ผ๋ก ๋ฐ๊พธ๊ณ ์ง์ ์์ ๋๋จธ์ง ๋ถ๋ถ์ ๊ฐ์ ์ถ๊ฐํฉ๋๋ค.
์์:
"imports": {
"lodash/": "https://cdn.jsdelivr.net/npm/lodash-es@4.17.21/",
"@my-org/components/": "/js/shared-components/"
}
์ด๋ฅผ ํตํด ๋ค์๊ณผ ๊ฐ์ import๋ฅผ ์์ฑํ ์ ์์ต๋๋ค:
import { debounce } from 'lodash/debounce'; // https://cdn.jsdelivr.net/npm/lodash-es@4.17.21/debounce.js๋ก ํด์๋ฉ๋๋ค
import { Button } from '@my-org/components/Button'; // /js/shared-components/Button.js๋ก ํด์๋ฉ๋๋ค
์ ๋์ฌ ๋งคํ์ ์ฝ๋๋ฒ ์ด์ค ๋ด์ ๋ณต์กํ ์๋ ๊ฒฝ๋ก์ ํ์์ฑ์ ํฌ๊ฒ ์ค์ฌ์ฃผ์ด, ํนํ ๋ง์ ๋ด๋ถ ๋ชจ๋์ ๊ฐ์ง ๋๊ท๋ชจ ํ๋ก์ ํธ์์ ์ฝ๋๋ฅผ ํจ์ฌ ๊น๋ํ๊ณ ํ์ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
scopes ํ๋: ๋ฌธ๋งฅ์ ํด์
scopes ํ๋๋ ์กฐ๊ฑด๋ถ ๋ชจ๋ ํด์์ ์ํ ๊ณ ๊ธ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ *๊ฐ์ ธ์ค๋* ๋ชจ๋์ URL์ ๋ฐ๋ผ ๋์ผํ ๋ชจ๋ ์ง์ ์์ ๋ํด ๋ค๋ฅธ ๋งคํ์ ์ง์ ํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ ์์กด์ฑ ์ถฉ๋ ์ฒ๋ฆฌ, ๋ชจ๋
ธ๋ ํฌ ๊ด๋ฆฌ, ๋๋ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋ ๋ด ์์กด์ฑ ๊ฒฉ๋ฆฌ์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
- ํค: ๊ฐ์ ธ์ค๋ ๋ชจ๋์ ๊ฒฝ๋ก๋ฅผ ๋ํ๋ด๋ URL ์ ๋์ฌ("์ค์ฝํ").
- ๊ฐ: ํด๋น ์ค์ฝํ์ ํน์ ํ ๋งคํ์ ํฌํจํ๋,
importsํ๋์ ์ ์ฌํ ๊ฐ์ฒด.
๋ธ๋ผ์ฐ์ ๋ ๋จผ์ ๊ฐ์ฅ ๊ตฌ์ฒด์ ์ผ๋ก ์ผ์นํ๋ ์ค์ฝํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์ง์ ์๋ฅผ ํด์ํ๋ ค๊ณ ์๋ํฉ๋๋ค. ์ผ์นํ๋ ๊ฒ์ด ์์ผ๋ฉด ๋ ๋์ ์ค์ฝํ๋ก, ๋ง์ง๋ง์ผ๋ก ์ต์์ imports ๋งต์ผ๋ก ๋์ฒด๋ฉ๋๋ค. ์ด๋ ๊ฐ๋ ฅํ ๊ณ๋จ์ ํด์ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
์์: ๋ฒ์ ์ถฉ๋ ์ฒ๋ฆฌ
์ ํ๋ฆฌ์ผ์ด์
์ ๋๋ถ๋ถ ์ฝ๋๊ฐ react@18์ ์ฌ์ฉํ์ง๋ง, ์ค๋๋ ๋ ๊ฑฐ์ ์น์
(์: /admin/ ์๋์ ๊ด๋ฆฌ์ ํจ๋)์ ์ฌ์ ํ react@17์ ํ์๋ก ํ๋ค๊ณ ์์ํด ๋ณด์ธ์.
"imports": {
"react": "https://unpkg.com/react@18/umd/react.production.min.js",
"react-dom": "https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"
},
"scopes": {
"/admin/": {
"react": "https://unpkg.com/react@17/umd/react.production.min.js",
"react-dom": "https://unpkg.com/react-dom@17/umd/react-dom.production.min.js"
}
}
์ด ๋งต์ ์ฌ์ฉํ๋ฉด:
/src/app.js์ ์๋import React from 'react';๋ฅผ ํฌํจํ๋ ๋ชจ๋์ React 18๋ก ํด์๋ฉ๋๋ค./admin/dashboard.js์ ์๋import React from 'react';๋ฅผ ํฌํจํ๋ ๋ชจ๋์ React 17๋ก ํด์๋ฉ๋๋ค.
์ด ๊ธฐ๋ฅ์ ๋ณต์กํ ๋ฒ๋ค๋ง ์ ๋ต์ด๋ ์ค๋ณต ์ฝ๋ ๋ฐฐํฌ์ ์์กดํ์ง ์๊ณ ๋, ๋๊ท๋ชจ์ ์ ์ธ๊ณ์ ์ผ๋ก ๊ฐ๋ฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ๋ค์ด ์ถฉ๋ํ๋ ์์กด์ฑ ์๊ตฌ ์ฌํญ์ ๊ฐ์ง ๋์๋ ์ฐ์ํ๊ฒ ๊ณต์กดํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ ๋๊ท๋ชจ, ์ ์ง์ ์ผ๋ก ์ ๋ฐ์ดํธ๋๋ ์น ํ๋ก์ ํธ์ ์์ด ๊ฒ์ ์ฒด์ธ์ ์ ๋๋ค.
์ค์ฝํ์ ๋ํ ์ค์ ๊ณ ๋ ค์ฌํญ:
- ์ค์ฝํ URL์ *๊ฐ์ ธ์ค๋* ๋ชจ๋์ URL์ ๋ํ ์ ๋์ฌ ์ผ์น์ ๋๋ค.
- ๋ ๊ตฌ์ฒด์ ์ธ ์ค์ฝํ๊ฐ ๋ ๊ตฌ์ฒด์ ์ธ ์ค์ฝํ๋ณด๋ค ์ฐ์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด,
"/admin/users/"์ค์ฝํ ๋ด์ ๋งคํ์"/admin/"์ ๋งคํ์ ๋ฎ์ด์๋๋ค. - ์ค์ฝํ๋ ์ค์ฝํ์ ๋งคํ ๋ด์ ๋ช
์์ ์ผ๋ก ์ ์ธ๋ ๋ชจ๋์๋ง ์ ์ฉ๋ฉ๋๋ค. ์ค์ฝํ ๋ด์์ ๋งคํ๋์ง ์์ ๋ชจ๋ ๋ชจ๋์ ์ ์ญ
imports๋ ํ์ค ํด์์ผ๋ก ๋์ฒด๋ฉ๋๋ค.
์ค์ฉ์ ์ธ ์ฌ์ฉ ์ฌ๋ก์ ํ์ ์ ์ธ ์ด์
์ํฌํธ ๋งต์ ๋จ์ํ ๊ตฌ๋ฌธ์ ํธ์๊ฐ ์๋๋๋ค. ํนํ ๊ตญ์ ํ๊ณผ ๋ณต์กํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฑธ์ณ ์ ์ฒด ๊ฐ๋ฐ ์๋ช ์ฃผ๊ธฐ์ ์ฌ์คํ ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
1. ๋จ์ํ๋ ์์กด์ฑ ๊ด๋ฆฌ
-
์ค์ ์ง์ค์ ์ ์ด: ๋ชจ๋ ์ธ๋ถ ๋ชจ๋ ์์กด์ฑ์ ํ ๊ณณ, ์ฆ ์ํฌํธ ๋งต์ ์ ์ธ๋ฉ๋๋ค. ์ด๋ ์์น์ ์๊ด์์ด ๋ชจ๋ ๊ฐ๋ฐ์๊ฐ ํ๋ก์ ํธ ์์กด์ฑ์ ์ฝ๊ฒ ์ดํดํ๊ณ ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ค๋๋ค.
-
์์ฌ์ด ๋ฒ์ ์ ๊ทธ๋ ์ด๋/๋ค์ด๊ทธ๋ ์ด๋: Lit Element์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฒ์ 2์์ 3์ผ๋ก ์ ๊ทธ๋ ์ด๋ํด์ผ ํฉ๋๊น? ์ํฌํธ ๋งต์์ URL ํ๋๋ง ๋ณ๊ฒฝํ๋ฉด, ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ ๋ชจ๋์ด ์ฆ์ ์ ๋ฒ์ ์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ์๋ ์ ๋ฐ์ดํธ๋ ๋ณต์กํ ๋น๋ ๋๊ตฌ ๊ตฌ์ฑ์ ๋นํด ์์ฒญ๋ ์๊ฐ ์ ์ฝ์ด๋ฉฐ, ํนํ ์ฌ๋ฌ ํ์ ํ๋ก์ ํธ๊ฐ ๊ณตํต ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ณต์ ํ ๋ ๋์ฑ ๊ทธ๋ ์ต๋๋ค.
// ์ด์ (Lit 2) "lit-html": "https://cdn.jsdelivr.net/npm/lit-html@2/lit-html.js" // ์ ๊ท (Lit 3) "lit-html": "https://cdn.jsdelivr.net/npm/lit-html@3/lit-html.js" -
์ํํ ๋ก์ปฌ ๊ฐ๋ฐ ๋ ํ๋ก๋์ : ๋ก์ปฌ ๊ฐ๋ฐ ๋น๋์ ํ๋ก๋์ CDN URL ์ฌ์ด๋ฅผ ์ฝ๊ฒ ์ ํํ ์ ์์ต๋๋ค. ๊ฐ๋ฐ ์ค์๋ ๋ก์ปฌ ํ์ผ(์:
node_modules๋ณ์นญ ๋๋ ๋ก์ปฌ ๋น๋ ์ถ๋ ฅ)์ ๋งคํํฉ๋๋ค. ํ๋ก๋์ ์ ์ํด์๋ ๋งต์ ๊ณ ๋๋ก ์ต์ ํ๋ CDN ๋ฒ์ ์ ๊ฐ๋ฆฌํค๋๋ก ์ ๋ฐ์ดํธํฉ๋๋ค. ์ด๋ฌํ ์ ์ฐ์ฑ์ ๊ธ๋ก๋ฒ ํ ์ ๋ฐ์ ๋ค์ํ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ง์ํฉ๋๋ค.์์:
๊ฐ๋ฐ ์ํฌํธ ๋งต:
"imports": { "my-component": "/src/components/my-component.js", "vendor-lib/": "/node_modules/vendor-lib/dist/esm/" }ํ๋ก๋์ ์ํฌํธ ๋งต:
"imports": { "my-component": "https://cdn.myapp.com/components/my-component.js", "vendor-lib/": "https://cdn.vendor.com/vendor-lib@1.2.3/esm/" }
2. ํฅ์๋ ๊ฐ๋ฐ์ ๊ฒฝํ๊ณผ ์์ฐ์ฑ
-
๋ ๊น๋ํ๊ณ ์ฝ๊ธฐ ์ฌ์ด ์ฝ๋: import ๋ฌธ์์ ๊ธด ์๋ ๊ฒฝ๋ก์ ํ๋์ฝ๋ฉ๋ CDN URL์ ์๋ณ์ ๊ณ ํ์ธ์. ์ฝ๋๊ฐ ๋น์ฆ๋์ค ๋ก์ง์ ๋ ์ง์คํ๊ฒ ๋์ด ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ด ํฅ์๋ฉ๋๋ค.
-
๋ฆฌํฉํ ๋ง ๊ณ ํต ๊ฐ์: ํ์ผ์ ์ด๋ํ๊ฑฐ๋ ํ๋ก์ ํธ์ ๋ด๋ถ ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ์ฌ๊ตฌ์ฑํ๋ ๊ฒ์ด ํจ์ฌ ๋ ๊ณ ํต์ค๋ฌ์์ง๋๋ค. ์์ญ ๊ฐ์ import ๋ฌธ์ ์ ๋ฐ์ดํธํ๋ ๋์ , ์ํฌํธ ๋งต์์ ํ๋ ๊ฐ์ ํญ๋ชฉ๋ง ์กฐ์ ํ๋ฉด ๋ฉ๋๋ค.
-
๋ ๋น ๋ฅธ ๋ฐ๋ณต: ๋ง์ ํ๋ก์ ํธ, ํนํ ์๊ท๋ชจ ํ๋ก์ ํธ๋ ์น ์ปดํฌ๋ํธ์ ์ด์ ์ ๋ง์ถ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ, ์ํฌํธ ๋งต์ ๊ฐ๋ฐ ์ค ๋ณต์กํ๊ณ ๋๋ฆฐ ๋น๋ ๋จ๊ณ๋ฅผ ์ค์ด๊ฑฐ๋ ์ฌ์ง์ด ์์จ ์ ์์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ํธ์งํ๊ณ ๋ธ๋ผ์ฐ์ ๋ฅผ ์๋ก๊ณ ์นจํ๊ธฐ๋ง ํ๋ฉด ๋์ด, ํจ์ฌ ๋น ๋ฅธ ๋ฐ๋ณต ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ๋์์ ์์ ํ ์ ์๋ ๊ฐ๋ฐ์์๊ฒ ํฐ ์ด์ ์ ๋๋ค.
3. ๊ฐ์ ๋ ๋น๋ ํ๋ก์ธ์ค (๋๋ ๊ทธ ๋ถ์ฌ)
์ํฌํธ ๋งต์ด ๋ชจ๋ ์๋๋ฆฌ์ค(์: ์ฝ๋ ๋ถํ , ๊ณ ๊ธ ์ต์ ํ, ๋ ๊ฑฐ์ ๋ธ๋ผ์ฐ์ ์ง์)์์ ๋ฒ๋ค๋ฌ๋ฅผ ์์ ํ ๋์ฒดํ์ง๋ ์์ง๋ง, ๋น๋ ๊ตฌ์ฑ์ ๋ํญ ๋จ์ํํ ์ ์์ต๋๋ค:
-
๋ ์์ ๊ฐ๋ฐ ๋ฒ๋ค: ๊ฐ๋ฐ ์ค์ ์ํฌํธ ๋งต๊ณผ ํจ๊ป ๋ค์ดํฐ๋ธ ๋ธ๋ผ์ฐ์ ๋ชจ๋ ๋ก๋ฉ์ ํ์ฉํ์ฌ ๋ชจ๋ ๊ฒ์ ๋ฒ๋ค๋งํ ํ์๊ฐ ์์ต๋๋ค. ์ด๋ ๋ธ๋ผ์ฐ์ ๊ฐ ํ์ํ ๊ฒ๋ง ๊ฐ์ ธ์ค๋ฏ๋ก ์ด๊ธฐ ๋ก๋ ์๊ฐ๊ณผ ํซ ๋ชจ๋ ๋ฆฌ๋ก๋ฉ์ด ํจ์ฌ ๋นจ๋ผ์ง ์ ์์ต๋๋ค.
-
์ต์ ํ๋ ํ๋ก๋์ ๋ฒ๋ค: ํ๋ก๋์ ์ ์ํด ์ฌ์ ํ ๋ฒ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋์ ์ฐ๊ฒฐํ๊ณ ์ถ์ํ ์ ์์ง๋ง, ์ํฌํธ ๋งต์ ๋ฒ๋ค๋ฌ์ ํด์ ์ ๋ต์ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ฌ ๊ฐ๋ฐ ํ๊ฒฝ๊ณผ ํ๋ก๋์ ํ๊ฒฝ ๊ฐ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
-
์ ์ง์ ํฅ์ ๋ฐ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋: ์ํฌํธ ๋งต์ ์ ์ง์ ์ผ๋ก ๊ธฐ๋ฅ์ ๋ก๋ํ๊ฑฐ๋ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋ ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ค๋ ์๋๋ฆฌ์ค์ ์ด์์ ์ ๋๋ค. ๋ค๋ฅธ ๋ง์ดํฌ๋ก ํ๋ก ํธ์๋๋ ์์ฒด ๋ชจ๋ ๋งคํ(์ค์ฝํ ๋ด ๋๋ ๋์ ์ผ๋ก ๋ก๋๋ ๋งต)์ ์ ์ํ ์ ์์ด, ์ผ๋ถ ๊ณตํต ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ณต์ ํ์ง๋ง ๋ค๋ฅธ ๋ฒ์ ์ด ํ์ํ ๊ฒฝ์ฐ์๋ ๋ ๋ฆฝ์ ์ผ๋ก ์์กด์ฑ์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
4. ๊ธ๋ก๋ฒ ๋๋ฌ์ ์ํ CDN๊ณผ์ ์ํํ ํตํฉ
์ํฌํธ ๋งต์ ๊ธ๋ก๋ฒ ์ ์ฌ ๊ณ ๊ฐ์๊ฒ ์ฑ๋ฅ ์ข์ ์น ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ ์ค์ํ ์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ(CDN)๋ฅผ ๋งค์ฐ ์ฝ๊ฒ ํ์ฉํ ์ ์๊ฒ ํฉ๋๋ค. ๋ฒ ์ด ์ง์ ์๋ฅผ CDN URL์ ์ง์ ๋งคํํจ์ผ๋ก์จ:
-
๊ธ๋ก๋ฒ ์บ์ฑ ๋ฐ ์ฑ๋ฅ: ์ ์ธ๊ณ ์ฌ์ฉ์๋ ์ง๋ฆฌ์ ์ผ๋ก ๋ถ์ฐ๋ ์๋ฒ์ ์ด์ ์ ๋๋ ค ๋๊ธฐ ์๊ฐ์ ์ค์ด๊ณ ์์ฐ ์ ๋ฌ ์๋๋ฅผ ๋์ ๋๋ค. CDN์ ์์ฃผ ์ฌ์ฉ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ฌ์ฉ์์๊ฒ ๋ ๊ฐ๊น๊ฒ ์บ์๋๋๋ก ํ์ฌ ์ฒด๊ฐ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
-
์ ๋ขฐ์ฑ: ํํ ์ข์ CDN์ ๋์ ๊ฐ๋ ์๊ฐ๊ณผ ์ด์คํ๋ฅผ ์ ๊ณตํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์กด์ฑ์ด ํญ์ ์ฌ์ฉ ๊ฐ๋ฅํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
-
์๋ฒ ๋ถํ ๊ฐ์: ์ ์ ์์ฐ์ CDN์ผ๋ก ์คํ๋ก๋ํ๋ฉด ์์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์ ๋ถํ๊ฐ ์ค์ด๋ค์ด ๋์ ์ฝํ ์ธ ์ ์ง์คํ ์ ์์ต๋๋ค.
5. ๊ฐ๋ ฅํ ๋ชจ๋ ธ๋ ํฌ ์ง์
๋๊ท๋ชจ ์กฐ์ง์์ ์ ์ ๋ ์ธ๊ธฐ๋ฅผ ์ป๊ณ ์๋ ๋ชจ๋ ธ๋ ํฌ๋ ์ข ์ข ๋ด๋ถ ํจํค์ง ์ฐ๊ฒฐ์ ์ด๋ ค์์ ๊ฒช์ต๋๋ค. ์ํฌํธ ๋งต์ ์ฐ์ํ ํด๊ฒฐ์ฑ ์ ์ ๊ณตํฉ๋๋ค:
-
์ง์ ์ ์ธ ๋ด๋ถ ํจํค์ง ํด์: ๋ด๋ถ ๋ฒ ์ด ๋ชจ๋ ์ง์ ์๋ฅผ ๋ชจ๋ ธ๋ ํฌ ๋ด์ ๋ก์ปฌ ๊ฒฝ๋ก์ ์ง์ ๋งคํํฉ๋๋ค. ์ด๋ ๋ณต์กํ ์๋ ๊ฒฝ๋ก ๋๋ ์ข ์ข ๋ชจ๋ ํด์ ๋ฐ ๋๊ตฌ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋
npm link์ ๊ฐ์ ๋๊ตฌ์ ํ์์ฑ์ ์ ๊ฑฐํฉ๋๋ค.๋ชจ๋ ธ๋ ํฌ์์์ ์์:
"imports": { "@my-org/components/": "/packages/components/src/", "@my-org/utils/": "/packages/utils/src/" }๊ทธ๋ฌ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ฐ๋จํ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค:
import { Button } from '@my-org/components/Button'; import { throttle } from '@my-org/utils/throttle';์ด ์ ๊ทผ ๋ฐฉ์์ ํจํค์ง ๊ฐ ๊ฐ๋ฐ์ ๋จ์ํํ๊ณ ๋ก์ปฌ ์ค์ ์ ๊ด๊ณ์์ด ๋ชจ๋ ํ์์๊ฒ ์ผ๊ด๋ ํด์์ ๋ณด์ฅํฉ๋๋ค.
์ํฌํธ ๋งต ๊ตฌํ: ๋จ๊ณ๋ณ ๊ฐ์ด๋
ํ๋ก์ ํธ์ ์ํฌํธ ๋งต์ ํตํฉํ๋ ๊ฒ์ ๊ฐ๋จํ ๊ณผ์ ์ด์ง๋ง, ๋ฏธ๋ฌํ ์ฐจ์ด๋ฅผ ์ดํดํ๋ฉด ์ํํ ๊ฒฝํ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
1. ๊ธฐ๋ณธ ์ค์ : ๋จ์ผ ์ํฌํธ ๋งต
HTML ๋ฌธ์์ <head>์ <script type="importmap"> ํ๊ทธ๋ฅผ, ์ด๋ฅผ ์ฌ์ฉํ <script type="module"> ํ๊ทธ *์ ์* ๋ฐฐ์นํ์ธ์.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My Import Map App</title>
<script type="importmap">
{
"imports": {
"lit": "https://cdn.jsdelivr.net/npm/lit@3/index.js",
"@shared/data/": "/src/data/",
"bootstrap": "https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.esm.min.js"
}
}
</script>
<!-- ๋ฉ์ธ ๋ชจ๋ ์คํฌ๋ฆฝํธ -->
<script type="module" src="/src/main.js"></script>
</head>
<body>
<div id="app"></div>
</body>
</html>
์ด์ /src/main.js ๋๋ ๋ค๋ฅธ ๋ชจ๋ ์คํฌ๋ฆฝํธ์์:
// /src/main.js
import { html, render } from 'lit'; // https://cdn.jsdelivr.net/npm/lit@3/index.js๋ก ํด์๋ฉ๋๋ค
import { fetchData } from '@shared/data/api.js'; // /src/data/api.js๋ก ํด์๋ฉ๋๋ค
import 'bootstrap'; // Bootstrap์ ESM ๋ฒ๋ค๋ก ํด์๋ฉ๋๋ค
const app = document.getElementById('app');
render(html`<h1>Hello from Lit!</h1>`, app);
fetchData().then(data => console.log('Data fetched:', data));
2. ์ฌ๋ฌ ์ํฌํธ ๋งต ์ฌ์ฉ (๊ทธ๋ฆฌ๊ณ ๋ธ๋ผ์ฐ์ ๋์)
์ฌ๋ฌ ๊ฐ์ <script type="importmap"> ํ๊ทธ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ์ด๋ฅผ ์์ฐจ์ ์ผ๋ก ๋ณํฉํฉ๋๋ค. ํ์ ๋งต์ ์ด์ ๋งต์ ๋งคํ์ ๋ฎ์ด์ฐ๊ฑฐ๋ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ด๋ ๊ธฐ๋ณธ ๋งต์ ํ์ฅํ๊ฑฐ๋ ํ๊ฒฝ๋ณ ์ฌ์ ์๋ฅผ ์ ๊ณตํ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
<script type="importmap"> { "imports": { "logger": "/dev-logger.js" } } </script>
<script type="importmap"> { "imports": { "logger": "/prod-logger.js" } } </script>
<!-- 'logger'๋ ์ด์ /prod-logger.js๋ก ํด์๋ฉ๋๋ค -->
๊ฐ๋ ฅํ์ง๋ง, ์ ์ง๋ณด์์ฑ์ ์ํด ๊ฐ๋ฅํ๋ฉด ์ํฌํธ ๋งต์ ํตํฉํ๊ฑฐ๋ ๋์ ์ผ๋ก ์์ฑํ๋ ๊ฒ์ด ์ข ์ข ๊ถ์ฅ๋ฉ๋๋ค.
3. ๋์ ์ํฌํธ ๋งต (์๋ฒ ์์ฑ ๋๋ ๋น๋ ์)
๋๊ท๋ชจ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ HTML์์ JSON ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ์ ์ง ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ ์ ์์ต๋๋ค. ์ํฌํธ ๋งต์ ๋์ ์ผ๋ก ์์ฑ๋ ์ ์์ต๋๋ค:
-
์๋ฒ ์ธก ์์ฑ: ์๋ฒ๊ฐ ํ๊ฒฝ ๋ณ์, ์ฌ์ฉ์ ์ญํ ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ฑ์ ๋ฐ๋ผ ์ํฌํธ ๋งต JSON์ ๋์ ์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค. ์ด๋ ๋งค์ฐ ์ ์ฐํ๊ณ ๋ฌธ๋งฅ์ ์ธ์ํ๋ ์์กด์ฑ ํด์์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
-
๋น๋ ์ ์์ฑ: ๊ธฐ์กด ๋น๋ ๋๊ตฌ(Vite, Rollup ํ๋ฌ๊ทธ์ธ ๋๋ ์ฌ์ฉ์ ์ ์ ์คํฌ๋ฆฝํธ ๋ฑ)๊ฐ
package.json๋๋ ๋ชจ๋ ๊ทธ๋ํ๋ฅผ ๋ถ์ํ๊ณ ๋น๋ ํ๋ก์ธ์ค์ ์ผ๋ถ๋ก ์ํฌํธ ๋งต JSON์ ์์ฑํ ์ ์์ต๋๋ค. ์ด๋ ์ํฌํธ ๋งต์ด ํญ์ ํ๋ก์ ํธ์ ์์กด์ฑ๊ณผ ์ต์ ์ํ๋ฅผ ์ ์งํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
`@jspm/generator`์ ๊ฐ์ ๋๊ตฌ๋ ๋ค๋ฅธ ์ปค๋ฎค๋ํฐ ๋๊ตฌ๋ค์ด Node.js ์์กด์ฑ์์ ์ํฌํธ ๋งต ์์ฑ์ ์๋ํํ๊ธฐ ์ํด ๋ฑ์ฅํ๊ณ ์์ด ํตํฉ์ด ๋์ฑ ์ํํด์ง๊ณ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ์ง์ ๋ฐ ํด๋ฆฌํ
์ฃผ์ ๋ธ๋ผ์ฐ์ ์์ ์ํฌํธ ๋งต์ ์ฑํ์ด ๊พธ์คํ ์ฆ๊ฐํ๊ณ ์์ด, ํ๋ก๋์ ํ๊ฒฝ์์ ์คํ ๊ฐ๋ฅํ๊ณ ์ ์ ๋ ์ ๋ขฐํ ์ ์๋ ์๋ฃจ์ ์ด ๋๊ณ ์์ต๋๋ค.
- Chrome ๋ฐ Edge: ์์ ํ ์ง์์ด ํ๋์ ๊ฐ๋ฅํ์ต๋๋ค.
- Firefox: ํ๋ฐํ ๊ฐ๋ฐ ์ค์ด๋ฉฐ ์์ ํ ์ง์์ ํฅํด ๋์๊ฐ๊ณ ์์ต๋๋ค.
- Safari: ์ญ์ ํ๋ฐํ ๊ฐ๋ฐ ์ค์ด๋ฉฐ ์์ ํ ์ง์์ ํฅํด ์งํ ์ค์ ๋๋ค.
Can I Use...์ ๊ฐ์ ์ฌ์ดํธ์์ ํญ์ ์ต์ ํธํ์ฑ ์ํ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
๋ ๋์ ํธํ์ฑ์ ์ํ ํด๋ฆฌํ๋ง
๋ค์ดํฐ๋ธ ์ํฌํธ ๋งต ์ง์์ด ์์ง ์ ๊ณต๋์ง ์๋ ํ๊ฒฝ์์๋ ํด๋ฆฌํ์ ์ฌ์ฉํ์ฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ๊ฐ์ฅ ๋๋๋ฌ์ง ํด๋ฆฌํ์ Guy Bedford(์ํฌํธ ๋งต ์ฌ์์ ์ฃผ์ ๊ธฐ์ฌ์)์ es-module-shims์
๋๋ค.
ํด๋ฆฌํ์ ์ฌ์ฉํ๋ ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก ํน์ async ๋ฐ onload ์์ฑ ์ค์ ๊ณผ ํจ๊ป ํฌํจํ๊ณ , ๋ชจ๋ ์คํฌ๋ฆฝํธ๋ฅผ defer ๋๋ async๋ก ํ์ํฉ๋๋ค. ํด๋ฆฌํ์ ๋ชจ๋ ์์ฒญ์ ๊ฐ๋ก์ฑ๊ณ ๋ค์ดํฐ๋ธ ์ง์์ด ์๋ ๊ณณ์ ์ํฌํธ ๋งต ๋ก์ง์ ์ ์ฉํฉ๋๋ค.
<script async src="https://unpkg.com/es-module-shims@1.8.0/dist/es-module-shims.js"></script>
<!-- importmap ์คํฌ๋ฆฝํธ๊ฐ ๋ชจ๋ ๋ชจ๋๋ณด๋ค ๋จผ์ ์คํ๋๋๋ก ๋ณด์ฅ -->
<script type="importmap">
{
"imports": {
"react": "https://unpkg.com/react@18/umd/react.production.min.js"
}
}
</script>
<!-- ์ ํ๋ฆฌ์ผ์ด์
์ ๋ชจ๋ ์คํฌ๋ฆฝํธ -->
<script type="module" src="./app.js"></script>
๊ธ๋ก๋ฒ ์ ์ฌ ๊ณ ๊ฐ์ ๊ณ ๋ คํ ๋, ํด๋ฆฌํ์ ์ฌ์ฉํ๋ ๊ฒ์ ํ๋ ๋ธ๋ผ์ฐ์ ์์ ์ํฌํธ ๋งต์ ์ด์ ์ ํ์ฉํ๋ฉด์๋ ๊ด๋ฒ์ํ ํธํ์ฑ์ ๋ณด์ฅํ๋ ์ค์ฉ์ ์ธ ์ ๋ต์ ๋๋ค. ๋ธ๋ผ์ฐ์ ์ง์์ด ์ฑ์ํด์ง๋ฉด ํด๋ฆฌํ์ ๊ฒฐ๊ตญ ์ ๊ฑฐํ์ฌ ๋ฐฐํฌ๋ฅผ ๋จ์ํํ ์ ์์ต๋๋ค.
๊ณ ๊ธ ๊ณ ๋ ค์ฌํญ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
์ํฌํธ ๋งต์ด ๋ชจ๋ ๊ด๋ฆฌ์ ์ฌ๋ฌ ์ธก๋ฉด์ ๋จ์ํํ์ง๋ง, ์ต์ ์ ์ฑ๋ฅ, ๋ณด์ ๋ฐ ์ ์ง๋ณด์์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํ ๊ณ ๊ธ ๊ณ ๋ ค์ฌํญ๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๊ฐ ์์ต๋๋ค.
์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ
-
์ด๊ธฐ ๋ค์ด๋ก๋ ๋ฐ ํ์ฑ: ์ํฌํธ ๋งต ์์ฒด๋ ์์ JSON ํ์ผ์ ๋๋ค. ์ด๊ธฐ ๋ก๋ ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ์ผ๋ฐ์ ์ผ๋ก ๋ฏธ๋ฏธํฉ๋๋ค. ๊ทธ๋ฌ๋ ํฌ๊ณ ๋ณต์กํ ๋งต์ ํ์ฑํ๋ ๋ฐ ์ฝ๊ฐ ๋ ์ค๋ ๊ฑธ๋ฆด ์ ์์ต๋๋ค. ๋งต์ ๊ฐ๊ฒฐํ๊ฒ ์ ์งํ๊ณ ํ์ํ ๊ฒ๋ง ํฌํจํ์ธ์.
-
HTTP ์์ฒญ: ๋ฒ ์ด ์ง์ ์๋ฅผ CDN URL์ ๋งคํํ์ฌ ์ฌ์ฉํ ๋, ๋ธ๋ผ์ฐ์ ๋ ๊ฐ ๊ณ ์ ๋ชจ๋์ ๋ํด ๋ณ๋์ HTTP ์์ฒญ์ ๋ณด๋ ๋๋ค. HTTP/2 ๋ฐ HTTP/3๊ฐ ๋ง์ ์์ ์์ฒญ์ ์ค๋ฒํค๋ ์ผ๋ถ๋ฅผ ์ํํ์ง๋ง, ์ด๋ ๋จ์ผ์ ํฐ ๋ฒ๋ค ํ์ผ์ ๋ํ ์ ์ถฉ์์ ๋๋ค. ์ต์ ์ ํ๋ก๋์ ์ฑ๋ฅ์ ์ํด, ์ค์ ๊ฒฝ๋ก๋ฅผ ๋ฒ๋ค๋งํ๋ ๊ฒ์ ์ฌ์ ํ ๊ณ ๋ คํ ์ ์์ผ๋ฉฐ, ๋ ์ค์ํ๊ฑฐ๋ ๋์ ์ผ๋ก ๋ก๋๋๋ ๋ชจ๋์๋ ์ํฌํธ ๋งต์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
-
์บ์ฑ: ๋ธ๋ผ์ฐ์ ๋ฐ CDN ์บ์ฑ์ ํ์ฉํ์ธ์. CDN ํธ์คํ ๋ชจ๋์ ์ข ์ข ์ ์ธ๊ณ์ ์ผ๋ก ์บ์๋์ด ์ฌ๋ฐฉ๋ฌธ์์ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ๋ฐ์ด๋ ์ฑ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์์ฒด์ ์ผ๋ก ํธ์คํ ํ๋ ๋ก์ปฌ ๋ชจ๋์ ์ ์ ํ ์บ์ฑ ํค๋๊ฐ ์๋์ง ํ์ธํ์ธ์.
๋ณด์ ๋ฌธ์
-
์ฝํ ์ธ ๋ณด์ ์ ์ฑ (CSP): ์ฝํ ์ธ ๋ณด์ ์ ์ฑ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์ํฌํธ ๋งต์ ์ง์ ๋ URL์ด
script-src์ง์๋ฌธ์ ์ํด ํ์ฉ๋๋์ง ํ์ธํ์ธ์. ์ด๋ CDN ๋๋ฉ์ธ(์:unpkg.com,cdn.skypack.dev)์ CSP์ ์ถ๊ฐํด์ผ ํ ์๋ ์์์ ์๋ฏธํฉ๋๋ค. -
์๋ธ๋ฆฌ์์ค ๋ฌด๊ฒฐ์ฑ(SRI): ์ํฌํธ ๋งต์ด JSON ๊ตฌ์กฐ ๋ด์์ ์ง์ SRI ํด์๋ฅผ ์ง์ํ์ง๋ ์์ง๋ง, ์ด๋ ๋ชจ๋ ์ธ๋ถ ์คํฌ๋ฆฝํธ์ ๋ํ ์ค์ํ ๋ณด์ ๊ธฐ๋ฅ์ ๋๋ค. CDN์์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ก๋ํ๋ ๊ฒฝ์ฐ, ํญ์
<script>ํ๊ทธ์ SRI ํด์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์(๋๋ ๋น๋ ํ๋ก์ธ์ค์ ์์กดํ์ฌ ๋ฒ๋ค๋ ์ถ๋ ฅ์ ์ถ๊ฐํ๋๋ก ํ์ธ์). ์ํฌํธ ๋งต์ ํตํด ๋์ ์ผ๋ก ๋ก๋๋ ๋ชจ๋์ ๊ฒฝ์ฐ, ๋ชจ๋์ด URL๋ก ํด์๋ ํ ๋ธ๋ผ์ฐ์ ์ ๋ณด์ ๋ฉ์ปค๋์ฆ์ ์์กดํ๊ฒ ๋ฉ๋๋ค. -
์ ๋ขฐํ ์ ์๋ ์์ค: ์ ๋ขฐํ ์ ์๋ CDN ์์ค๋ ์์ ์ด ์ ์ดํ๋ ์ธํ๋ผ์๋ง ๋งคํํ์ธ์. ์์๋ CDN์ ์ํฌํธ ๋งต์ด ๊ฐ๋ฆฌํค๋ ๊ฒฝ์ฐ ์ ์ฌ์ ์ผ๋ก ์ ์ฑ ์ฝ๋๋ฅผ ์ฃผ์ ํ ์ ์์ต๋๋ค.
๋ฒ์ ๊ด๋ฆฌ ์ ๋ต
-
๋ฒ์ ๊ณ ์ : ์ํฌํธ ๋งต์์ ํญ์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํน์ ๋ฒ์ ์ ๊ณ ์ ํ์ธ์(์:
"vue": "https://unpkg.com/vue@3.2.47/dist/vue.esm-browser.js"). '์ต์ ' ๋๋ ๊ด๋ฒ์ํ ๋ฒ์ ๋ฒ์์ ์์กดํ๋ ๊ฒ์ ํผํ์ธ์. ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ์๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ๋ฆด๋ฆฌ์คํ ๋ ์๊ธฐ์น ์์ ์ค๋จ์ ์ด๋ํ ์ ์์ต๋๋ค. -
์๋ ์ ๋ฐ์ดํธ: Node.js ํ๋ก์ ํธ์์
npm update๊ฐ ์๋ํ๋ ๋ฐฉ์๊ณผ ์ ์ฌํ๊ฒ, ์ต์ ํธํ ๋ฒ์ ์ ์์กด์ฑ์ผ๋ก ์ํฌํธ ๋งต์ ์๋์ผ๋ก ์ ๋ฐ์ดํธํ ์ ์๋ ๋๊ตฌ๋ ์คํฌ๋ฆฝํธ๋ฅผ ๊ณ ๋ คํ์ธ์. ์ด๋ ์์ ์ฑ๊ณผ ์๋ก์ด ๊ธฐ๋ฅ ๋ฐ ๋ฒ๊ทธ ์์ ์ ํ์ฉํ๋ ๋ฅ๋ ฅ ์ฌ์ด์ ๊ท ํ์ ๋ง์ถฅ๋๋ค. -
๋ฝํ์ผ(๊ฐ๋ ์ ์ผ๋ก): ์ง์ ์ ์ธ ์ํฌํธ ๋งต "๋ฝํ์ผ"์ ์์ง๋ง, ์์ฑ๋๊ฑฐ๋ ์๋์ผ๋ก ์ ์ง ๊ด๋ฆฌ๋๋ ์ํฌํธ ๋งต์ ๋ฒ์ ๊ด๋ฆฌ(์: Git) ํ์ ๋๋ ๊ฒ์ ๋ชจ๋ ๊ฐ๋ฐ์์ ๋ฐฐํฌ ํ๊ฒฝ์ด ์ ํํ ๋์ผํ ์์กด์ฑ ํด์์ ์ฌ์ฉํ๋๋ก ๋ณด์ฅํ๋ ์ ์ฌํ ๋ชฉ์ ์ ์ํํฉ๋๋ค.
๊ธฐ์กด ๋น๋ ๋๊ตฌ์์ ํตํฉ
์ํฌํธ ๋งต์ ๋น๋ ๋๊ตฌ๋ฅผ ์์ ํ ๋์ฒดํ๊ธฐ ์ํ ๊ฒ์ด ์๋๋ผ, ์ด๋ฅผ ๋ณด์ํ๊ฑฐ๋ ๊ตฌ์ฑ์ ๋จ์ํํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค. ๋ง์ ์ธ๊ธฐ ์๋ ๋น๋ ๋๊ตฌ๋ค์ด ์ํฌํธ ๋งต์ ๋ํ ๋ค์ดํฐ๋ธ ์ง์์ด๋ ํ๋ฌ๊ทธ์ธ์ ์ ๊ณตํ๊ธฐ ์์ํ์ต๋๋ค:
-
Vite: Vite๋ ์ด๋ฏธ ๋ค์ดํฐ๋ธ ES ๋ชจ๋์ ์ฑํํ๊ณ ์์ผ๋ฉฐ ์ํฌํธ ๋งต๊ณผ ์ํํ๊ฒ ์๋ํ ์ ์์ผ๋ฉฐ, ์ข ์ข ์ด๋ฅผ ์์ฑํด ์ค๋๋ค.
-
Rollup ๋ฐ Webpack: ๋ฒ๋ค ๋ถ์์์ ์ํฌํธ ๋งต์ ์์ฑํ๊ฑฐ๋, ์ํฌํธ ๋งต์ ์ฌ์ฉํ์ฌ ๋ฒ๋ค๋ง ํ๋ก์ธ์ค์ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ํ๋ฌ๊ทธ์ธ์ด ์กด์ฌํฉ๋๋ค.
-
์ต์ ํ๋ ๋ฒ๋ค + ์ํฌํธ ๋งต: ํ๋ก๋์ ์ ์ํด, ์ต์ ์ ๋ก๋ฉ์ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ๋ฒ๋ค๋งํ๊ณ ์ถ์ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ํฌํธ ๋งต์ ์ฌ์ฉํ์ฌ ๋ฉ์ธ ๋ฒ๋ค์์ ์ ์ธ๋ ์ธ๋ถ ์์กด์ฑ(์: CDN์ React)์ ํด์ํ์ฌ, ๋ ์ธ๊ณ์ ์ฅ์ ์ ๊ฒฐํฉํ ํ์ด๋ธ๋ฆฌ๋ ์ ๊ทผ ๋ฐฉ์์ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
์ํฌํธ ๋งต ๋๋ฒ๊น
ํ๋ ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ ์ํฌํธ ๋งต ๋๋ฒ๊น ์ ์ํ ๋ ๋์ ์ง์์ ์ ๊ณตํ๊ธฐ ์ํด ์งํํ๊ณ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋์ด ๊ฐ์ ธ์ฌ ๋ ๋คํธ์ํฌ ํญ์์ ํด์๋ URL์ ๊ฒ์ฌํ ์ ์์ต๋๋ค. ์ํฌํธ ๋งต JSON์ ์ค๋ฅ(์: ๊ตฌ๋ฌธ ์ค๋ฅ)๋ ์ข ์ข ๋ธ๋ผ์ฐ์ ์ฝ์์ ๋ณด๊ณ ๋์ด ๋ฌธ์ ํด๊ฒฐ์ ์ํ ๋จ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ชจ๋ ํด์์ ๋ฏธ๋: ๊ธ๋ก๋ฒ ๊ด์
์๋ฐ์คํฌ๋ฆฝํธ ์ํฌํธ ๋งต์ ์น์์ ๋ ๊ฒฌ๊ณ ํ๊ณ , ํจ์จ์ ์ด๋ฉฐ, ๊ฐ๋ฐ์ ์นํ์ ์ธ ๋ชจ๋ ์์คํ ์ ํฅํ ์ค์ํ ๋จ๊ณ์ ๋๋ค. ์ด๋ ๊ทผ๋ณธ์ ์ธ ๊ฐ๋ฐ ์์ ์ ์ํด ๋ฌด๊ฑฐ์ด ๋น๋ ํด์ฒด์ธ์ ๋ํ ์์กด์ฑ์ ์ค์ด๊ณ , ๋ธ๋ผ์ฐ์ ์ ๋ ๋ง์ ๋ค์ดํฐ๋ธ ๊ธฐ๋ฅ์ ๋ถ์ฌํ๋ ๊ด๋ฒ์ํ ์ถ์ธ์ ์ผ์นํฉ๋๋ค.
๊ธ๋ก๋ฒ ๊ฐ๋ฐํ์๊ฒ ์ํฌํธ ๋งต์ ๋ค์ํ ํ๊ฒฝ๊ณผ ๋ฌธํ์ ๋งฅ๋ฝ์ ๊ฑธ์ณ ์ผ๊ด์ฑ์ ์ด์งํ๊ณ , ํ์ ์ ๋จ์ํํ๋ฉฐ, ์ ์ง๋ณด์์ฑ์ ํฅ์์ํต๋๋ค. ๋ชจ๋์ด ํด์๋๋ ๋ฐฉ์์ ํ์คํํจ์ผ๋ก์จ, ๊ฐ๋ฐ ๊ดํ์ ์ง์ญ์ ์ฐจ์ด๋ฅผ ์ด์ํ๋ ์์กด์ฑ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ณดํธ์ ์ธ ์ธ์ด๋ฅผ ๋ง๋ญ๋๋ค.
์ํฌํธ ๋งต์ ์ฃผ๋ก ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฅ์ด์ง๋ง, ๊ทธ ์์น์ Node.js์ ๊ฐ์ ์๋ฒ ์ธก ํ๊ฒฝ์ ์ํฅ์ ๋ฏธ์น ์ ์์ผ๋ฉฐ, ์ ์ฌ์ ์ผ๋ก ์ ์ฒด ์๋ฐ์คํฌ๋ฆฝํธ ์ํ๊ณ์ ๊ฑธ์ณ ๋ ํต์ผ๋ ๋ชจ๋ ํด์ ์ ๋ต์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์น์ด ๊ณ์ํด์ ์งํํ๊ณ ์ ์ ๋ ๋ชจ๋ํ๋จ์ ๋ฐ๋ผ, ์ํฌํธ ๋งต์ ์ฑ๋ฅ์ด ๋ฐ์ด๋๊ณ , ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ, ์ ์ธ๊ณ ์ฌ์ฉ์๊ฐ ์ ๊ทผํ ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ณ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ์ค์ํ ์ญํ ์ ํ ๊ฒ์ ๋๋ค.
๊ฒฐ๋ก
์๋ฐ์คํฌ๋ฆฝํธ ์ํฌํธ ๋งต์ ํ๋ ์น ๊ฐ๋ฐ์์ ๋ชจ๋ ํด์ ๋ฐ ์์กด์ฑ ๊ด๋ฆฌ์ ์ค๋ ๊ณผ์ ์ ๋ํ ๊ฐ๋ ฅํ๊ณ ์ฐ์ํ ํด๊ฒฐ์ฑ ์ ๋๋ค. ๋ชจ๋ ์ง์ ์๋ฅผ URL์ ๋งคํํ๋ ๋ธ๋ผ์ฐ์ ๋ค์ดํฐ๋ธ, ์ ์ธ์ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํจ์ผ๋ก์จ, ๋ ๊น๋ํ ์ฝ๋์ ๋จ์ํ๋ ์์กด์ฑ ๊ด๋ฆฌ์์๋ถํฐ ํฅ์๋ ๊ฐ๋ฐ์ ๊ฒฝํ๊ณผ ์ํํ CDN ํตํฉ์ ํตํ ์ฑ๋ฅ ํฅ์์ ์ด๋ฅด๊ธฐ๊น์ง ๋ค์ํ ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
๊ฐ์ธ๊ณผ ๊ธ๋ก๋ฒ ํ ๋ชจ๋์๊ฒ, ์ํฌํธ ๋งต์ ์์ฉํ๋ ๊ฒ์ ๋น๋ ๊ตฌ์ฑ๊ณผ ์จ๋ฆํ๋ ์๊ฐ์ ์ค์ด๊ณ ํ์ ์ ์ธ ๊ธฐ๋ฅ์ ๊ตฌ์ถํ๋ ๋ฐ ๋ ๋ง์ ์๊ฐ์ ํ ์ ํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์ง์์ด ์ฑ์ํ๊ณ ๋๊ตฌ๊ฐ ์งํํจ์ ๋ฐ๋ผ, ์ํฌํธ ๋งต์ ๋ชจ๋ ์น ๊ฐ๋ฐ์์ ๋ฌด๊ธฐ๊ณ ์์ ์์ด์๋ ์ ๋ ๋๊ตฌ๊ฐ ๋์ด ๋ ํจ์จ์ ์ด๊ณ , ์ ์ง๋ณด์ ๊ฐ๋ฅํ๋ฉฐ, ์ ์ธ๊ณ์ ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ ์น์ ์ํ ๊ธธ์ ์ด ๊ฒ์ ๋๋ค. ๋ค์ ํ๋ก์ ํธ์์ ์ด๋ฅผ ํ์ํ๊ณ ์ง์ ๋ณํ๋ฅผ ๊ฒฝํํด ๋ณด์ธ์!