์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํ๊ณ์ ๋ํ ์ฌ์ธต ๋ถ์์ผ๋ก, ํจํค์ง ๊ด๋ฆฌ ์ ๋ต, ๋ฐฐํฌ ๋ฐฉ๋ฒ, ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ์ปดํฌ๋ํธ ๊ตฌ์ถ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.
์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํ๊ณ: ํจํค์ง ๊ด๋ฆฌ ๋ฐ ๋ฐฐํฌ
์น ์ปดํฌ๋ํธ(Web Components)๋ ์น์ ์ํ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ์์๋ฅผ ๊ตฌ์ถํ๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์น ์ปดํฌ๋ํธ์ ์ฑํ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ, ์ด๋ฌํ ์ปดํฌ๋ํธ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ๊ฒ์ ํ์ฅ ๊ฐ๋ฅํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋๋ ๋ฐ ๋งค์ฐ ์ค์ํด์ก์ต๋๋ค. ์ด ์ข ํฉ ๊ฐ์ด๋์์๋ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํ๊ณ๋ฅผ ํ๊ตฌํ๋ฉฐ, ํจํค์ง ๊ด๋ฆฌ ์ ๋ต, ๋ฐฐํฌ ๋ฐฉ๋ฒ, ๊ทธ๋ฆฌ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ์ปดํฌ๋ํธ ๊ตฌ์ถ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก์ ์ด์ ์ ๋ง์ถฅ๋๋ค.
์น ์ปดํฌ๋ํธ๋ ๋ฌด์์ธ๊ฐ?
์น ์ปดํฌ๋ํธ๋ ์บก์ํ๋ ์คํ์ผ๊ณผ ๋์์ ๊ฐ๋ ์ฌ์ฉ์ ์ ์(custom), ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ HTML ์์๋ฅผ ๋ง๋ค ์ ์๊ฒ ํด์ฃผ๋ ์น ํ์ค์ ์งํฉ์ ๋๋ค. ์ด๋ ์ธ ๊ฐ์ง ์ฃผ์ ๊ธฐ์ ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค:
- ์ปค์คํ ์๋ฆฌ๋จผํธ(Custom Elements): ์์ ๋ง์ HTML ํ๊ทธ๋ฅผ ์ ์ํฉ๋๋ค.
- ์๋ DOM(Shadow DOM): ์ปดํฌ๋ํธ์ ๋ด๋ถ ๊ตฌ์กฐ, ์คํ์ผ, ๋์์ ์บก์ํํ์ฌ ํ์ด์ง์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ์ ์ถฉ๋์ ๋ฐฉ์งํฉ๋๋ค.
- HTML ํ ํ๋ฆฟ(HTML Templates): ๋ณต์ ํ์ฌ DOM์ ์ฝ์ ํ ์ ์๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋งํฌ์ ์กฐ๊ฐ์ ๋๋ค.
์น ์ปดํฌ๋ํธ๋ ํ๋ ์์ํฌ์ ๊ตฌ์ ๋ฐ์ง ์์ผ๋ฏ๋ก, ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ ์์ํฌ(React, Angular, Vue.js)์ ํจ๊ป ์ฌ์ฉํ๊ฑฐ๋ ์ฌ์ง์ด ํ๋ ์์ํฌ ์์ด๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ก ์ธํด ์ฌ๋ฌ ๋ค๋ฅธ ํ๋ก์ ํธ์ ๊ฑธ์ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ์์ด ๋งค์ฐ ์ ์ฐํ ์ ํ์ง๊ฐ ๋ฉ๋๋ค.
์ ์น ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํด์ผ ํ๋๊ฐ?
์น ์ปดํฌ๋ํธ๋ ๋ช ๊ฐ์ง ์ฃผ์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค:
- ์ฌ์ฌ์ฉ์ฑ: ํ ๋ฒ ๋ง๋ค๋ฉด ์ด๋์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์น ์ปดํฌ๋ํธ๋ ์ฌ๋ฌ ํ๋ก์ ํธ์ ํ๋ ์์ํฌ์์ ์ฌ์ฌ์ฉ๋ ์ ์์ด ๊ฐ๋ฐ ์๊ฐ๊ณผ ๋ ธ๋ ฅ์ ์ ์ฝํฉ๋๋ค.
- ์บก์ํ: ์๋ DOM์ ๊ฐ๋ ฅํ ์บก์ํ๋ฅผ ์ ๊ณตํ์ฌ ์ปดํฌ๋ํธ์ ๋ฉ์ธ ๋ฌธ์ ๊ฐ์ ์คํ์ผ ๋ฐ ์คํฌ๋ฆฝํ ์ถฉ๋์ ๋ฐฉ์งํฉ๋๋ค.
- ํ๋ ์์ํฌ ๋ ๋ฆฝ์ฑ: ์น ์ปดํฌ๋ํธ๋ ํน์ ํ๋ ์์ํฌ์ ์ข ์๋์ง ์์ ํ๋ ์น ๊ฐ๋ฐ์์ ์ ์ฐํ ์ ํ์ง๊ฐ ๋ฉ๋๋ค.
- ์ ์ง๋ณด์์ฑ: ์บก์ํ์ ์ฌ์ฌ์ฉ์ฑ์ ๋ ๋์ ์ ์ง๋ณด์์ฑ๊ณผ ์ฝ๋ ๊ตฌ์ฑ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ์ํธ์ด์ฉ์ฑ: ์๋ก ๋ค๋ฅธ ํ๋ก ํธ์๋ ์์คํ ๊ฐ์ ์ํธ์ด์ฉ์ฑ์ ํฅ์์์ผ, ํ์ด ์ฌ์ฉํ๋ ํ๋ ์์ํฌ์ ๊ด๊ณ์์ด ์ปดํฌ๋ํธ๋ฅผ ๊ณต์ ํ๊ณ ์ฌ์ฉํ ์ ์๊ฒ ํฉ๋๋ค.
์น ์ปดํฌ๋ํธ๋ฅผ ์ํ ํจํค์ง ๊ด๋ฆฌ
ํจ๊ณผ์ ์ธ ํจํค์ง ๊ด๋ฆฌ๋ ์น ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์ฑํ๊ณ , ๊ณต์ ํ๋ฉฐ, ์ฌ์ฉํ๋ ๋ฐ ํ์์ ์ ๋๋ค. npm, Yarn, pnpm๊ณผ ๊ฐ์ ์ธ๊ธฐ ์๋ ํจํค์ง ๊ด๋ฆฌ์๋ ์์กด์ฑ์ ๊ด๋ฆฌํ๊ณ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฐฐํฌํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
npm (Node Package Manager)
npm์ Node.js์ ๊ธฐ๋ณธ ํจํค์ง ๊ด๋ฆฌ์์ด๋ฉฐ ์ธ๊ณ์์ ๊ฐ์ฅ ํฐ ์๋ฐ์คํฌ๋ฆฝํธ ํจํค์ง ๋ ์ง์คํธ๋ฆฌ์ ๋๋ค. ํจํค์ง๋ฅผ ์ค์น, ๊ด๋ฆฌ, ๊ฒ์ํ๊ธฐ ์ํ ๋ช ๋ น์ค ์ธํฐํ์ด์ค(CLI)๋ฅผ ์ ๊ณตํฉ๋๋ค.
์์: npm์ ์ฌ์ฉํ์ฌ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์นํ๊ธฐ:
npm install my-web-component-library
npm์ package.json ํ์ผ์ ์ฌ์ฉํ์ฌ ํ๋ก์ ํธ์ ์์กด์ฑ, ์คํฌ๋ฆฝํธ ๋ฐ ๊ธฐํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ์ํฉ๋๋ค. ํจํค์ง๋ฅผ ์ค์นํ๋ฉด npm์ npm ๋ ์ง์คํธ๋ฆฌ์์ ํด๋น ํจํค์ง๋ฅผ ๋ค์ด๋ก๋ํ์ฌ node_modules ๋๋ ํฐ๋ฆฌ์ ๋ฐฐ์นํฉ๋๋ค.
Yarn
Yarn์ ๋ ๋ค๋ฅธ ์ธ๊ธฐ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ์ฉ ํจํค์ง ๊ด๋ฆฌ์์ ๋๋ค. npm์ ์ผ๋ถ ์ฑ๋ฅ ๋ฐ ๋ณด์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ค๊ณ๋์์ต๋๋ค. Yarn์ ๋ ๋น ๋ฅด๊ณ ์ ๋ขฐ์ฑ ์๋ ์์กด์ฑ ํด๊ฒฐ ๋ฐ ์ค์น๋ฅผ ์ ๊ณตํฉ๋๋ค.
์์: Yarn์ ์ฌ์ฉํ์ฌ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์นํ๊ธฐ:
yarn add my-web-component-library
Yarn์ yarn.lock ํ์ผ์ ์ฌ์ฉํ์ฌ ํ๋ก์ ํธ์ ๋ชจ๋ ๊ฐ๋ฐ์๊ฐ ์ ํํ ๋์ผํ ๋ฒ์ ์ ์์กด์ฑ์ ์ฌ์ฉํ๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ ๋ฒ์ ์ถฉ๋๋ก ์ธํ ๋ถ์ผ์น์ ๋ฒ๊ทธ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
pnpm (Performant npm)
pnpm์ npm๊ณผ Yarn๋ณด๋ค ๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ๊ฒ์ ๋ชฉํ๋ก ํ๋ ํจํค์ง ๊ด๋ฆฌ์์ ๋๋ค. ๋ด์ฉ ์ฃผ์ ์ง์ ํ์ผ ์์คํ ์ ์ฌ์ฉํ์ฌ ํจํค์ง๋ฅผ ์ ์ฅํ๋ฏ๋ก ๋์คํฌ ๊ณต๊ฐ์ ์ ์ฝํ๊ณ ์ค๋ณต ๋ค์ด๋ก๋๋ฅผ ํผํ ์ ์์ต๋๋ค.
์์: pnpm์ ์ฌ์ฉํ์ฌ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์นํ๊ธฐ:
pnpm install my-web-component-library
pnpm์ pnpm-lock.yaml ํ์ผ์ ์ฌ์ฉํ์ฌ ์์กด์ฑ์ ๊ณ ์ ํ๊ณ ์ผ๊ด๋ ๋น๋๋ฅผ ๋ณด์ฅํฉ๋๋ค. ํนํ ๋ชจ๋
ธ๋ ํฌ(monorepo)๋ ์์กด์ฑ์ด ๋ง์ ํ๋ก์ ํธ์ ์ ํฉํฉ๋๋ค.
์ฌ๋ฐ๋ฅธ ํจํค์ง ๊ด๋ฆฌ์ ์ ํํ๊ธฐ
ํจํค์ง ๊ด๋ฆฌ์์ ์ ํ์ ์ฌ์ฉ์์ ํน์ ์๊ตฌ์ฌํญ๊ณผ ์ ํธ๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. npm์ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ฉฐ ๊ฐ์ฅ ํฐ ํจํค์ง ์ํ๊ณ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. Yarn์ ๋ ๋น ๋ฅด๊ณ ์ ๋ขฐ์ฑ ์๋ ์์กด์ฑ ํด๊ฒฐ์ ์ ๊ณตํฉ๋๋ค. pnpm์ ์์กด์ฑ์ด ๋ง๊ฑฐ๋ ๋ชจ๋ ธ๋ ํฌ๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ ํธ์ ์ข์ ์ ํ์ ๋๋ค.
ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ์ ํํ ๋ ๋ค์ ์์๋ฅผ ๊ณ ๋ คํ์ธ์:
- ์ฑ๋ฅ: ํจํค์ง ๊ด๋ฆฌ์๊ฐ ์์กด์ฑ์ ์ผ๋ง๋ ๋นจ๋ฆฌ ์ค์นํ๋๊ฐ?
- ์ ๋ขฐ์ฑ: ์์กด์ฑ ํด๊ฒฐ ๊ณผ์ ์ด ์ผ๋ง๋ ์ ๋ขฐํ ์ ์๋๊ฐ?
- ๋์คํฌ ๊ณต๊ฐ: ํจํค์ง ๊ด๋ฆฌ์๊ฐ ์ฌ์ฉํ๋ ๋์คํฌ ๊ณต๊ฐ์ ์ผ๋ง๋ ๋๋๊ฐ?
- ์ํ๊ณ: ํด๋น ํจํค์ง ๊ด๋ฆฌ์๊ฐ ์ง์ํ๋ ํจํค์ง ์ํ๊ณ์ ํฌ๊ธฐ๋ ์ด๋ ํ๊ฐ?
- ๊ธฐ๋ฅ: ํจํค์ง ๊ด๋ฆฌ์๊ฐ ๋ชจ๋ ธ๋ ํฌ๋ ์ํฌ์คํ์ด์ค ์ง์๊ณผ ๊ฐ์ ๋ ํนํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋๊ฐ?
์น ์ปดํฌ๋ํธ ๋ฐฐํฌ ๋ฐฉ๋ฒ
์น ์ปดํฌ๋ํธ๋ฅผ ๋น๋ํ ํ์๋ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์์ ์ ํ๋ก์ ํธ์์ ์ฌ์ฉํ ์ ์๋๋ก ๋ฐฐํฌํด์ผ ํฉ๋๋ค. ์น ์ปดํฌ๋ํธ๋ฅผ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ผ๋ฉฐ, ๊ฐ๊ฐ ์ฅ๋จ์ ์ด ์์ต๋๋ค.
npm ๋ ์ง์คํธ๋ฆฌ
npm ๋ ์ง์คํธ๋ฆฌ๋ ์น ์ปดํฌ๋ํธ๋ฅผ ํฌํจํ ์๋ฐ์คํฌ๋ฆฝํธ ํจํค์ง๋ฅผ ๋ฐฐํฌํ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์
๋๋ค. ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ npm์ ๊ฒ์ํ๋ ค๋ฉด npm ๊ณ์ ์ ๋ง๋ค๊ณ npm publish ๋ช
๋ น์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์์: npm์ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฒ์ํ๊ธฐ:
- npm ๊ณ์ ์์ฑ:
npm adduser - npm ๊ณ์ ์ ๋ก๊ทธ์ธ:
npm login - ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฃจํธ ๋๋ ํฐ๋ฆฌ๋ก ์ด๋ํฉ๋๋ค.
- ํจํค์ง ๊ฒ์:
npm publish
๊ฒ์ํ๊ธฐ ์ ์ package.json ํ์ผ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋์๋์ง ํ์ธํ์ธ์. ์ฌ๊ธฐ์๋ ๋ค์ ์ ๋ณด๊ฐ ํฌํจ๋์ด์ผ ํฉ๋๋ค:
- name: ํจํค์ง ์ด๋ฆ (๊ณ ์ ํด์ผ ํจ).
- version: ํจํค์ง ๋ฒ์ ๋ฒํธ (์ ์์ ๋ฒ์ ๊ด๋ฆฌ ์ฌ์ฉ).
- description: ํจํค์ง์ ๋ํ ๊ฐ๋ตํ ์ค๋ช .
- main: ํจํค์ง์ ๋ฉ์ธ ์ง์ ์ (์ผ๋ฐ์ ์ผ๋ก index.js ํ์ผ).
- module: ํจํค์ง์ ES ๋ชจ๋ ์ง์ ์ (์ต์ ๋ฒ๋ค๋ฌ์ฉ).
- keywords: ํจํค์ง๋ฅผ ์ค๋ช ํ๋ ํค์๋ (๊ฒ์ ๊ฐ๋ฅ์ฑ).
- author: ํจํค์ง ์์ฑ์.
- license: ํจํค์ง๊ฐ ๋ฐฐํฌ๋๋ ๋ผ์ด์ ์ค.
- dependencies: ํจํค์ง์ ํ์ํ ๋ชจ๋ ์์กด์ฑ.
- peerDependencies: ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ๊ณต๋ ๊ฒ์ผ๋ก ์์๋๋ ์์กด์ฑ.
์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๊ณ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ง์นจ์ ์ ๊ณตํ๋ README ํ์ผ์ ํฌํจํ๋ ๊ฒ๋ ์ค์ํฉ๋๋ค.
GitHub Packages
GitHub Packages๋ GitHub ๋ฆฌํฌ์งํ ๋ฆฌ์์ ์ง์ ํจํค์ง๋ฅผ ํธ์คํ ํ ์ ์๊ฒ ํด์ฃผ๋ ํจํค์ง ํธ์คํ ์๋น์ค์ ๋๋ค. ์ด๋ฏธ ํ๋ก์ ํธ์ GitHub๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด ํธ๋ฆฌํ ์ต์ ์ด ๋ ์ ์์ต๋๋ค.
GitHub Packages์ ํจํค์ง๋ฅผ ๊ฒ์ํ๋ ค๋ฉด package.json ํ์ผ์ ๊ตฌ์ฑํ๊ณ ํน๋ณํ ๋ ์ง์คํธ๋ฆฌ URL๊ณผ ํจ๊ป npm publish ๋ช
๋ น์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์์: GitHub Packages์ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฒ์ํ๊ธฐ:
package.jsonํ์ผ ๊ตฌ์ฑ:{ "name": "@your-username/my-web-component-library", "repository": { "type": "git", "url": "git+https://github.com/your-username/my-web-component-library.git" }, "publishConfig": { "registry": "https://npm.pkg.github.com/your-username" } }write:packages๋ฐread:packages์ค์ฝํ๋ฅผ ๊ฐ์ง ๊ฐ์ธ์ฉ ์ก์ธ์ค ํ ํฐ์ ์์ฑํฉ๋๋ค.- GitHub Packages ๋ ์ง์คํธ๋ฆฌ์ ๋ก๊ทธ์ธ:
npm login --registry=https://npm.pkg.github.com --scope=@your-username - ํจํค์ง ๊ฒ์:
npm publish
GitHub Packages๋ ๋น๊ณต๊ฐ ํจํค์ง ํธ์คํ ๋ฐ GitHub ์ํ๊ณ์์ ๊ธด๋ฐํ ํตํฉ์ ํฌํจํ์ฌ npm์ ๋นํด ๋ช ๊ฐ์ง ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
CDN (์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ)
CDN์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ ๋ฐ CSS ํ์ผ๊ณผ ๊ฐ์ ์ ์ ์์ฐ์ ๋ฐฐํฌํ๋ ๋ฐ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ์
๋๋ค. ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ CDN์ ํธ์คํ
ํ ๋ค์ <script> ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ์น ํ์ด์ง์ ํฌํจํ ์ ์์ต๋๋ค.
์์: CDN์์ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํฌํจํ๊ธฐ:
<script src="https://cdn.example.com/my-web-component-library/1.0.0/index.js"></script>
CDN์ ๋น ๋ฅธ ์ ์ก ์๋์ ์๋ฒ ๋ถํ ๊ฐ์ ๋ฑ ์ฌ๋ฌ ์ด์ ์ ์ ๊ณตํฉ๋๋ค. ๋์ ์ฌ์ฉ์์ธต์๊ฒ ์น ์ปดํฌ๋ํธ๋ฅผ ๋ฐฐํฌํ๊ธฐ์ ์ข์ ์ ํ์ ๋๋ค.
์ธ๊ธฐ ์๋ CDN ์ ๊ณต ์ ์ฒด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- jsDelivr: ๋ฌด๋ฃ ์คํ ์์ค CDN.
- cdnjs: ๋ ๋ค๋ฅธ ๋ฌด๋ฃ ์คํ ์์ค CDN.
- UNPKG: npm์์ ์ง์ ํ์ผ์ ์ ๊ณตํ๋ CDN.
- Cloudflare: ๊ธ๋ก๋ฒ ๋คํธ์ํฌ๋ฅผ ๊ฐ์ถ ์์ฉ CDN.
- Amazon CloudFront: Amazon Web Services์ ์์ฉ CDN.
์์ฒด ํธ์คํ
์์ฒด ์๋ฒ์์ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ง์ ํธ์คํ ํ ์๋ ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ ๋ฐฐํฌ ๊ณผ์ ์ ๋ํ ๋ ๋ง์ ์ ์ด๊ถ์ ์ ๊ณตํ์ง๋ง, ์ค์ ํ๊ณ ์ ์ง ๊ด๋ฆฌํ๋ ๋ฐ ๋ ๋ง์ ๋ ธ๋ ฅ์ด ํ์ํฉ๋๋ค.
์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฒด ํธ์คํ
ํ๋ ค๋ฉด ํ์ผ์ ์๋ฒ์ ๋ณต์ฌํ๊ณ ์น ์๋ฒ๊ฐ ์ด๋ฅผ ์ ๊ณตํ๋๋ก ๊ตฌ์ฑํด์ผ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ <script> ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ์น ํ์ด์ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํ ์ ์์ต๋๋ค.
์์ฒด ํธ์คํ ์ ๋ค๋ฅธ ๋ฐฐํฌ ๋ฐฉ๋ฒ์ผ๋ก ์ถฉ์กฑํ ์ ์๋ ํน์ ์๊ตฌ์ฌํญ์ด ์์ ๋ ์ข์ ์ต์ ์ ๋๋ค.
์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ตฌ์ถ ๋ฐ ๋ฐฐํฌ๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
๋ค์์ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตฌ์ถํ๊ณ ๋ฐฐํฌํ ๋ ๋ฐ๋ผ์ผ ํ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก์ ๋๋ค:
- ์ ์์ ๋ฒ์ ๊ด๋ฆฌ ์ฌ์ฉ: ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ์ ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ ์์ ๋ฒ์ ๊ด๋ฆฌ(SemVer)๋ฅผ ์ฌ์ฉํ์ธ์. ์ด๋ ์ฌ์ฉ์๊ฐ ์ ๋ฒ์ ์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ ๋์ ์ ์ฌ์ ์ํฅ์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ๋ช ํํ ๋ฌธ์ ์ ๊ณต: ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ๋ช ํํ๊ณ ํฌ๊ด์ ์ธ ๋ฌธ์๋ฅผ ์์ฑํ์ธ์. ์ฌ๊ธฐ์๋ ์ปดํฌ๋ํธ๋ฅผ ์ค์น, ์ฌ์ฉ, ์ฌ์ฉ์ ์ ์ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ง์นจ์ด ํฌํจ๋์ด์ผ ํฉ๋๋ค.
- ์์ ํฌํจ: ๋ค์ํ ์๋๋ฆฌ์ค์์ ์น ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ ๋ฅผ ์ ๊ณตํ์ธ์. ์ด๋ ์ฌ์ฉ์๊ฐ ์ปดํฌ๋ํธ๋ฅผ ์์ ์ ํ๋ก์ ํธ์ ํตํฉํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ๋จ์ ํ ์คํธ ์์ฑ: ์น ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ์ธ์. ์ด๋ ํ๊ท ๋ฐ ๋ฒ๊ทธ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ๋น๋ ํ๋ก์ธ์ค ์ฌ์ฉ: ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ๋ก๋์ ์ฉ์ผ๋ก ์ต์ ํํ๊ธฐ ์ํด ๋น๋ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํ์ธ์. ์ฌ๊ธฐ์๋ ์ถ์(minification), ๋ฒ๋ค๋ง, ํธ๋ฆฌ ์์ดํน(tree shaking)์ด ํฌํจ๋์ด์ผ ํฉ๋๋ค.
- ์ ๊ทผ์ฑ ๊ณ ๋ ค: ์น ์ปดํฌ๋ํธ๊ฐ ์ฅ์ ๋ฅผ ๊ฐ์ง ์ฌ์ฉ์๋ ์ ๊ทผํ ์ ์๋๋ก ๋ณด์ฅํ์ธ์. ์ฌ๊ธฐ์๋ ์ ์ ํ ARIA ์์ฑ์ ์ ๊ณตํ๊ณ ์ปดํฌ๋ํธ๊ฐ ํค๋ณด๋๋ก ํ์ ๊ฐ๋ฅํ๋๋ก ํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค.
- ๊ตญ์ ํ(i18n): ๊ตญ์ ํ๋ฅผ ์ผ๋์ ๋๊ณ ์ปดํฌ๋ํธ๋ฅผ ์ค๊ณํ์ธ์. ์ฌ๋ฌ ์ธ์ด์ ์ง์ญ์ ์ง์ํ๊ธฐ ์ํด ๊ตญ์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ธ์. ์๋์ด ๋ฐ ํ๋ธ๋ฆฌ์ด์ ๊ฐ์ ์ธ์ด๋ฅผ ์ํด ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ(RTL) ๋ ์ด์์ ์ง์์ ๊ณ ๋ คํ์ธ์.
- ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ ํธํ์ฑ: ํธํ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ฌ๋ฌ ๋ธ๋ผ์ฐ์ ์ ์ฅ์น์์ ์ปดํฌ๋ํธ๋ฅผ ํ ์คํธํ์ธ์. ์น ์ปดํฌ๋ํธ ํ์ค์ ์์ ํ ์ง์ํ์ง ์๋ ๊ตฌํ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ง์ํ๊ธฐ ์ํด ํด๋ฆฌํ(polyfill)์ ์ฌ์ฉํ์ธ์.
- ๋ณด์: ์น ์ปดํฌ๋ํธ๋ฅผ ๋น๋ํ ๋ ๋ณด์ ์ทจ์ฝ์ ์ ์ ์ํ์ธ์. ์ฌ์ฉ์ ์ ๋ ฅ์ ์ด๊ท (sanitize)ํ๊ณ eval()์ด๋ ๋ค๋ฅธ ์ ์ฌ์ ์ผ๋ก ์ํํ ํจ์ ์ฌ์ฉ์ ํผํ์ธ์.
๊ณ ๊ธ ์ฃผ์
๋ชจ๋ ธ๋ ํฌ(Monorepos)
๋ชจ๋ ธ๋ ํฌ๋ ์ฌ๋ฌ ํ๋ก์ ํธ๋ ํจํค์ง๋ฅผ ํฌํจํ๋ ๋จ์ผ ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋๋ค. ๋ชจ๋ ธ๋ ํฌ๋ ์ปดํฌ๋ํธ ๊ฐ์ ์ฝ๋์ ์์กด์ฑ์ ๋ ์ฝ๊ฒ ๊ณต์ ํ ์ ์๊ฒ ํด์ฃผ๋ฏ๋ก ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ์ข์ ์ ํ์ด ๋ ์ ์์ต๋๋ค.
Lerna๋ Nx์ ๊ฐ์ ๋๊ตฌ๋ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ํ ๋ชจ๋ ธ๋ ํฌ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
์ปดํฌ๋ํธ ์คํ ๋ฆฌ๋ถ(Component Storybook)
์คํ ๋ฆฌ๋ถ์ UI ์ปดํฌ๋ํธ๋ฅผ ๋ ๋ฆฝ๋ ํ๊ฒฝ์์ ๊ตฌ์ถํ๊ณ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ ๋๊ตฌ์ ๋๋ค. ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ๋ ๋ฆฝ์ ์ผ๋ก ์น ์ปดํฌ๋ํธ๋ฅผ ๊ฐ๋ฐํ ์ ์์ผ๋ฉฐ, ์๊ฐ์ ์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ํ์ํ๊ณ ํ ์คํธํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
์คํ ๋ฆฌ๋ถ์ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ๋ฐํ๊ณ ๋ฌธ์ํํ๋ ๋ฐ ์ ์ฉํ ๋๊ตฌ์ ๋๋ค.
์น ์ปดํฌ๋ํธ ํ ์คํธ
์น ์ปดํฌ๋ํธ๋ฅผ ํ ์คํธํ๋ ๊ฒ์ ๊ธฐ์กด์ ์๋ฐ์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ๋ฅผ ํ ์คํธํ๋ ๊ฒ๊ณผ๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ด ํ์ํฉ๋๋ค. ์๋ DOM๊ณผ ๊ทธ๊ฒ์ด ์ ๊ณตํ๋ ์บก์ํ๋ฅผ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
Jest, Mocha, Cypress์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์น ์ปดํฌ๋ํธ๋ฅผ ํ ์คํธํ ์ ์์ต๋๋ค.
์์: ๊ฐ๋จํ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ง๋ค๊ธฐ
๊ฐ๋จํ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ npm์ ๊ฒ์ํ๋ ๊ณผ์ ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ํ ์ ๋๋ ํฐ๋ฆฌ ์์ฑ:
mkdir my-web-component-librarycd my-web-component-library - ์ npm ํจํค์ง ์ด๊ธฐํ:
npm init -y - ์น ์ปดํฌ๋ํธ ํ์ผ ์์ฑ (์: `my-component.js`):
class MyComponent extends HTMLElement { constructor() { super(); this.shadow = this.attachShadow({ mode: 'open' }); this.shadow.innerHTML = ` <style> :host { display: block; border: 1px solid black; padding: 10px; } </style> <p>My Component์์ ์ธ์ฌ๋๋ฆฝ๋๋ค!</p> `; } } customElements.define('my-component', MyComponent); - `package.json` ํ์ผ ์
๋ฐ์ดํธ:
{ "name": "my-web-component-library", "version": "0.1.0", "description": "๊ฐ๋จํ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ", "main": "my-component.js", "module": "my-component.js", "keywords": ["web components"], "author": "์ฌ์ฉ์ ์ด๋ฆ", "license": "MIT" } - ์ปดํฌ๋ํธ๋ฅผ ๋ด๋ณด๋ด๊ธฐ ์ํ `index.js` ํ์ผ ์์ฑ:
import './my-component.js'; - npm์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฒ์:
- npm ๊ณ์ ์์ฑ:
npm adduser - npm ๊ณ์ ์ ๋ก๊ทธ์ธ:
npm login - ํจํค์ง ๊ฒ์:
npm publish
- npm ๊ณ์ ์์ฑ:
์ด์ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ npm์ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ๋ถ์ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ ์ ์์ต๋๋ค:
npm install my-web-component-library
๊ทธ๋ฆฌ๊ณ ์์ ์ ์น ํ์ด์ง์์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
<script src="node_modules/my-web-component-library/index.js"></script>
<my-component></my-component>
๊ฒฐ๋ก
์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํ๊ณ๋ ์๋ก์ด ๋๊ตฌ์ ๊ธฐ์ ์ด ๋์์์ด ๋ฑ์ฅํ๋ฉฐ ์ง์์ ์ผ๋ก ๋ฐ์ ํ๊ณ ์์ต๋๋ค. ํจํค์ง ๊ด๋ฆฌ ๋ฐ ๋ฐฐํฌ์ ๊ธฐ๋ณธ์ ์ดํดํจ์ผ๋ก์จ, ์น์ ์ํ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ์์๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์น ์ปดํฌ๋ํธ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ตฌ์ถ, ๊ณต์ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด ๊ฐ์ด๋์์๋ ํจํค์ง ๊ด๋ฆฌ์, ๋ฐฐํฌ ๋ฐฉ๋ฒ, ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ํฌํจํ์ฌ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํ๊ณ์ ์ฃผ์ ์ธก๋ฉด์ ๋ค๋ฃจ์์ต๋๋ค. ์ด๋ฌํ ์ง์นจ์ ๋ฐ๋ฅด๋ฉด ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ ๊ณ ํ์ง ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
๋ ๋ชจ๋ํ๋๊ณ , ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ, ์ํธ์ด์ฉ์ฑ์ด ๋ฐ์ด๋ ์น์ ๊ตฌ์ถํ๊ธฐ ์ํด ์น ์ปดํฌ๋ํธ์ ํ์ ํ์ฉํ์ธ์.