์ ์ธ๊ณ์ ์ผ๋ก ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ์ปดํฌ๋ํธ ์์ฑ์ ์ํ ํจํค์ง ๊ด๋ฆฌ ๋ฐ ๋ฐฐํฌ ์ ๋ต์ ๋ค๋ฃจ๋ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํ๊ณ์ ๋ํ ์ฌ์ธต ํ๊ตฌ.
์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํ๊ณ: ํจํค์ง ๊ด๋ฆฌ vs. ๋ฐฐํฌ
์น ์ปดํฌ๋ํธ๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ํ๋ช ์ ์ผ์ผํค๊ณ ์์ผ๋ฉฐ, ๋ค์ํ ํ๋ ์์ํฌ์ ํ๋ก์ ํธ์์ ์ฌ์ฉํ ์ ์๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ์์๋ฅผ ๋ง๋๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด ๊ธ์์๋ ๊ธ๋ก๋ฒ ์น ๊ฐ๋ฐ ํ๊ฒฝ ๋ด์์ ํจํค์ง ๊ด๋ฆฌ ๋ฐ ๋ฐฐํฌ ์ ๋ต์ ์ด์ ์ ๋ง์ถฐ ์ด๋ฌํ ์ปดํฌ๋ํธ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ๋ฐฐํฌํ๋ ์ค์ํ ์ธก๋ฉด์ ์ฌ์ธต์ ์ผ๋ก ๋ค๋ฃน๋๋ค.
์น ์ปดํฌ๋ํธ ์ดํดํ๊ธฐ
์น ์ปดํฌ๋ํธ๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปค์คํ HTML ์์๋ฅผ ๋ง๋ค ์ ์๊ฒ ํด์ฃผ๋ ์น ํ๋ซํผ API์ ์งํฉ์ ๋๋ค. ๊ธฐ๋ฅ๊ณผ ์คํ์ผ์ ์บก์ํํ์ฌ ์ฌ๋ฌ ํ๋ก์ ํธ์์ ์ผ๊ด์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋ณด์ฅํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๊ตญ์ ์ ์ธ ํ์ ๊ณผ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์์ ์ธ ๋ชจ๋์์ด๊ณ ์ฒด๊ณ์ ์ธ ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ฅผ ์ด์งํฉ๋๋ค. ์น ์ปดํฌ๋ํธ๋ฅผ ๋ท๋ฐ์นจํ๋ ํต์ฌ ๊ธฐ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ปค์คํ
์๋ฆฌ๋จผํธ(Custom Elements): ์๋ก์ด HTML ํ๊ทธ(์:
<my-button>)๋ฅผ ์ ์ํฉ๋๋ค. - ์๋์ฐ DOM(Shadow DOM): ์ปดํฌ๋ํธ์ ๋ด๋ถ ๊ตฌ์กฐ์ ์คํ์ผ๋ง์ ์บก์ํํ์ฌ ํ์ด์ง์ ๋ค๋ฅธ ๋ถ๋ถ๊ณผ์ ์ถฉ๋์ ๋ฐฉ์งํฉ๋๋ค.
- HTML ํ ํ๋ฆฟ๊ณผ ์ฌ๋กฏ(HTML Templates and Slots): ์ปดํฌ๋ํธ ๋ด์์ ์ ์ฐํ ์ฝํ ์ธ ์ฝ์ ๋ฐ ํ ํ๋ฆฟ ์์ฑ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
ํจํค์ง ๊ด๋ฆฌ์ ์ค์์ฑ
ํจํค์ง ๊ด๋ฆฌ๋ ๋ชจ๋ ํ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ์ ๊ธฐ๋ณธ์ ๋๋ค. ์ด๋ ์์กด์ฑ ๊ด๋ฆฌ, ๋ฒ์ ์ ์ด, ์ฝ๋ ์ฌ์ฌ์ฉ์ ๋จ์ํํฉ๋๋ค. ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์์ ํ ๋ ํจํค์ง ๊ด๋ฆฌ์๋ ๋ค์๊ณผ ๊ฐ์ ์ค์ํ ์ญํ ์ ํฉ๋๋ค:
- ์์กด์ฑ ํด๊ฒฐ: ์ปดํฌ๋ํธ์ ์์กด์ฑ(์: ์คํ์ผ๋ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์ ํธ๋ฆฌํฐ ํจ์)์ ๊ด๋ฆฌํฉ๋๋ค.
- ๋ฒ์ ์ ์ด: ์ปดํฌ๋ํธ์ ๊ทธ ์์กด์ฑ์ ์ผ๊ด๋ ๋ฒ์ ์ ๋ณด์ฅํ์ฌ ์์ ์ฑ์ ์ ์งํ๊ณ ์ถฉ๋์ ๋ฐฉ์งํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
- ๋ฐฐํฌ ๋ฐ ์ค์น: ๋ค๋ฅธ ํ๋ก์ ํธ์์ ์ฝ๊ฒ ๋ฐฐํฌํ๊ณ ์ค์นํ ์ ์๋๋ก ์ปดํฌ๋ํธ๋ฅผ ํจํค์งํ์ฌ ๋ค์ํ ๊ตญ์ ํ ๊ฐ์ ํ์ ๊ณผ ์ฝ๋ ์ฌ์ฌ์ฉ์ ์ด์งํฉ๋๋ค.
์น ์ปดํฌ๋ํธ๋ฅผ ์ํ ์ธ๊ธฐ ์๋ ํจํค์ง ๊ด๋ฆฌ์
์น ์ปดํฌ๋ํธ ๊ฐ๋ฐ์๋ ์ฌ๋ฌ ํจํค์ง ๊ด๋ฆฌ์๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ๊ฐ๊ฐ ๋ค๋ฅธ ๊ธฐ๋ฅ๊ณผ ๊ฐ์ ์ ์ ๊ณตํฉ๋๋ค. ์ ํ์ ์ข ์ข ํ๋ก์ ํธ์ ํ์์ฑ, ํ์ ์ ํธ๋, ๋น๋ ํ๋ก์ธ์ค ๋ฐ ๋ฐฐํฌ ์ ๋ต๊ณผ ๊ด๋ จ๋ ํน์ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
npm (Node Package Manager)
npm์ Node.js์ JavaScript์ ๊ธฐ๋ณธ ํจํค์ง ๊ด๋ฆฌ์์ ๋๋ค. ๋ง์ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ด๋ จ ๋๊ตฌ๋ฅผ ํฌํจํ์ฌ ๋ฐฉ๋ํ ํจํค์ง ์ํ๊ณ๋ฅผ ์๋ํฉ๋๋ค. npm์ ๊ฐ์ ์ ๊ด๋ฒ์ํ ์ฑํ, ๋ฐฉ๋ํ ๋ ์ง์คํธ๋ฆฌ, ๊ทธ๋ฆฌ๊ณ ๊ฐ๋จํ ๋ช ๋ น์ค ์ธํฐํ์ด์ค์ ์์ต๋๋ค. npm์ ํนํ JavaScript์ Node.js์ ํฌ๊ฒ ์์กดํ๋ ํ๋ก์ ํธ์ ์ ํฉํ ๋ฒ์ฉ์ ์ธ ์ ํ์ ๋๋ค.
์์: npm์ ์ฌ์ฉํ์ฌ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์นํ๊ธฐ:
npm install @my-component-library/button-component
Yarn
Yarn์ ์๋, ์ ๋ขฐ์ฑ ๋ฐ ๋ณด์์ ์ค์ ์ ๋ ๋ ๋ค๋ฅธ ์ธ๊ธฐ ์๋ ํจํค์ง ๊ด๋ฆฌ์์ ๋๋ค. ํนํ ์บ์ฑ์ ์ฌ์ฉํ์ฌ npm์ ๋นํด ๋ ๋น ๋ฅธ ์ค์น ์๊ฐ์ ์ ๊ณตํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. Yarn์ ๊ฐ์ ์๋ ๊ฒฐ์ ๋ก ์ ์ค์น๊ฐ ํฌํจ๋์ด ์์ด ๋ค๋ฅธ ํ๊ฒฝ์์๋ ๋์ผํ ์์กด์ฑ์ด ์ผ๊ด๋๊ฒ ์ค์น๋๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ ์ ์ธ๊ณ์ ์ผ๋ก ๋ถ์ฐ๋ ์์น์ ์๋ ํ์๊ฒ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
์์: Yarn์ ์ฌ์ฉํ์ฌ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์นํ๊ธฐ:
yarn add @my-component-library/button-component
pnpm (Performant npm)
pnpm(performant npm)์ ํจ์จ์ฑ๊ณผ ๋์คํฌ ๊ณต๊ฐ ์ต์ ํ๋ฅผ ๊ฐ์กฐํ๋ ํ๋์ ์ธ ํจํค์ง ๊ด๋ฆฌ์์ ๋๋ค. ํ๋ ๋งํฌ๋ฅผ ์ฌ์ฉํ์ฌ ์์กด์ฑ์ ์ ์ฅํ๋ฏ๋ก ์ฌ์ฉ๋๋ ๋์คํฌ ๊ณต๊ฐ์ ์์ ์ค์ ๋๋ค. pnpm์ ์๋์ ๋ฆฌ์์ค ํจ์จ์ฑ์ ๋๊ท๋ชจ ํ๋ก์ ํธ ๋ฐ ๋์์ ์ฌ๋ฌ ํ๋ก์ ํธ์์ ์์ ํ๋ ํ์๊ฒ ํ์ํ ์ ํ์ด ๋ฉ๋๋ค. ์ด๋ ํนํ ๋๊ท๋ชจ ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ง์ ๊ฐ๋ณ ๊ธฐ์ฌ์๋ฅผ ๊ด๋ฆฌํ๋ ๊ธ๋ก๋ฒ ์กฐ์ง์ ์ ์ตํฉ๋๋ค.
์์: pnpm์ ์ฌ์ฉํ์ฌ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์นํ๊ธฐ:
pnpm add @my-component-library/button-component
ํจํค์ง ๊ด๋ฆฌ์ ์ ํ ์ ๊ณ ๋ ค์ฌํญ
- ํ๋ก์ ํธ ๊ท๋ชจ์ ๋ณต์ก์ฑ: ๋๊ท๋ชจ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ pnpm์ ํจ์จ์ฑ์ด ์๋นํ ์ด์ ์ด ๋ ์ ์์ต๋๋ค.
- ํ์ ์น์๋: ํ์ด ์ด๋ฏธ ์๊ณ ์๋ ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ์ฌ์ฉํ๋ฉด ์จ๋ณด๋ฉ๊ณผ ๊ฐ๋ฐ ์๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค.
- ์์กด์ฑ ์ถฉ๋: Yarn์ ๊ฒฐ์ ๋ก ์ ์ค์น๋ ์์กด์ฑ ์ถฉ๋์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ์ฑ๋ฅ: ๋ค๋ฅธ ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ํ๊ฐํ ๋ ์ค์น ์๋์ ๋์คํฌ ๊ณต๊ฐ ์ฌ์ฉ๋์ ๊ณ ๋ คํ์ญ์์ค.
์น ์ปดํฌ๋ํธ ๋ฐฐํฌ ์ ๋ต
์น ์ปดํฌ๋ํธ๋ฅผ ๋ฐฐํฌํ๋ ๊ฒ์ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ์์ ์ ํ๋ก์ ํธ์์ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ๊ฐ๊ฐ ๋ค๋ฅธ ์๊ตฌ์ ์ฌ์ฉ ์ฌ๋ก์ ๋ง์ถฐ ์ฌ๋ฌ ์ ๋ต์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํจํค์ง ๋ ์ง์คํธ๋ฆฌ์ ๊ฒ์ํ๊ธฐ (npm ๋ฑ)
๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ์ปดํฌ๋ํธ๋ฅผ ๊ณต๊ฐ ๋๋ ๋น๊ณต๊ฐ ํจํค์ง ๋ ์ง์คํธ๋ฆฌ(์: npm, Yarn์ ๋ ์ง์คํธ๋ฆฌ ๋๋ ๋น๊ณต๊ฐ npm ๋ ์ง์คํธ๋ฆฌ)์ ๊ฒ์ํ๋ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ค์ ์์ ์ด ์ ํํ ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ์ฝ๊ฒ ์ค์นํ ์ ์์ต๋๋ค. ์ด ์ ๋ต์ ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ ๋ค์ํ ํ๊ณผ ์ง๋ฆฌ์ ์์น ๊ฐ์ ํ์ ์ ์ด์งํฉ๋๋ค.
๊ฒ์ ๋จ๊ณ:
- ํจํค์ง ๊ตฌ์ฑ (
package.json): ์ด๋ฆ, ๋ฒ์ , ์ค๋ช , ์์ฑ์ ๋ฐ ์์กด์ฑ์ ํฌํจํ์ฌ ํ์ํ ๋ฉํ๋ฐ์ดํฐ๋กpackage.jsonํ์ผ์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑํฉ๋๋ค.mainํ๋๋ ์ผ๋ฐ์ ์ผ๋ก ์ปดํฌ๋ํธ์ ์ง์ ์ (์: ์ปดํ์ผ๋ JavaScript ํ์ผ)์ ๊ฐ๋ฆฌํต๋๋ค. - ๋น๋ ํ๋ก์ธ์ค: ๋น๋ ๋๊ตฌ(์: Webpack, Rollup, Parcel)๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก๋์ ์ฉ์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ฒ๋ค๋งํ๊ณ ์ต์ ํํฉ๋๋ค. ์ฌ๊ธฐ์๋ JavaScript ๋ฐ CSS ์ถ์, ์ ์ฌ์ ์ผ๋ก ๋ค๋ฅธ ์ถ๋ ฅ ํ์ ์์ฑ์ด ํฌํจ๋ฉ๋๋ค.
- ๋ ์ง์คํธ๋ฆฌ์ ๊ฒ์: ์ ํํ ํจํค์ง ๊ด๋ฆฌ์์ ์ ์ ํ ๋ช
๋ น์ค ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ํจํค์ง๋ฅผ ๊ฒ์ํฉ๋๋ค(์:
npm publish,yarn publish,pnpm publish).
ํ์ผ ์ง์ ๊ฐ์ ธ์ค๊ธฐ (๋ ์ผ๋ฐ์ ์ด์ง๋ง ํน์ ์๋๋ฆฌ์ค์์ ์ ์ฉ)
๊ฒฝ์ฐ์ ๋ฐ๋ผ, ํนํ ์๊ท๋ชจ ํ๋ก์ ํธ๋ ๋ด๋ถ ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ, ์ปดํฌ๋ํธ์ JavaScript ํ์ผ์ ํ๋ก์ ํธ๋ก ์ง์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ์ด๋ ๋ชจ๋ ๋ฒ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋ธ๋ผ์ฐ์ ์์ ES ๋ชจ๋์ ์ง์ ์ฌ์ฉํ์ฌ ๋ฌ์ฑํ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๋๊ท๋ชจ ํ๋ก์ ํธ๋ ๊ณต๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ํ์ฅ์ฑ์ด ๋จ์ด์ง์ง๋ง, ๋จ์ผ ํ๋ก์ ํธ๋ ์กฐ์ง ๋ด์์ ๋ ์๊ฑฐ๋, ๋ด๋ถ์ ์ด๊ฑฐ๋, ์ ์ํ๊ฒ ๊ฐ๋ฐ๋ ์ปดํฌ๋ํธ์ ํน์ ํตํฉ ์๋๋ฆฌ์ค์ ์ ์ฉํ ์ ์์ต๋๋ค.
์์: ES ๋ชจ๋์ ์ฌ์ฉํ์ฌ ๊ฐ์ ธ์ค๊ธฐ
<script type="module">
import { MyButton } from './my-button.js';
customElements.define('my-button', MyButton);
</script>
CDN ์ฌ์ฉํ๊ธฐ (์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ)
์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ(CDN)๋ ์น ์ปดํฌ๋ํธ๋ฅผ ํธ์คํ ํ๊ณ ์ ์ธ๊ณ์ ๋ฎ์ ์ง์ฐ ์๊ฐ์ผ๋ก ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ์ฌ๋ฌ ์น์ฌ์ดํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋๋ ์น ์ปดํฌ๋ํธ์ ํนํ ์ ์ฉํฉ๋๋ค. CDN์ ์ฌ์ฉํ๋ฉด ์ง๋ฆฌ์ ์์น์ ๊ด๊ณ์์ด ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ์ปดํฌ๋ํธ๊ฐ ์ ์ํ๊ฒ ์ ๋ฌ๋๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค. ๋ง์ CDN(์: jsDelivr, unpkg)์ด ์คํ ์์ค ํ๋ก์ ํธ์ ๋ฌด๋ฃ ํธ์คํ ์ ์ ๊ณตํฉ๋๋ค.
CDN ์ฌ์ฉ์ ์ด์ :
- ์ฑ๋ฅ: ์บ์ฑ ๋ฐ ์ง๋ฆฌ์ ์ผ๋ก ๋ถ์ฐ๋ ์๋ฒ๋ก ์ธํด ๋ก๋ฉ ์๊ฐ์ด ๋นจ๋ผ์ง๋๋ค.
- ํ์ฅ์ฑ: CDN์ ์ฑ๋ฅ ์ ํ ์์ด ๋๋์ ํธ๋ํฝ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ์ฌ์ฉ ์ฉ์ด์ฑ: ๋ช ์ค์ HTML๋ก ๊ฐ๋จํ๊ฒ ํตํฉํ ์ ์์ต๋๋ค.
์์: CDN์์ ์ปดํฌ๋ํธ ํฌํจํ๊ธฐ
<script type="module" src="https://cdn.jsdelivr.net/npm/@my-component-library/button-component@1.0.0/dist/button-component.js"></script>
ํ๋ ์์ํฌ๋ณ ํจํค์ง๋ก ๋น๋ ๋ฐ ๋ฐฐํฌํ๊ธฐ
์น ์ปดํฌ๋ํธ๋ ํ๋ ์์ํฌ์ ๊ตฌ์ ๋ฐ์ง ์์ง๋ง, React, Angular, Vue์ ๊ฐ์ ์ธ๊ธฐ ์๋ ํ๋ ์์ํฌ์ ํน๋ณํ ๋ง์ถคํ๋ ํจํค์ง๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ์ ์ตํ ์ ์์ต๋๋ค. ์ด๋ ์น ์ปดํฌ๋ํธ๋ฅผ ํ๋ ์์ํฌ์ ์ปดํฌ๋ํธ ๋ชจ๋ธ๊ณผ ํตํฉํ๋ ๋ํผ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ํตํด ๊ฐ๋ฐ์๋ค์ ์์ ์ด ์ ํํ ํ๋ ์์ํฌ ๋ด์์ ๋ ์์ฐ์ค๋ฝ๊ณ ์ต์ํ ๋ฐฉ์์ผ๋ก ์น ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ํตํฉ์ ๋จ์ํํ๋ ๋น๋ ๋๊ตฌ๋ ์ด๋ํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํฌํจ๋ ์ ์์ต๋๋ค.
์์: ๋ํผ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ฌ React์ ์น ์ปดํฌ๋ํธ ํตํฉํ๊ธฐ:
import React from 'react';
function MyButtonWrapper(props) {
return <my-button {...props} />;
}
๋ชจ๋ ธ๋ ํฌ
๋ชจ๋ ธ๋ ํฌ(๋ชจ๋๋ฆฌ์ ๋ฆฌํฌ์งํ ๋ฆฌ)๋ ์ฌ๋ฌ ๊ด๋ จ ํ๋ก์ ํธ(์: ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ๋ฌธ์, ์์ ๋ฐ ์ ์ฌ์ ์ธ ํ๋ ์์ํฌ๋ณ ๋ํผ)๋ฅผ ๋ด๋ ๋จ์ผ ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋๋ค. ์ด๋ ํนํ ๊ด๋ จ ์น ์ปดํฌ๋ํธ ์ ํ๊ตฐ์์ ์์ ํ๋ ๋๊ท๋ชจ ํ์ ๊ฒฝ์ฐ ์์กด์ฑ ๊ด๋ฆฌ, ์ฝ๋ ๊ณต์ ๋ฐ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ค์ํ ์ปดํฌ๋ํธ ์ธํธ์ ๊ฑธ์ณ ๋์ ์์ค์ ์ผ๊ด์ฑ, ์ ์ง ๊ด๋ฆฌ ์ฉ์ด์ฑ ๋ฐ ํฅ์๋ ํ์ ์ด ํ์ํ ํ์๊ฒ ์ ์ตํฉ๋๋ค.
๋ชจ๋ ธ๋ ํฌ์ ์ด์ :
- ๋จ์ํ๋ ์์กด์ฑ ๊ด๋ฆฌ
- ๋ ์ฌ์ด ์ฝ๋ ๊ณต์ ๋ฐ ์ฌ์ฌ์ฉ
- ์ผ๊ด๋ ๋ฒ์ ๊ด๋ฆฌ
- ํฅ์๋ ํ์
ํ๋ก๋์ ์ ์ํ ๋ฒ๋ค๋ง ๋ฐ ์ต์ ํ
์น ์ปดํฌ๋ํธ๋ฅผ ๋ฐฐํฌํ๊ธฐ ์ ์ ํ๋ก๋์ ํ๊ฒฝ์ ๋ง๊ฒ ์ต์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์ฝ๋ ๋ฒ๋ค๋ง, JavaScript ๋ฐ CSS ์ถ์, ๊ทธ๋ฆฌ๊ณ ๋ค์ํ ์ฌ์ฉ ์ฌ๋ก์ ๋ง์ถฐ ๋ค๋ฅธ ์ถ๋ ฅ ํ์์ ์์ฑํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค. ์ฃผ์ ๊ณ ๋ ค ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
๋ฒ๋ค๋ง ๋๊ตฌ
Webpack, Rollup, Parcel๊ณผ ๊ฐ์ ๋๊ตฌ๋ ์ฝ๋๋ฅผ ๋จ์ผ ํ์ผ(๋๋ ํ์ผ ์งํฉ)์ผ๋ก ๋ฒ๋ค๋งํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ ์ปดํฌ๋ํธ๋ฅผ ๋ก๋ํ๋ ๋ฐ ํ์ํ HTTP ์์ฒญ ์๋ฅผ ์ค์ฌ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ ๋ํ ํธ๋ฆฌ ์ ฐ์ดํน(์ฌ์ฉํ์ง ์๋ ์ฝ๋ ์ ๊ฑฐ), ์ฝ๋ ๋ถํ (ํ์์ ์ฝ๋ ๋ก๋), ๋ฐ๋ ์ฝ๋ ์ ๊ฑฐ์ ๊ฐ์ ๊ธฐ๋ฅ์ ํ์ฑํํฉ๋๋ค. ๋ฒ๋ค๋ฌ์ ์ ํ์ ํ๋ก์ ํธ๋ณ ์๊ตฌ ์ฌํญ๊ณผ ๊ฐ์ธ์ ์ ํธ๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
์ถ์(Minification)
์ถ์๋ ๊ณต๋ฐฑ, ์ฃผ์์ ์ ๊ฑฐํ๊ณ ๋ณ์ ์ด๋ฆ์ ์ค์ฌ JavaScript ๋ฐ CSS ํ์ผ์ ํฌ๊ธฐ๋ฅผ ์ค์ ๋๋ค. ์ด๋ ๋ค์ด๋ก๋ํด์ผ ํ๋ ๋ฐ์ดํฐ์ ์์ ์ค์ฌ ๋ก๋ฉ ์๊ฐ์ ๋จ์ถ์ํต๋๋ค. ์ถ์๋ ๋น๋ ๋๊ตฌ๋ ์ ์ฉ ์ถ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ํํ ์ ์์ต๋๋ค.
์ฝ๋ ๋ถํ (Code Splitting)
์ฝ๋ ๋ถํ ์ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ฅผ ๋ ์์ ์ฒญํฌ๋ก ๋๋์ด ํ์ํ ๋ ๋ก๋ํ ์ ์์ต๋๋ค. ์ด๋ ํ์ด์ง์์ ํญ์ ์ฌ์ฉ๋์ง ์๋ ์น ์ปดํฌ๋ํธ์ ํนํ ์ ์ฉํฉ๋๋ค. ์ปดํฌ๋ํธ๋ฅผ ํ์ํ ๋๋ง ๋ก๋ํจ์ผ๋ก์จ ์น ํ์ด์ง์ ์ด๊ธฐ ๋ก๋ ์๊ฐ์ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
๋ฒ์ ๊ด๋ฆฌ(Versioning)
์๋งจํฑ ๋ฒ์ ๊ด๋ฆฌ(SemVer)๋ ์ํํธ์จ์ด ๋ฒ์ ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ํ์ค์ ๋๋ค. ๋ณ๊ฒฝ์ ์ฑ๊ฒฉ์ ๋ํ๋ด๊ธฐ ์ํด ์ธ ๋ถ๋ถ ํ์(MAJOR.MINOR.PATCH)์ ์ฌ์ฉํฉ๋๋ค. SemVer ์์น์ ๋ฐ๋ฅด๋ ๊ฒ์ ํธํ์ฑ์ ์ ์งํ๊ณ ๊ฐ๋ฐ์๊ฐ ์น ์ปดํฌ๋ํธ ์ ๋ฐ์ดํธ์ ์ํฅ์ ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ก ํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ์ ์ ํ ๋ฒ์ ๊ด๋ฆฌ๋ ์ ๋ฐ์ดํธ๋ฅผ ๊ด๋ฆฌํ๊ณ ๊ฐ๋ฐ์๊ฐ ํญ์ ์ฌ๋ฐ๋ฅธ ๋ฒ์ ์ ์ก์ธ์คํ ์ ์๋๋ก ๋์ต๋๋ค.
์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ๋ฐ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
- ๋ฌธ์ํ: ์ฌ์ฉ ์์ , API ์ฐธ์กฐ ๋ฐ ์คํ์ผ๋ง ์ฌ์ฉ์ ์ ์ ์ต์ ์ ํฌํจํ ํฌ๊ด์ ์ธ ๋ฌธ์๋ฅผ ์ ๊ณตํ์ญ์์ค. Storybook์ด๋ Docz์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ํธ์์ฉ์ ์ด๊ณ ์ ๊ตฌ์กฐํ๋ ๋ฌธ์๋ฅผ ๋ง๋์ญ์์ค. ์ด๋ ๊ธ๋ก๋ฒ ์ฑํ๊ณผ ๋ค์ํ ํ์ ํจ๊ณผ์ ์ธ ์ฌ์ฉ์ ํต์ฌ์ ๋๋ค.
- ํ ์คํ : ๋จ์ ํ ์คํธ, ํตํฉ ํ ์คํธ, ์๋ํฌ์๋ ํ ์คํธ๋ฅผ ํฌํจํ ๊ฐ๋ ฅํ ํ ์คํธ ์ ๋ต์ ๊ตฌํํ์ญ์์ค. ์๋ํ๋ ํ ์คํธ๋ ์ปดํฌ๋ํธ์ ํ์ง๊ณผ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํฉ๋๋ค. ํ ์คํธ๊ฐ ์ ์ธ๊ณ์ ๊ธฐ์ฌ์ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์๋น์๊ฐ ์ ๊ทผํ๊ณ ์คํํ ์ ์๋๋ก ํ์ญ์์ค. ์ฌ๋ฌ ์ธ์ด๋ฅผ ์ง์ํ๊ธฐ ์ํด ํ ์คํธ ํ๋ ์์ํฌ์ ๊ตญ์ ํ๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
- ์ ๊ทผ์ฑ: WCAG ๊ฐ์ด๋๋ผ์ธ์ ๋ฐ๋ผ ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์๊ฐ ์ปดํฌ๋ํธ์ ์ ๊ทผํ ์ ์๋๋ก ๋ณด์ฅํ์ญ์์ค. ์ฌ๊ธฐ์๋ ์ ์ ํ ARIA ์์ฑ, ํค๋ณด๋ ํ์ ๋ฐ ์ถฉ๋ถํ ์์ ๋๋น ์ ๊ณต์ด ํฌํจ๋ฉ๋๋ค. ์ ๊ทผ์ฑ์ ๊ธ๋ก๋ฒ ํฌ์ฉ์ฑ์ ์ํด ๋งค์ฐ ์ค์ํฉ๋๋ค.
- ์ฑ๋ฅ: ์ด๊ธฐ ๋ก๋ ์๊ฐ, ๋ ๋๋ง ์๋ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๊ณผ ๊ฐ์ ์์๋ฅผ ๊ณ ๋ คํ์ฌ ์ปดํฌ๋ํธ์ ์ฑ๋ฅ์ ์ต์ ํํ์ญ์์ค. ์ด๋ ๋๋ฆฐ ์ธํฐ๋ท ์ฐ๊ฒฐ์ด๋ ๊ตฌํ ์ฅ์น๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ์์๊ฒ ํนํ ์ค์ํฉ๋๋ค. ๊ธ๋ก๋ฒ ๊ณ ๊ฐ์ ์ํ ์ฑ๋ฅ ์ต์ ํ๋ ํ์์ ์ ๋๋ค.
- ๊ตญ์ ํ(i18n) ๋ฐ ํ์งํ(l10n): ๊ตญ์ ํ(์ฝ๋๋ฅผ ๋ฒ์ญํ ์ ์๋๋ก ์ค๋น) ๋ฐ ํ์งํ(์ปดํฌ๋ํธ๋ฅผ ํน์ ์ธ์ด ๋ฐ ์ง์ญ์ ๋ง๊ฒ ์กฐ์ )๋ฅผ ์ง์ํ๋๋ก ์ปดํฌ๋ํธ๋ฅผ ์ค๊ณํ์ญ์์ค. ์ด๋ฅผ ํตํด ์ปดํฌ๋ํธ๋ฅผ ๋ค๋ฅธ ๊ตญ๊ฐ์ ์ธ์ด์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋ณด์: ์ฌ์ฉ์ ์ ๋ ฅ ์๋ ๋ฐ ๊ต์ฐจ ์ฌ์ดํธ ์คํฌ๋ฆฝํ (XSS) ์ทจ์ฝ์ ๋ฐฉ์ง์ ๊ฐ์ ๋ณด์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ตฌํํ์ญ์์ค. ๋ณด์ ์ปดํฌ๋ํธ๋ ์ฌ์ฉ์์ ๋ฐ์ดํฐ์ ๋ช ์ฑ์ ๋ณดํธํฉ๋๋ค.
- ๋น๋ ๋๊ตฌ ํตํฉ ๊ณ ๋ ค: ๊ธฐ์กด ์ํฌํ๋ก์ฐ์ ์ฝ๊ฒ ํตํฉํ ์ ์๊ณ ์ปดํฌ๋ํธ ์ปดํ์ผ, ์ถ์ ๋ฐ ๋ฐฐํฌ์ ํ์ํ ๊ธฐ๋ฅ์ ์ง์ํ๋ ๋น๋ ๋๊ตฌ๋ฅผ ์ ํํ์ญ์์ค. ๋ค๋ฅธ ์ง๋ฆฌ์ ์์น์์ ์ธ๊ธฐ ์๋ ๋ค์ํ IDE ๋ฐ ๋น๋ ์์คํ ๊ณผ์ ํตํฉ์ ๊ณ ๋ คํ์ญ์์ค.
์ฌ๋ฐ๋ฅธ ์ ๊ทผ ๋ฐฉ์ ์ ํํ๊ธฐ
ํจํค์ง ๊ด๋ฆฌ ๋ฐ ๋ฐฐํฌ๋ฅผ ์ํ ์ต์ ์ ์ ๊ทผ ๋ฐฉ์์ ํ๋ก์ ํธ์ ํน์ ์๊ตฌ์ ๋ชฉํ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ๋ค์ ์์๋ฅผ ๊ณ ๋ คํ์ญ์์ค:
- ํ๋ก์ ํธ ๊ท๋ชจ: ์๊ท๋ชจ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ์ง์ ํ์ผ ๊ฐ์ ธ์ค๊ธฐ๋ CDN์ผ๋ก ์ถฉ๋ถํ ์ ์์ต๋๋ค. ๋๊ท๋ชจ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ํจํค์ง ๋ ์ง์คํธ๋ฆฌ์ ๊ฒ์ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ์ต์ ์ ์ ํ์ ๋๋ค.
- ํ ๊ท๋ชจ ๋ฐ ๊ตฌ์กฐ: ๋๊ท๋ชจ ํ๊ณผ ํ์ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ํจํค์ง ๋ ์ง์คํธ๋ฆฌ์ ์ ์ ์๋ ๋น๋ ํ๋ก์ธ์ค๊ฐ ํ์์ ์ ๋๋ค.
- ๋์ ๊ณ ๊ฐ: ์ ํ์ ํ ๋ ๋์ ๊ณ ๊ฐ์ ๊ธฐ์ ๋ฅ๋ ฅ๊ณผ ๊ฒฝํ์ ๊ณ ๋ คํ์ญ์์ค.
- ์ ์ง ๊ด๋ฆฌ: ์๊ฐ์ด ์ง๋๋ ์ง์ ๊ฐ๋ฅํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์ ๋ต์ ์ ํํ์ญ์์ค.
๋ฏธ๋ ๋ํฅ ๋ฐ ๊ณ ๋ ค์ฌํญ
์น ์ปดํฌ๋ํธ ์ํ๊ณ๋ ์ง์์ ์ผ๋ก ์งํํ๊ณ ์์ต๋๋ค. ์๋ก์ด ๋ํฅ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ค์์ ์๋ก์ด ๋ํฅ์ ๊ณ ๋ คํ์ญ์์ค:
- ๋ธ๋ผ์ฐ์ ์ ESM (ECMAScript Modules): ์ต์ ๋ธ๋ผ์ฐ์ ์์ ES ๋ชจ๋์ ๋ํ ์ง์์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๋ฐฐํฌ ํ๋ก์ธ์ค๊ฐ ๋จ์ํ๋๊ณ , ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ณต์กํ ๋น๋ ๊ตฌ์ฑ์ ํ์์ฑ์ด ์ค์ด๋ญ๋๋ค.
- ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: ์น ์ปดํฌ๋ํธ ์์ฑ ๋ฐ ๊ด๋ฆฌ๋ฅผ ๊ฐ์ํํ๊ณ ๋ด์ฅ ๊ธฐ๋ฅ๊ณผ ์ต์ ํ๋ฅผ ์ ๊ณตํ๋ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์: Lit, Stencil)์ ์ธ๊ธฐ๊ฐ ๋์์ง๊ณ ์์ต๋๋ค.
- WebAssembly (Wasm): WebAssembly๋ ์ปดํ์ผ๋ ์ฝ๋(์: C++, Rust)๋ฅผ ๋ธ๋ผ์ฐ์ ์์ ์คํํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ ๋ณต์กํ ์น ์ปดํฌ๋ํธ์ ์ฑ๋ฅ์ ์ ์ฌ์ ์ผ๋ก ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ์ปดํฌ๋ํธ ๊ตฌ์ฑ: ๋ ์๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ๋ก๋ถํฐ ๋ณต์กํ ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์ฑํ๋ ์๋ก์ด ํจํด์ด ๋ฑ์ฅํ๊ณ ์์ต๋๋ค. ์ด๋ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ฐ์ฑ์ ๋์ฑ ํฅ์์ํต๋๋ค.
- ์๋ฒ ์ธก ๋ ๋๋ง(SSR) ์ง์: ์น ์ปดํฌ๋ํธ๊ฐ ์๋ฒ ์ธก ๋ ๋๋ง ํ๋ ์์ํฌ์ ์ ์๋ํ๋๋ก ๋ณด์ฅํ๋ ๊ฒ์ ์ต์ ์ ์ฑ๋ฅ๊ณผ SEO๋ฅผ ๋ฌ์ฑํ๋ ๋ฐ ์ค์ํ ๊ฒ์ ๋๋ค.
๊ฒฐ๋ก
ํจ๊ณผ์ ์ธ ํจํค์ง ๊ด๋ฆฌ ๋ฐ ๋ฐฐํฌ๋ ์ ์ธ๊ณ์ ์ผ๋ก ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์์ฑํ๊ณ ๊ณต์ ํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์ด ๊ธ์์ ๋ ผ์๋ ๋ค์ํ ํจํค์ง ๊ด๋ฆฌ์, ๋ฐฐํฌ ์ ๋ต ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํดํจ์ผ๋ก์จ ํ๋ก ํธ์๋ ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ๋ฅผ ํฅ์์ํค๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ ์น ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ด ์ง์์ ๊ตญ์ ํ๋ก์ ํธ์์ ํจ๊ณผ์ ์ผ๋ก ํ์ ํ๊ณ ๋ฏธ๋ ์งํฅ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ์น ์ปดํฌ๋ํธ์ ๊ทธ ๊ฒฌ๊ณ ํ ์ํ๊ณ๋ฅผ ๋ฐ์๋ค์ฌ ์ ์ธ๊ณ ๊ณ ๊ฐ์๊ฒ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ํ๋ ฅ์ ์ด๊ณ ํ์ฅ ๊ฐ๋ฅํ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ๋ฐํ๊ณ , ์ฑ๋ฅ, ์ ๊ทผ์ฑ, ๊ตญ์ ํ ๋ฐ ๋ณด์์ ๊ณ ๋ คํ์ฌ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ๋ค๊ฐ๊ฐ์ญ์์ค.