๋ค์ํ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋ง์ถฐ ์น ์ปดํฌ๋ํธ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ฐฐํฌํ๊ณ ํจํค์งํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ข ํฉ ๊ฐ์ด๋. ๋ค์ํ ์ ๋ต๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.
์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: ์ปค์คํ ์๋ฆฌ๋จผํธ ๋ฐฐํฌ ๋ฐ ํจํค์ง ์ ๋ต
์น ์ปดํฌ๋ํธ๋ ํ๋ ์น์ ์ํ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ ์บก์ํ๋ UI ์๋ฆฌ๋จผํธ๋ฅผ ๋ง๋๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๊ฐ๋ฐ์๋ ์์ ๋ง์ ๊ธฐ๋ฅ๊ณผ ์คํ์ผ์ ๊ฐ์ง ์ปค์คํ HTML ํ๊ทธ๋ฅผ ์ ์ํ์ฌ ๋ค์ํ ํ๋ก์ ํธ์์ ๋ชจ๋์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ํ์ง๋ง ์ด๋ฌํ ์ปดํฌ๋ํธ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ฐฐํฌํ๊ณ ํจํค์งํ๋ ๊ฒ์ ๊ด๋ฒ์ํ ์ฑํ๊ณผ ์ํํ ํตํฉ์ ์ํด ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ด ๊ฐ์ด๋์์๋ ๋ค์ํ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋ง์ถฐ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํจํค์งํ๊ณ ๋ฐฐํฌํ๊ธฐ ์ํ ๋ค์ํ ์ ๋ต๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํด๋ด ๋๋ค.
์น ์ปดํฌ๋ํธ ํจํค์ง ํ๊ฒฝ ์ดํดํ๊ธฐ
ํน์ ํจํค์ง ๊ธฐ์ ์ ๋ํด ์์๋ณด๊ธฐ ์ ์, ๊ด๋ จ๋ ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ๋๊ตฌ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ํต์ฌ์ ์ผ๋ก ์น ์ปดํฌ๋ํธ ๋ฐฐํฌ๋ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ์ฌ๋ฌ๋ถ์ ์ปค์คํ ์๋ฆฌ๋จผํธ์ ์ ๊ทผํ ์ ์๋๋ก ๋ง๋๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ๊ทธ๋ค์ด ๋จ์ผ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ (SPA), ์ ํต์ ์ธ ์๋ฒ ๋ ๋๋ง ์น์ฌ์ดํธ, ๋๋ ์ด ๋์ ํผํฉ ํ๊ฒฝ์์ ์์ ํ๋ ์๊ด์์ด ๋ง์ ๋๋ค.
๋ฐฐํฌ ์ ์ฃผ์ ๊ณ ๋ ค์ฌํญ
- ํ๊ฒ ๊ณ ๊ฐ: ๋๊ฐ ์ฌ๋ฌ๋ถ์ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๊ฒ ๋ ๊น์? ๋ด๋ถ ํ, ์ธ๋ถ ๊ฐ๋ฐ์, ๋๋ ๋ ๋ค์ธ๊ฐ์? ์๋๋ ๊ณ ๊ฐ์ ํจํค์ง ์ ํ๊ณผ ๋ฌธ์ํ ์คํ์ผ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ด๋ถ์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ณต๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋นํด ์ด๊ธฐ์ ๋ ์๊ฒฉํ ๋ฌธ์ํ ์๊ตฌ์ฌํญ์ ๊ฐ์ง ์ ์์ต๋๋ค.
- ๊ฐ๋ฐ ํ๊ฒฝ: ์ฌ์ฉ์๋ค์ด ์ด๋ค ํ๋ ์์ํฌ์ ๋น๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ๊ฐ๋ฅ์ฑ์ด ๋๋์? React, Angular, Vue.js, ๋๋ ์์ JavaScript๋ฅผ ์ฌ์ฉํ๋์? ์ฌ๋ฌ๋ถ์ ํจํค์ง ์ ๋ต์ ๊ด๋ฒ์ํ ํ๊ฒฝ๊ณผ ํธํ๋๊ฑฐ๋ ๊ฐ ํ๊ฒฝ์ ๋ํ ๊ตฌ์ฒด์ ์ธ ์ง์นจ์ ์ ๊ณตํ๋ ๊ฒ์ ๋ชฉํ๋ก ํด์ผ ํฉ๋๋ค.
- ๋ฐฐํฌ ์๋๋ฆฌ์ค: ์ปดํฌ๋ํธ๊ฐ ์ด๋ป๊ฒ ๋ฐฐํฌ๋ ๊น์? CDN์ ํตํด ๋ก๋๋๊ฑฐ๋, ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ํจ๊ป ๋ฒ๋ค๋ง๋๊ฑฐ๋, ๋ก์ปฌ ํ์ผ ์์คํ ์์ ์ ๊ณต๋ ๊น์? ๊ฐ ๋ฐฐํฌ ์๋๋ฆฌ์ค๋ง๋ค ๊ณ ์ ํ ๋์ ๊ณผ ๊ธฐํ๊ฐ ์์ต๋๋ค.
- ๋ฒ์ ๊ด๋ฆฌ: ์ปดํฌ๋ํธ์ ์ ๋ฐ์ดํธ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ด๋ป๊ฒ ๊ด๋ฆฌํ ๊ฒ์ธ๊ฐ์? ์๋งจํฑ ๋ฒ์ ๋(SemVer)์ ๋ฒ์ ๋ฒํธ๋ฅผ ๊ด๋ฆฌํ๊ณ ๋ณ๊ฒฝ ์ฌํญ์ ์ํฅ์ ์ ๋ฌํ๊ธฐ ์ํด ๋๋ฆฌ ์ฑํ๋ ํ์ค์ ๋๋ค. ๋ช ํํ ๋ฒ์ ๊ด๋ฆฌ๋ ํธํ์ฑ์ ๊นจ๋จ๋ฆฌ๋ ๋ณ๊ฒฝ์ ๋ฐฉ์งํ๊ณ ํธํ์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
- ๋ฌธ์ํ: ํฌ๊ด์ ์ด๊ณ ์ ๊ด๋ฆฌ๋ ๋ฌธ์๋ ๋ชจ๋ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์์ ์ ๋๋ค. ์ค์น, ์ฌ์ฉ๋ฒ, API ์ฐธ์กฐ ๋ฐ ์์ ์ ๋ํ ๋ช ํํ ์ง์นจ์ ํฌํจํด์ผ ํฉ๋๋ค. Storybook๊ณผ ๊ฐ์ ๋๊ตฌ๋ ์ํธ์์ฉ์ ์ธ ์ปดํฌ๋ํธ ๋ฌธ์๋ฅผ ๋ง๋๋ ๋ฐ ๋งค์ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
์น ์ปดํฌ๋ํธ๋ฅผ ์ํ ํจํค์ง ์ ๋ต
์น ์ปดํฌ๋ํธ๋ฅผ ํจํค์งํ๋ ๋ฐ๋ ์ฌ๋ฌ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ด ์์ผ๋ฉฐ, ๊ฐ๊ฐ ์ฅ๋จ์ ์ด ์์ต๋๋ค. ์ต์์ ์ ๋ต์ ํ๋ก์ ํธ์ ํน์ ์๊ตฌ์ฌํญ๊ณผ ํ๊ฒ ๊ณ ๊ฐ์ ์ ํธ๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
1. npm(Node Package Manager)์ ๊ฒ์ํ๊ธฐ
๊ฐ์: npm์ ๊ฒ์ํ๋ ๊ฒ์ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฐฐํฌํ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ด๊ณ ๋๋ฆฌ ๊ถ์ฅ๋๋ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. npm์ Node.js์ ํจํค์ง ๊ด๋ฆฌ์์ด๋ฉฐ ๋๋ค์์ JavaScript ๊ฐ๋ฐ์๊ฐ ์ฌ์ฉํฉ๋๋ค. ํจํค์ง๋ฅผ ๋ฐ๊ฒฌํ๊ณ , ์ค์นํ๊ณ , ๊ด๋ฆฌํ๊ธฐ ์ํ ์ค์ ์ ์ฅ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ง์ ํ๋ก ํธ์๋ ๋น๋ ๋๊ตฌ์ ํ๋ ์์ํฌ๊ฐ ์์กด์ฑ ๊ด๋ฆฌ๋ฅผ ์ํด npm์ ์์กดํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ฐ์ด๋ ๋ฐ๊ฒฌ ๊ฐ๋ฅ์ฑ๊ณผ ์ผ๋ฐ์ ์ธ ๋น๋ ํ๋ก์ธ์ค์์ ํตํฉ์ ์ ๊ณตํฉ๋๋ค.
ํฌํจ๋ ๋จ๊ณ:
- ํ๋ก์ ํธ ์ค์ :
npm init
์ ์ฌ์ฉํ์ฌ ์ npm ํจํค์ง๋ฅผ ์์ฑํฉ๋๋ค. ์ด ๋ช ๋ น์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด๋ฆ, ๋ฒ์ , ์์กด์ฑ ๋ฐ ์คํฌ๋ฆฝํธ๋ฅผ ํฌํจํ ๋ฉํ๋ฐ์ดํฐ๊ฐ ๋ด๊ธดpackage.json
ํ์ผ์ ๋ง๋๋ ๊ณผ์ ์ ์๋ดํฉ๋๋ค. ํจํค์ง๋ฅผ ์ํด ์ค๋ช ์ ์ด๊ณ ๊ณ ์ ํ ์ด๋ฆ์ ์ ํํ์ธ์. ์ด๋ฏธ ์ฌ์ฉ ์ค์ด๊ฑฐ๋ ๊ธฐ์กด ํจํค์ง์ ๋๋ฌด ์ ์ฌํ ์ด๋ฆ์ ํผํด์ผ ํฉ๋๋ค. - ์ปดํฌ๋ํธ ์ฝ๋: ์น ์ปดํฌ๋ํธ ํ์ค์ ์ค์ํ๋๋ก ์น ์ปดํฌ๋ํธ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. ๋ ๋์ ์ ์ง๋ณด์์ฑ์ ์ํด ์ปดํฌ๋ํธ๋ฅผ ๋ณ๋์ ํ์ผ๋ก ๊ตฌ์ฑํ์ธ์. ์๋ฅผ ๋ค์ด,
my-component.js
,another-component.js
๋ฑ์ ํ์ผ์ ์์ฑํฉ๋๋ค. - ๋น๋ ํ๋ก์ธ์ค (์ ํ ์ฌํญ): ๊ฐ๋จํ ์ปดํฌ๋ํธ์๋ ํญ์ ํ์ํ ๊ฒ์ ์๋์ง๋ง, ๋น๋ ํ๋ก์ธ์ค๋ ์ฝ๋๋ฅผ ์ต์ ํํ๊ณ , ๊ตฌํ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ง์ํ๋๋ก ํธ๋์คํ์ผ๋งํ๊ณ , ๋ฒ๋ค ํ์ผ์ ์์ฑํ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค. Rollup, Webpack, Parcel๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ด ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. TypeScript๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ฝ๋๋ฅผ JavaScript๋ก ์ปดํ์ผํด์ผ ํฉ๋๋ค.
- ํจํค์ง ๊ตฌ์ฑ: ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ง์
์ (๋ณดํต ๋ฉ์ธ JavaScript ํ์ผ)๊ณผ ๋ชจ๋ ์์กด์ฑ์ ์ง์ ํ๋๋ก
package.json
ํ์ผ์ ๊ตฌ์ฑํฉ๋๋ค. ๋ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋น๋, ํ ์คํธ, ๊ฒ์ํ๊ธฐ ์ํ ์คํฌ๋ฆฝํธ๋ฅผ ์ ์ํฉ๋๋ค. ๊ฒ์๋ ํจํค์ง์ ํฌํจ๋ ํ์ผ๊ณผ ๋๋ ํ ๋ฆฌ๋ฅผ ์ง์ ํ๋package.json
์files
๋ฐฐ์ด์ ์ธ์ฌํ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์ธ์. ๊ฐ๋ฐ ๋๊ตฌ๋ ์์ ์ฝ๋์ ๊ฐ์ ๋ถํ์ํ ํ์ผ์ ์ ์ธํฉ๋๋ค. - ๊ฒ์ํ๊ธฐ: npm ๊ณ์ ์ด ์๋ค๋ฉด ์์ฑํ๊ณ , ์ปค๋งจ๋ ๋ผ์ธ์์
npm login
์ ํตํด ๋ก๊ทธ์ธํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์npm publish
๋ฅผ ์ฌ์ฉํ์ฌ ํจํค์ง๋ฅผ ๊ฒ์ํฉ๋๋ค. ์ ๋ฆด๋ฆฌ์ค๋ฅผ ๊ฒ์ํ๊ธฐ ์ ์npm version
์ ์ฌ์ฉํ์ฌ ๋ฒ์ ๋ฒํธ๋ฅผ ์ฌ๋ฆฌ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
์์ :
"my-button"์ด๋ผ๋ ๋จ์ผ ์ปดํฌ๋ํธ๋ฅผ ํฌํจํ๋ ๊ฐ๋จํ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์๊ฐํด๋ณด์ธ์. ๊ฐ๋ฅํ package.json
๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
{
"name": "my-button-component",
"version": "1.0.0",
"description": "A simple Web Component button.",
"main": "dist/my-button.js",
"module": "dist/my-button.js",
"scripts": {
"build": "rollup -c",
"test": "echo \"Error: no test specified\" && exit 1",
"prepublishOnly": "npm run build"
},
"keywords": [
"web components",
"button",
"custom element"
],
"author": "Your Name",
"license": "MIT",
"devDependencies": {
"rollup": "^2.0.0",
"@rollup/plugin-node-resolve": "^13.0.0"
},
"files": [
"dist/"
]
}
์ด ์์ ์์ main
๋ฐ module
ํ๋๋ ๋ฒ๋ค๋ JavaScript ํ์ผ dist/my-button.js
๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. build
์คํฌ๋ฆฝํธ๋ Rollup์ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ๋ฒ๋ค๋งํ๊ณ , prepublishOnly
์คํฌ๋ฆฝํธ๋ ๊ฒ์ํ๊ธฐ ์ ์ ์ฝ๋๊ฐ ๋น๋๋๋๋ก ๋ณด์ฅํฉ๋๋ค. files
๋ฐฐ์ด์ dist/
๋๋ ํ ๋ฆฌ๋ง ๊ฒ์๋ ํจํค์ง์ ํฌํจ๋๋๋ก ์ง์ ํฉ๋๋ค.
์ฅ์ :
- ๊ด๋ฒ์ํ ์ฑํ: ๋๋ถ๋ถ์ JavaScript ํ๋ก์ ํธ์ ์ํํ๊ฒ ํตํฉ๋ฉ๋๋ค.
- ์ฌ์ด ์ค์น: ์ฌ์ฉ์๋
npm install
๋๋yarn add
๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ์ค์นํ ์ ์์ต๋๋ค. - ๋ฒ์ ๊ด๋ฆฌ: npm์ ์์กด์ฑ๊ณผ ๋ฒ์ ์ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค.
- ์ค์ ์ ์ฅ์: npm์ ๊ฐ๋ฐ์๋ค์ด ์ปดํฌ๋ํธ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ์ค์นํ ์ ์๋ ์ค์ ์ง์ค์ ๊ณต๊ฐ์ ์ ๊ณตํฉ๋๋ค.
๋จ์ :
- npm ๊ณ์ ํ์: ํจํค์ง๋ฅผ ๊ฒ์ํ๋ ค๋ฉด npm ๊ณ์ ์ด ํ์ํฉ๋๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ๊ณต๊ฐ: ์ ๋ฃ ๋น๊ณต๊ฐ npm ๋ ์ง์คํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๋ ํ ํจํค์ง๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ณต๊ฐ๋ฉ๋๋ค.
- ๋น๋ ํ๋ก์ธ์ค ์ค๋ฒํค๋: ํ๋ก์ ํธ์ ๋ฐ๋ผ ๋น๋ ํ๋ก์ธ์ค๋ฅผ ์ค์ ํด์ผ ํ ์ ์์ต๋๋ค.
2. CDN(์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ) ์ฌ์ฉํ๊ธฐ
๊ฐ์: CDN์ JavaScript ํ์ผ ๋ฐ CSS ์คํ์ผ์ํธ๋ฅผ ํฌํจํ ์ ์ ์์ฐ์ ๋น ๋ฅด๊ณ ์์ ์ ์ผ๋ก ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. CDN์ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์๋ ํ๋ก์ ํธ์ ์ข ์์ฑ์ผ๋ก ์ค์นํ ํ์ ์์ด ์น ํ์ด์ง์ ์ง์ ์น ์ปดํฌ๋ํธ๋ฅผ ๋ก๋ํ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๊ฐ๋จํ ์ปดํฌ๋ํธ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋น ๋ฅด๊ณ ์ฝ๊ฒ ์ํํด ๋ณผ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ๋ฐ ํนํ ์ ์ฉํฉ๋๋ค. ์ธ๊ธฐ ์๋ CDN ์ต์ ์ผ๋ก๋ jsDelivr, unpkg, cdnjs๊ฐ ์์ต๋๋ค. CDN์ด ์ ๊ทผํ ์ ์๋๋ก ์ฝ๋๋ฅผ ๊ณต๊ฐ์ ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ ์ ์ฅ์(์: GitHub)์ ํธ์คํ ํด์ผ ํฉ๋๋ค.
ํฌํจ๋ ๋จ๊ณ:
- ์ฝ๋ ํธ์คํ : ์น ์ปดํฌ๋ํธ ํ์ผ์ GitHub ๋๋ GitLab๊ณผ ๊ฐ์ ๊ณต๊ฐ์ ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ ์ ์ฅ์์ ์ ๋ก๋ํฉ๋๋ค.
- CDN ์ ํ: ์ ์ฅ์์์ ์ง์ ํ์ผ์ ์ ๊ณตํ ์ ์๋ CDN์ ์ ํํฉ๋๋ค. jsDelivr์ unpkg๊ฐ ์ธ๊ธฐ ์๋ ์ ํ์ ๋๋ค.
- URL ๊ตฌ์ฑ: ์ปดํฌ๋ํธ ํ์ผ์ ๋ํ CDN URL์ ๊ตฌ์ฑํฉ๋๋ค. URL์ ์ผ๋ฐ์ ์ผ๋ก
https://cdn.jsdelivr.net/gh/<username>/<repository>@<version>/<path>/my-component.js
์ ๊ฐ์ ํจํด์ ๋ฐ๋ฆ ๋๋ค.<username>
,<repository>
,<version>
๋ฐ<path>
๋ฅผ ์ ์ ํ ๊ฐ์ผ๋ก ๋ฐ๊ฟ๋๋ค. - HTML์ ํฌํจ:
<script>
ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ HTML ํ์ผ์ CDN URL์ ํฌํจํฉ๋๋ค.
์์ :
์ฌ์ฉ์ my-org
๊ฐ ์์ ํ my-web-components
์ ์ฅ์์ "my-alert"๋ผ๋ ์น ์ปดํฌ๋ํธ๋ฅผ GitHub์ ํธ์คํ
ํ๊ณ ๋ฒ์ 1.2.3
์ ์ฌ์ฉํ๋ ค ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. jsDelivr๋ฅผ ์ฌ์ฉํ๋ CDN URL์ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค:
https://cdn.jsdelivr.net/gh/my-org/my-web-components@1.2.3/dist/my-alert.js
๊ทธ๋ฐ ๋ค์ ์ด URL์ HTML ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ด ํฌํจํฉ๋๋ค:
<script src="https://cdn.jsdelivr.net/gh/my-org/my-web-components@1.2.3/dist/my-alert.js"></script>
์ฅ์ :
- ์ฌ์ฉ ์ฉ์ด์ฑ: ์์กด์ฑ์ ์ค์นํ ํ์๊ฐ ์์ต๋๋ค.
- ๋น ๋ฅธ ์ ๋ฌ: CDN์ ์ ์ ์์ฐ์ ๋ํด ์ต์ ํ๋ ์ ๋ฌ์ ์ ๊ณตํฉ๋๋ค.
- ๊ฐ๋จํ ๋ฐฐํฌ: ํ์ผ์ ์ ์ฅ์์ ์ ๋ก๋ํ๊ณ HTML์์ ๋งํฌํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
๋จ์ :
- ์ธ๋ถ ์๋น์ค์ ๋ํ ์์กด์ฑ: CDN ์ ๊ณต์ ์ฒด์ ๊ฐ์ฉ์ฑ ๋ฐ ์ฑ๋ฅ์ ์์กดํ๊ฒ ๋ฉ๋๋ค.
- ๋ฒ์ ๊ด๋ฆฌ ๋ฌธ์ : ํธํ์ฑ์ ๊นจ๋จ๋ฆฌ๋ ๋ณ๊ฒฝ์ ํผํ๊ธฐ ์ํด ๋ฒ์ ์ ์ ์คํ๊ฒ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
- ์ ์ด๋ ฅ ๋ถ์กฑ: ์ปดํฌ๋ํธ๊ฐ ๋ก๋๋๊ณ ์บ์๋๋ ๋ฐฉ์์ ๋ํ ์ ์ด๋ ฅ์ด ๋จ์ด์ง๋๋ค.
3. ์ปดํฌ๋ํธ๋ฅผ ๋จ์ผ ํ์ผ๋ก ๋ฒ๋ค๋งํ๊ธฐ
๊ฐ์: ๋ชจ๋ ์น ์ปดํฌ๋ํธ์ ๊ทธ ์์กด์ฑ์ ๋จ์ผ JavaScript ํ์ผ๋ก ๋ฒ๋ค๋งํ๋ฉด ๋ฐฐํฌ๊ฐ ๋จ์ํ๋๊ณ HTTP ์์ฒญ ์๊ฐ ์ค์ด๋ญ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ต์ํ์ ์ค์น ๊ณต๊ฐ์ ์๊ตฌํ๊ฑฐ๋ ํน์ ์ฑ๋ฅ ์ ์ฝ์ด ์๋ ํ๋ก์ ํธ์ ํนํ ์ ์ฉํฉ๋๋ค. Rollup, Webpack, Parcel๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ๋ค์ ์์ฑํ ์ ์์ต๋๋ค.
ํฌํจ๋ ๋จ๊ณ:
- ๋ฒ๋ค๋ฌ ์ ํ: ํ์์ ๋ง๋ ๋ฒ๋ค๋ฌ๋ฅผ ์ ํํฉ๋๋ค. Rollup์ ํธ๋ฆฌ ์์ดํน(tree-shaking)์ผ๋ก ๋ ์์ ๋ฒ๋ค์ ์์ฑํ ์ ์์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ข ์ข ์ ํธ๋ฉ๋๋ค. Webpack์ ๋ ๋ค์ฌ๋ค๋ฅํ๊ณ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํฉ๋๋ค.
- ๋ฒ๋ค๋ฌ ๊ตฌ์ฑ: ๋ฒ๋ค๋ฌ๋ฅผ ์ํ ๊ตฌ์ฑ ํ์ผ(์:
rollup.config.js
๋๋webpack.config.js
)์ ๋ง๋ญ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ง์ ์ (๋ณดํต ๋ฉ์ธ JavaScript ํ์ผ)๊ณผ ํ์ํ ํ๋ฌ๊ทธ์ธ ๋๋ ๋ก๋๋ฅผ ์ง์ ํฉ๋๋ค. - ์ฝ๋ ๋ฒ๋ค๋ง: ๋ฒ๋ค๋ฌ๋ฅผ ์คํํ์ฌ ๋ชจ๋ ์ปดํฌ๋ํธ์ ๊ทธ ์์กด์ฑ์ ํฌํจํ๋ ๋จ์ผ JavaScript ํ์ผ์ ์์ฑํฉ๋๋ค.
- HTML์ ํฌํจ:
<script>
ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ๋ค๋ JavaScript ํ์ผ์ HTML ํ์ผ์ ํฌํจํฉ๋๋ค.
์์ :
Rollup์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ๊ธฐ๋ณธ์ ์ธ rollup.config.js
๋ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค:
import resolve from '@rollup/plugin-node-resolve';
export default {
input: 'src/index.js',
output: {
file: 'dist/bundle.js',
format: 'esm'
},
plugins: [
resolve()
]
};
์ด ๊ตฌ์ฑ์ Rollup์๊ฒ src/index.js
ํ์ผ์์ ์์ํ์ฌ ๋ชจ๋ ์ฝ๋๋ฅผ dist/bundle.js
๋ก ๋ฒ๋ค๋งํ๊ณ , @rollup/plugin-node-resolve
ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ์ฌ node_modules
์์ ์์กด์ฑ์ ํด๊ฒฐํ๋๋ก ์ง์ํฉ๋๋ค.
์ฅ์ :
- ๋จ์ํ๋ ๋ฐฐํฌ: ํ๋์ ํ์ผ๋ง ๋ฐฐํฌํ๋ฉด ๋ฉ๋๋ค.
- HTTP ์์ฒญ ๊ฐ์: ์๋ฒ์ ๋ํ ์์ฒญ ์๋ฅผ ์ค์ฌ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
- ์ฝ๋ ์ต์ ํ: ๋ฒ๋ค๋ฌ๋ ํธ๋ฆฌ ์์ดํน, ์ถ์(minification) ๋ฐ ๊ธฐํ ๊ธฐ์ ์ ํตํด ์ฝ๋๋ฅผ ์ต์ ํํ ์ ์์ต๋๋ค.
๋จ์ :
- ์ด๊ธฐ ๋ก๋ ์๊ฐ ์ฆ๊ฐ: ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ์ ์ฒด ๋ฒ๋ค์ ๋ค์ด๋ก๋ํด์ผ ํฉ๋๋ค.
- ๋น๋ ํ๋ก์ธ์ค ์ค๋ฒํค๋: ๋ฒ๋ค๋ฌ๋ฅผ ์ค์ ํ๊ณ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค.
- ๋๋ฒ๊น ๋ณต์ก์ฑ: ๋ฒ๋ค๋ ์ฝ๋๋ฅผ ๋๋ฒ๊น ํ๋ ๊ฒ์ด ๋ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
4. ์๋ DOM ๋ฐ CSS ์ค์ฝํ ๊ณ ๋ ค์ฌํญ
๊ฐ์: ์๋ DOM(Shadow DOM)์ ์น ์ปดํฌ๋ํธ์ ํต์ฌ ๊ธฐ๋ฅ์ผ๋ก, ์บก์ํ๋ฅผ ์ ๊ณตํ๊ณ ์ปดํฌ๋ํธ์ ์ฃผ๋ณ ํ์ด์ง ๊ฐ์ ์คํ์ผ ์ถฉ๋์ ๋ฐฉ์งํฉ๋๋ค. ์น ์ปดํฌ๋ํธ๋ฅผ ํจํค์งํ๊ณ ๋ฐฐํฌํ ๋, ์๋ DOM์ด CSS ์ค์ฝํ์ ์ด๋ค ์ํฅ์ ๋ฏธ์น๋์ง, ๊ทธ๋ฆฌ๊ณ ์คํ์ผ์ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์ฃผ์ ๊ณ ๋ ค์ฌํญ:
- ์ค์ฝํ ์คํ์ผ: ์๋ DOM ๋ด์ ์ ์๋ ์คํ์ผ์ ํด๋น ์ปดํฌ๋ํธ๋ก ๋ฒ์๊ฐ ์ ํ๋๋ฉฐ ํ์ด์ง์ ๋๋จธ์ง ๋ถ๋ถ์ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค. ์ด๋ ์ปดํฌ๋ํธ์ ์คํ์ผ์ด ์ ์ญ ์คํ์ผ์ ์ํด ์ฐ์ฐํ ๋ฎ์ด์ฐ์ฌ์ง๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
- CSS ๋ณ์ (์ปค์คํ
์์ฑ): CSS ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๋ถ์์ ์ปดํฌ๋ํธ์ ๋ชจ์์ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค. ์๋ DOM ๋ด์ CSS ๋ณ์๋ฅผ ์ ์ํ๊ณ ์ฌ์ฉ์๊ฐ CSS๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ์ฌ์ ์ํ๋๋ก ํ์ฉํ์ธ์. ์ด๋ ์บก์ํ๋ฅผ ๊นจ์ง ์๊ณ ์ปดํฌ๋ํธ ์คํ์ผ์ ์ ์ฐํ๊ฒ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ ๋ค์ด:
์ปดํฌ๋ํธ ํ ํ๋ฆฟ ๋ด๋ถ:
:host { --my-component-background-color: #f0f0f0; }
์ปดํฌ๋ํธ ์ธ๋ถ:
my-component { --my-component-background-color: #007bff; }
- ํ ๋ง ์ ์ฉ: ๋ค์ํ ํ ๋ง์ ๋ํด ๋ค๋ฅธ CSS ๋ณ์ ์ธํธ๋ฅผ ์ ๊ณตํ์ฌ ํ ๋ง๋ฅผ ๊ตฌํํฉ๋๋ค. ์ฌ์ฉ์๋ ์ ์ ํ CSS ๋ณ์๋ฅผ ์ค์ ํ์ฌ ํ ๋ง ๊ฐ์ ์ ํํ ์ ์์ต๋๋ค.
- CSS-in-JS: styled-components๋ Emotion๊ณผ ๊ฐ์ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ ๋ด์ ์คํ์ผ์ ๊ด๋ฆฌํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์. ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์คํ์ผ์ ์ ์ํ๋ ๋ ํ๋ก๊ทธ๋๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ฉฐ ํ ๋ง ์ ์ฉ ๋ฐ ๋์ ์คํ์ผ๋ง์ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ์ธ๋ถ ์คํ์ผ์ํธ:
<link>
ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ DOM ๋ด์ ์ธ๋ถ ์คํ์ผ์ํธ๋ฅผ ํฌํจํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์คํ์ผ์ ์ปดํฌ๋ํธ๋ก ๋ฒ์๊ฐ ์ ํ๋๋ฉฐ ์ธ๋ถ ์คํ์ผ์ํธ์ ๋ชจ๋ ์ ์ญ ์คํ์ผ์ ์ ์ฉ๋์ง ์๋๋ค๋ ์ ์ ์ ์ํด์ผ ํฉ๋๋ค.
์์ :
๋ค์์ CSS ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์น ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉ์ ์ ์ํ๋ ์์ ๋๋ค:
<custom-element>
<shadow-root>
<style>
:host {
--background-color: #fff;
--text-color: #000;
background-color: var(--background-color);
color: var(--text-color);
}
</style>
<slot></slot>
</shadow-root>
</custom-element>
๊ทธ๋ฐ ๋ค์ ์ฌ์ฉ์๋ --background-color
๋ฐ --text-color
CSS ๋ณ์๋ฅผ ์ค์ ํ์ฌ ์ปดํฌ๋ํธ์ ๋ชจ์์ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค:
custom-element {
--background-color: #007bff;
--text-color: #fff;
}
๋ฌธ์ํ ๋ฐ ์์
์ด๋ค ํจํค์ง ์ ๋ต์ ์ ํํ๋ , ํฌ๊ด์ ์ธ ๋ฌธ์๋ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฑ๊ณต์ ์ธ ์ฑํ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ ๋ฌธ์๋ ์ฌ์ฉ์๊ฐ ์ปดํฌ๋ํธ๋ฅผ ์ค์น, ์ฌ์ฉ ๋ฐ ์ฌ์ฉ์ ์ ์ํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๋ฌธ์ํ ์ธ์๋, ์ค์ ์์ ๋ฅผ ์ ๊ณตํ๋ฉด ์ปดํฌ๋ํธ๊ฐ ์ค์ ์๋๋ฆฌ์ค์์ ์ด๋ป๊ฒ ์ฌ์ฉ๋ ์ ์๋์ง ๋ณด์ฌ์ค๋๋ค.
ํ์ ๋ฌธ์ํ ๊ตฌ์ฑ ์์:
- ์ค์น ์ง์นจ: npm, CDN ๋๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ํตํด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ช ํํ๊ณ ๋จ๊ณ๋ณ ์ง์นจ์ ์ ๊ณตํฉ๋๋ค.
- ์ฌ์ฉ ์์ : ๊ฐ๋จํ๊ณ ์ค์ฉ์ ์ธ ์์ ๋ฅผ ํตํด ์ปดํฌ๋ํธ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ์ฝ๋ ์ค๋ํซ๊ณผ ์คํฌ๋ฆฐ์ท์ ํฌํจํฉ๋๋ค.
- API ์ฐธ์กฐ: ์ปดํฌ๋ํธ์ ๋ชจ๋ ์์ฑ, ์ดํธ๋ฆฌ๋ทฐํธ, ์ด๋ฒคํธ ๋ฐ ๋ฉ์๋๋ฅผ ๋ฌธ์ํํฉ๋๋ค. ์ผ๊ด๋๊ณ ์ ๊ตฌ์กฐํ๋ ํ์์ ์ฌ์ฉํฉ๋๋ค.
- ์ฌ์ฉ์ ์ ์ ์ต์ : CSS ๋ณ์, ์ดํธ๋ฆฌ๋ทฐํธ ๋ฐ JavaScript๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ์ ๋ชจ์๊ณผ ๋์์ ์ฌ์ฉ์ ์ ์ํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ํธํ์ฑ: ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ง์ํ๋ ๋ธ๋ผ์ฐ์ ์ ๋ฒ์ ์ ๋ช ์ํฉ๋๋ค.
- ์ ๊ทผ์ฑ ๊ณ ๋ ค์ฌํญ: ARIA ๊ฐ์ด๋๋ผ์ธ๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ผ ์ปดํฌ๋ํธ๋ฅผ ์ ๊ทผ์ฑ ์๊ฒ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ง์นจ์ ์ ๊ณตํฉ๋๋ค.
- ๋ฌธ์ ํด๊ฒฐ: ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ฅผ ๋ค๋ฃจ๊ณ ํด๊ฒฐ์ฑ ์ ์ ๊ณตํ๋ ์น์ ์ ํฌํจํฉ๋๋ค.
- ๊ธฐ์ฌ ๊ฐ์ด๋๋ผ์ธ: ๊ธฐ์ฌ๋ฅผ ๋ฐ๋ ๊ฒฝ์ฐ, ๋ค๋ฅธ ์ฌ๋๋ค์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ์ฌํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ช ํํ ๊ฐ์ด๋๋ผ์ธ์ ์ ๊ณตํฉ๋๋ค.
๋ฌธ์ํ ๋๊ตฌ:
- Storybook: Storybook์ ์ํธ์์ฉ์ ์ธ ์ปดํฌ๋ํธ ๋ฌธ์๋ฅผ ๋ง๋๋ ๋ฐ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋๊ตฌ์ ๋๋ค. ์ปดํฌ๋ํธ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๋ณด์ฌ์ฃผ๊ณ ํ ์คํธ ๋ฐ ์คํ์ ์ํ ํ๋ซํผ์ ์ ๊ณตํฉ๋๋ค.
- Styleguidist: Styleguidist๋ ์ปดํฌ๋ํธ ์ฝ๋์์ ๋ฌธ์๋ฅผ ์์ฑํ๋ ๋ ๋ค๋ฅธ ๋๊ตฌ์ ๋๋ค. ์ปดํฌ๋ํธ์์ ์ ๋ณด๋ฅผ ์๋์ผ๋ก ์ถ์ถํ์ฌ ์๋ฆ๋ต๊ณ ์ํธ์์ฉ์ ์ธ ๋ฌธ์ ์น์ฌ์ดํธ๋ฅผ ์์ฑํฉ๋๋ค.
- GitHub Pages: GitHub Pages๋ฅผ ์ฌ์ฉํ๋ฉด GitHub ์ ์ฅ์์์ ์ง์ ๋ฌธ์ ์น์ฌ์ดํธ๋ฅผ ํธ์คํ ํ ์ ์์ต๋๋ค. ์ด๋ ๋ฌธ์๋ฅผ ๊ฒ์ํ๋ ๊ฐ๋จํ๊ณ ๋น์ฉ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค.
- ์ ์ฉ ๋ฌธ์ ์ฌ์ดํธ: ๋ ๋ณต์กํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒฝ์ฐ, Docusaurus๋ Gatsby์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฉ ๋ฌธ์ ์น์ฌ์ดํธ๋ฅผ ๋ง๋๋ ๊ฒ์ ๊ณ ๋ คํ ์ ์์ต๋๋ค.
์์ : ์ ๋ฌธ์ํ๋ ์ปดํฌ๋ํธ
<data-table>
์ด๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ ์์ํด ๋ณด์ธ์. ๊ทธ ๋ฌธ์๋ ๋ค์์ ํฌํจํ ์ ์์ต๋๋ค:
- ์ค์น:
npm install data-table-component
- ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ:
<data-table data="[{\"name\": \"John\", \"age\": 30}, {\"name\": \"Jane\", \"age\": 25}]"> </data-table>
- ์ดํธ๋ฆฌ๋ทฐํธ:
data
(Array): ํ ์ด๋ธ์ ํ์ํ ๊ฐ์ฒด์ ๋ฐฐ์ด.columns
(Array, optional): ์ด ์ ์์ ๋ฐฐ์ด. ์ ๊ณต๋์ง ์์ผ๋ฉด ๋ฐ์ดํฐ์์ ์ด์ด ์ถ๋ก ๋ฉ๋๋ค.
- CSS ๋ณ์:
--data-table-header-background
: ํ ์ด๋ธ ํค๋์ ๋ฐฐ๊ฒฝ์.--data-table-row-background
: ํ ์ด๋ธ ํ์ ๋ฐฐ๊ฒฝ์.
- ์ ๊ทผ์ฑ: ์ปดํฌ๋ํธ๋ ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์์ ์ ๊ทผ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ARIA ์ญํ ๋ฐ ์ดํธ๋ฆฌ๋ทฐํธ๋ก ์ค๊ณ๋์์ต๋๋ค.
๋ฒ์ ๊ด๋ฆฌ ๋ฐ ์ ๋ฐ์ดํธ
ํจ๊ณผ์ ์ธ ๋ฒ์ ๊ด๋ฆฌ๋ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ๋ฐ์ดํธ์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ด๋ฆฌํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์๋งจํฑ ๋ฒ์ ๋(SemVer)์ ๋ฒ์ ๋ฒํธ์ ๋ํ ๋๋ฆฌ ์ฑํ๋ ํ์ค์ผ๋ก, ๋ณ๊ฒฝ ์ฌํญ์ ์ํฅ์ ๋ํ ๋ช ํํ ์์ฌ์ํต์ ์ ๊ณตํฉ๋๋ค.
์๋งจํฑ ๋ฒ์ ๋ (SemVer):
SemVer๋ MAJOR.MINOR.PATCH
์ ์ธ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋ ๋ฒ์ ๋ฒํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- MAJOR: ํธํ๋์ง ์๋ API ๋ณ๊ฒฝ์ ํ ๋ MAJOR ๋ฒ์ ์ ์ฌ๋ฆฝ๋๋ค. ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ธฐ์กด ์ฝ๋๊ฐ ์์๋ ์ ์์์ ๋ํ๋ ๋๋ค.
- MINOR: ํ์ ํธํ์ฑ์ ์ ์งํ๋ฉด์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋ MINOR ๋ฒ์ ์ ์ฌ๋ฆฝ๋๋ค. ์ด๋ ๊ธฐ์กด ์ฝ๋๊ฐ ์์ ์์ด ๊ณ์ ์๋ํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค.
- PATCH: ํ์ ํธํ์ฑ์ ์ ์งํ๋ ๋ฒ๊ทธ ์์ ์ ํ ๋ PATCH ๋ฒ์ ์ ์ฌ๋ฆฝ๋๋ค. ์ด๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ ํ ๋ฒ๊ทธ ์์ ์ด๋ฉฐ ์๋ก์ด ๊ธฐ๋ฅ์ ๋์ ํ๊ฑฐ๋ ๊ธฐ์กด ๊ธฐ๋ฅ์ ์์์ํค์ง ์์์ผ ํจ์ ๋ํ๋ ๋๋ค.
๋ฒ์ ๊ด๋ฆฌ ๋ชจ๋ฒ ์ฌ๋ก:
- Git ์ฌ์ฉ: ์ฝ๋์ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ํด Git์ ์ฌ์ฉํ์ธ์. Git์ ์ฌ์ฉํ๋ฉด ๋ณ๊ฒฝ ์ฌํญ์ ์ถ์ ํ๊ณ , ๋ค๋ฅธ ์ฌ๋๊ณผ ํ์ ํ๊ณ , ์ด์ ๋ฒ์ ์ผ๋ก ์ฝ๊ฒ ๋๋๋ฆด ์ ์์ต๋๋ค.
- ๋ฆด๋ฆฌ์ค์ ํ๊ทธ ์ง์ : ๊ฐ ๋ฆด๋ฆฌ์ค์ ๋ฒ์ ๋ฒํธ๋ก ํ๊ทธ๋ฅผ ์ง์ ํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํน์ ๋ฒ์ ์ ์ฝ๊ฒ ์๋ณํ๊ณ ๊ฒ์ํ ์ ์์ต๋๋ค.
- ๋ฆด๋ฆฌ์ค ๋ ธํธ ์์ฑ: ๊ฐ ๋ฆด๋ฆฌ์ค์ ํฌํจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ค๋ช ํ๋ ์์ธํ ๋ฆด๋ฆฌ์ค ๋ ธํธ๋ฅผ ์์ฑํ์ธ์. ์ด๋ ์ฌ์ฉ์๊ฐ ๋ณ๊ฒฝ์ ์ํฅ์ ์ดํดํ๊ณ ์ ๊ทธ๋ ์ด๋ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ๋ฆด๋ฆฌ์ค ํ๋ก์ธ์ค ์๋ํ: semantic-release๋ conventional-changelog์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฆด๋ฆฌ์ค ํ๋ก์ธ์ค๋ฅผ ์๋ํํ์ธ์. ์ด๋ฌํ ๋๊ตฌ๋ ์ปค๋ฐ ๋ฉ์์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฆด๋ฆฌ์ค ๋ ธํธ๋ฅผ ์๋์ผ๋ก ์์ฑํ๊ณ ๋ฒ์ ๋ฒํธ๋ฅผ ์ฌ๋ฆด ์ ์์ต๋๋ค.
- ๋ณ๊ฒฝ ์ฌํญ ์ ๋ฌ: ๋ฆด๋ฆฌ์ค ๋ ธํธ, ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ, ์์ ๋ฏธ๋์ด ๋ฐ ๊ธฐํ ์ฑ๋์ ํตํด ์ฌ์ฉ์์๊ฒ ๋ณ๊ฒฝ ์ฌํญ์ ์ ๋ฌํ์ธ์.
ํธํ์ฑ์ด ๊นจ์ง๋ ๋ณ๊ฒฝ ์ฒ๋ฆฌํ๊ธฐ:
API์ ํธํ์ฑ์ด ๊นจ์ง๋ ๋ณ๊ฒฝ์ ํด์ผ ํ ๋, ์ฌ์ฉ์์๊ฒ ๋ฏธ์น๋ ์ํฅ์ ์ต์ํํ๊ธฐ ์ํด ์ ์คํ๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ์ฌ์ฉ ์ค๋จ ๊ฒฝ๊ณ : ํฅํ ๋ฆด๋ฆฌ์ค์์ ์ ๊ฑฐ๋ ๊ธฐ๋ฅ์ ๋ํด ์ฌ์ฉ ์ค๋จ ๊ฒฝ๊ณ ๋ฅผ ์ ๊ณตํ์ธ์. ์ด๋ ์ฌ์ฉ์๊ฐ ์ API๋ก ์ฝ๋๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํ ์๊ฐ์ ์ค๋๋ค.
- ๋ง์ด๊ทธ๋ ์ด์ ๊ฐ์ด๋: ์ ๋ฒ์ ์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ๊ณ ํธํ์ฑ์ด ๊นจ์ง๋ ๋ณ๊ฒฝ์ ์ ์ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ์ง์นจ์ ์ ๊ณตํ๋ ๋ง์ด๊ทธ๋ ์ด์ ๊ฐ์ด๋๋ฅผ ๋ง๋์ธ์.
- ํ์ ํธํ์ฑ: ๊ฐ๋ฅํ ํ ํ์ ํธํ์ฑ์ ์ ์งํ๋ ค๊ณ ๋ ธ๋ ฅํ์ธ์. ํธํ์ฑ์ด ๊นจ์ง๋ ๋ณ๊ฒฝ์ ํผํ ์ ์๋ค๋ฉด, ๋์ผํ ๊ธฐ๋ฅ์ ๋ฌ์ฑํ ์ ์๋ ๋์ฒด ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ธ์.
- ๋ช ํํ ์์ฌ์ํต: ์ฌ์ฉ์์๊ฒ ํธํ์ฑ์ด ๊นจ์ง๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ช ํํ๊ฒ ์ ๋ฌํ๊ณ ์ฝ๋๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๋ฐ ๋์์ด ๋๋ ์ง์์ ์ ๊ณตํ์ธ์.
๊ฒฐ๋ก
์น ์ปดํฌ๋ํธ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ฐฐํฌํ๊ณ ํจํค์งํ๋ ๊ฒ์ ์ฑํ์ ์ด์งํ๊ณ ๊ธ์ ์ ์ธ ๊ฐ๋ฐ์ ๊ฒฝํ์ ๋ณด์ฅํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ํ๊ฒ ๊ณ ๊ฐ, ๊ฐ๋ฐ ํ๊ฒฝ ๋ฐ ๋ฐฐํฌ ์๋๋ฆฌ์ค๋ฅผ ์ ์คํ๊ฒ ๊ณ ๋ คํจ์ผ๋ก์จ ํ์์ ๊ฐ์ฅ ์ ํฉํ ํจํค์ง ์ ๋ต์ ์ ํํ ์ ์์ต๋๋ค. npm์ ๊ฒ์ํ๋ , CDN์ ์ฌ์ฉํ๋ , ์ปดํฌ๋ํธ๋ฅผ ๋จ์ผ ํ์ผ๋ก ๋ฒ๋ค๋งํ๋ , ๋๋ ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ ์กฐํฉ์ ์ ํํ๋ , ๋ช ํํ ๋ฌธ์ํ, ๋ฒ์ ๊ด๋ฆฌ, ๊ทธ๋ฆฌ๊ณ ํธํ์ฑ์ด ๊นจ์ง๋ ๋ณ๊ฒฝ์ ๋ํ ์ฌ๋ ค ๊น์ ์ฒ๋ฆฌ๊ฐ ๋ค์ํ ๊ตญ์ ํ๋ก์ ํธ์ ํ์์ ์ฌ์ฉ๋ ์ ์๋ ์ฑ๊ณต์ ์ธ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋๋ ๋ฐ ํ์์ ์ด๋ผ๋ ์ ์ ๊ธฐ์ตํ์ธ์.
์ฑ๊ณต์ ์ด์ ๋ ๊ฐ ํจํค์ง ์ ๋ต์ ๋ฏธ๋ฌํ ์ฐจ์ด๋ฅผ ์ดํดํ๊ณ ํ๋ก์ ํธ์ ํน์ ์๊ตฌ์ฌํญ์ ๋ง๊ฒ ์กฐ์ ํ๋ ๋ฐ ์์ต๋๋ค. ์ด ๊ฐ์ด๋์์ ์ค๋ช ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด, ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ , ์ ์ง๋ณด์ํ๊ธฐ ์ฝ๊ณ , ํ์ฅํ๊ธฐ ์ฌ์ด ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค ์ ์์ผ๋ฉฐ, ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ด ํ์ ์ ์ด๊ณ ๋งค๋ ฅ์ ์ธ ์น ๊ฒฝํ์ ๊ตฌ์ถํ ์ ์๋๋ก ์ง์ํ ์ ์์ต๋๋ค.