ํจํค์ง, ๊ฒ์, ์๋งจํฑ ๋ฒ์ ๊ด๋ฆฌ ๋ฐ ๊ธ๋ก๋ฒ ๊ฐ๋ฐํ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃจ๋ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐฐํฌ ๋ฐ ๋ฒ์ ๊ด๋ฆฌ์ ๋ํ ์ข ํฉ ๊ฐ์ด๋์ ๋๋ค.
์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ๋ฐ: ๋ฐฐํฌ ๋ฐ ๋ฒ์ ๊ด๋ฆฌ ์ ๋ต
์น ์ปดํฌ๋ํธ๋ ๋ค์ํ ํ๋ ์์ํฌ์ ํ๋ก์ ํธ์์ ์ฌ์ฉํ ์ ์๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ์์๋ฅผ ๋ง๋๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ํ์ง๋ง ํ๋ฅญํ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ์ ํฌ์ ์ ๋ฐ์ ๋ถ๊ณผํฉ๋๋ค. ์ ์ ํ ๋ฐฐํฌ ๋ฐ ๋ฒ์ ๊ด๋ฆฌ ์ ๋ต์ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ด ์ฌ๋ฌ๋ถ์ ์ปดํฌ๋ํธ์ ์ฝ๊ฒ ์ ๊ทผํ๊ณ , ์ ์ง๋ณด์ํ๋ฉฐ, ์ ๋ขฐํ ์ ์๋๋ก ๋ณด์ฅํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์ฌ๋ฐ๋ฅธ ๋ฐฐํฌ ๋ฐ ๋ฒ์ ๊ด๋ฆฌ๊ฐ ์ค์ํ ์ด์
ํ์์ ์ธ ์น ์ปดํฌ๋ํธ ์ธํธ๋ฅผ ๋ง๋ค์์ง๋ง, ํตํฉํ๊ฑฐ๋ ์ ๊ทธ๋ ์ด๋ํ๊ธฐ ์ด๋ ค์ด ๋ฐฉ์์ผ๋ก ๋ฐฐํฌํ๋ค๊ณ ์์ํด ๋ณด์ญ์์ค. ๊ฐ๋ฐ์๋ค์ ๋ฒ๊ฑฐ๋ก์์ ๊ฐ์ํ๊ธฐ๋ณด๋ค๋ ๋น์ทํ ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ๊ตฌํํ๋ ์ชฝ์ ์ ํํ ์๋ ์์ต๋๋ค. ๋๋, ์ ์ ํ ๋ฒ์ ๊ด๋ฆฌ ์์ด ํธํ์ฑ์ด ๊นจ์ง๋ ๋ณ๊ฒฝ(breaking change)์ ๋์ ํ์ฌ ์ฌ๋ฌ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์กดํ๋ ๊ธฐ์กด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ด๋ฒ์ํ ์ค๋ฅ๋ฅผ ์ผ์ผํค๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ณด์ญ์์ค.
ํจ๊ณผ์ ์ธ ๋ฐฐํฌ ๋ฐ ๋ฒ์ ๊ด๋ฆฌ ์ ๋ต์ ๋ค์์ ์ํด ํ์์ ์ ๋๋ค:
- ์ฌ์ฉ ์ฉ์ด์ฑ: ๊ฐ๋ฐ์๊ฐ ํ๋ก์ ํธ์์ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ๋จํ ์ค์น, ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
- ์ ์ง๋ณด์์ฑ: ๊ธฐ์กด ๊ตฌํ์ ์์์ํค์ง ์์ผ๋ฉด์ ์ปดํฌ๋ํธ๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ๊ฐ์ ํ ์ ์๋๋ก ํฉ๋๋ค.
- ํ์ : ํนํ ๋ถ์ฐ๋ ํ ํ๊ฒฝ์์ ๊ฐ๋ฐ์ ๊ฐ์ ํ์ํฌ์ ์ฝ๋ ๊ณต์ ๋ฅผ ์ด์งํฉ๋๋ค.
- ์ฅ๊ธฐ์ ์์ ์ฑ: ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฅ์์ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
๋ฐฐํฌ๋ฅผ ์ํ ์น ์ปดํฌ๋ํธ ํจํค์ง
์น ์ปดํฌ๋ํธ๋ฅผ ๋ฐฐํฌํ๋ ์ฒซ ๋จ๊ณ๋ ์ฝ๊ฒ ์๋นํ ์ ์๋ ๋ฐฉ์์ผ๋ก ํจํค์งํ๋ ๊ฒ์ ๋๋ค. ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์๋ npm์ด๋ yarn๊ณผ ๊ฐ์ ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค.
๋ฐฐํฌ๋ฅผ ์ํด npm ์ฌ์ฉํ๊ธฐ
npm(Node Package Manager)์ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ์์ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ํจํค์ง ๊ด๋ฆฌ์์ด๋ฉฐ, ์น ์ปดํฌ๋ํธ๋ฅผ ๋ฐฐํฌํ๊ธฐ์ ํ๋ฅญํ ์ ํ์ ๋๋ค. ๋ค์์ ๊ทธ ๊ณผ์ ์ ๋ํ ์ค๋ช ์ ๋๋ค:
- `package.json` ํ์ผ ์์ฑ: ์ด ํ์ผ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด๋ฆ, ๋ฒ์ , ์ค๋ช , ์ง์ ์ , ์์กด์ฑ ๋ฑ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ๋ฉํ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ฉ๋๋ค. `npm init` ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ ์ ์์ต๋๋ค.
- ํ๋ก์ ํธ ๊ตฌ์กฐํ: ์ปดํฌ๋ํธ ํ์ผ๋ค์ ๋ ผ๋ฆฌ์ ์ธ ๋๋ ํฐ๋ฆฌ ๊ตฌ์กฐ๋ก ๊ตฌ์ฑํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ํจํด์ ์์ค ์ฝ๋๋ฅผ ์ํ `src` ๋๋ ํฐ๋ฆฌ์ ์ปดํ์ผ ๋ฐ ์์ถ๋ ๋ฒ์ ์ ์ํ `dist` ๋๋ ํฐ๋ฆฌ๋ฅผ ๋๋ ๊ฒ์ ๋๋ค.
- ์ฝ๋ ๋ฒ๋ค๋ง ๋ฐ ํธ๋์คํ์ผ๋ง: Webpack, Rollup ๋๋ Parcel๊ณผ ๊ฐ์ ๋ฒ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ ํ์ผ๋ค์ ๋จ์ผ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ(๋๋ ํ์ํ ๊ฒฝ์ฐ ์ฌ๋ฌ ํ์ผ)๋ก ๋ฌถ์ต๋๋ค. Babel์ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ํธ๋์คํ์ผํ์ฌ ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์ ํธํ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
- ์ง์ ์ ๋ช ์: `package.json` ํ์ผ์์ `main` ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฃผ ์ง์ ์ ์ ๋ช ์ํฉ๋๋ค. ์ด๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ๋ฒ๋ค๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ๊ฒฝ๋ก์ ๋๋ค.
- ๋ชจ๋ ๋ฐ ๋ธ๋ผ์ฐ์ ์ง์ ์ ๊ณ ๋ ค: ์ต์ ์ ์ฑ๋ฅ์ ์ํด ์ต์ ๋ชจ๋ ๋ฒ๋ค๋ฌ(`module`)์ ๋ธ๋ผ์ฐ์ (`browser`)๋ฅผ ์ํ ๋ณ๋์ ์ง์ ์ ์ ์ ๊ณตํฉ๋๋ค.
- ๊ด๋ จ ํ์ผ ํฌํจ: `package.json`์ `files` ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์๋ ํจํค์ง์ ํฌํจ๋์ด์ผ ํ ํ์ผ๊ณผ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ช ์ํฉ๋๋ค.
- ๋ฌธ์ ์์ฑ: ์ฌ์ฉ ์์ ์ API ์ฐธ์กฐ๋ฅผ ํฌํจํ์ฌ ์ปดํฌ๋ํธ์ ๋ํ ๋ช ํํ๊ณ ํฌ๊ด์ ์ธ ๋ฌธ์๋ฅผ ์์ฑํฉ๋๋ค. ํ๋ก์ ํธ์ `README.md` ํ์ผ์ ํฌํจ์ํค์ธ์.
- npm์ ๊ฒ์: npm ๊ณ์ ์ ๋ง๋ค๊ณ `npm publish` ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ npm ๋ ์ง์คํธ๋ฆฌ์ ํจํค์ง๋ฅผ ๊ฒ์ํฉ๋๋ค.
`package.json` ํ์ผ ์์:
{
"name": "my-web-component-library",
"version": "1.0.0",
"description": "์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์น ์ปดํฌ๋ํธ ๋ชจ์",
"main": "dist/my-web-component-library.js",
"module": "dist/my-web-component-library.esm.js",
"browser": "dist/my-web-component-library.umd.js",
"files": [
"dist/",
"src/",
"README.md"
],
"scripts": {
"build": "webpack",
"test": "jest"
},
"keywords": [
"web components",
"component library",
"ui"
],
"author": "์ฌ์ฉ์ ์ด๋ฆ",
"license": "MIT",
"devDependencies": {
"@babel/core": "^7.0.0",
"@babel/preset-env": "^7.0.0",
"webpack": "^5.0.0",
"webpack-cli": "^4.0.0"
}
}
๋์ฒด ํจํค์ง ์ต์
npm์ด ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ์ ํ์ด์ง๋ง, ๋ค๋ฅธ ํจํค์ง ์ต์ ๋ ์กด์ฌํฉ๋๋ค:
- Yarn: npm๋ณด๋ค ๋น ๋ฅด๊ณ ์ ๋ขฐ์ฑ ์๋ ๋์์ ๋๋ค.
- GitHub Packages: ํจํค์ง๋ฅผ GitHub์ ์ง์ ํธ์คํ ํ ์ ์์ต๋๋ค. ์ด๋ ๋น๊ณต๊ฐ ํจํค์ง๋ GitHub ์ ์ฅ์์ ๊ธด๋ฐํ๊ฒ ํตํฉ๋ ํจํค์ง์ ์ ์ฉํฉ๋๋ค.
๋ฒ์ ๊ด๋ฆฌ ์ ๋ต: ์๋งจํฑ ๋ฒ์ ๊ด๋ฆฌ(SemVer)
๋ฒ์ ๊ด๋ฆฌ๋ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ด๋ฆฌํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์๋งจํฑ ๋ฒ์ ๊ด๋ฆฌ(SemVer)๋ ์ํํธ์จ์ด ๋ฒ์ ๊ด๋ฆฌ์ ์ฐ์ ํ์ค์ด๋ฉฐ, ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ๋ ฅํ ๊ถ์ฅ๋ฉ๋๋ค.
SemVer ์ดํดํ๊ธฐ
SemVer๋ `์ฃผ(MAJOR).๋ถ(MINOR).์(PATCH)`์ ์ธ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋ ๋ฒ์ ๋ฒํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์ฃผ(MAJOR): ํธํ๋์ง ์๋ API ๋ณ๊ฒฝ(breaking change)์ด ์์ ๋ ์ด ๋ฒ์ ์ ์ฌ๋ฆฝ๋๋ค.
- ๋ถ(MINOR): ํ์ ํธํ์ฑ์ ์ ์งํ๋ฉด์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋ ์ด ๋ฒ์ ์ ์ฌ๋ฆฝ๋๋ค.
- ์(PATCH): ํ์ ํธํ์ฑ์ ์ ์งํ๋ ๋ฒ๊ทธ ์์ ์ ํ ๋ ์ด ๋ฒ์ ์ ์ฌ๋ฆฝ๋๋ค.
์๋ฅผ ๋ค์ด:
1.0.0
: ์ต์ด ๋ฆด๋ฆฌ์ค.1.1.0
: ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ.1.0.1
: ๋ฒ๊ทธ ์์ .2.0.0
: API์ ํธํ์ฑ์ด ๊นจ์ง๋ ๋ณ๊ฒฝ ๋์ .
์ฌ์ ๋ฆด๋ฆฌ์ค ๋ฒ์
SemVer๋ 1.0.0-alpha.1
, 1.0.0-beta.2
, ๋๋ 1.0.0-rc.1
๊ณผ ๊ฐ์ ์ฌ์ ๋ฆด๋ฆฌ์ค ๋ฒ์ ๋ ํ์ฉํฉ๋๋ค. ์ด๋ฌํ ๋ฒ์ ์ ์์ ์ ์ธ ๋ฆด๋ฆฌ์ค ์ ์ ํ
์คํธ ๋ฐ ์คํ์ฉ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
์น ์ปดํฌ๋ํธ์์ SemVer๊ฐ ์ค์ํ ์ด์
SemVer๋ฅผ ์ค์ํจ์ผ๋ก์จ, ๊ฐ ๋ฆด๋ฆฌ์ค์ ๋ณ๊ฒฝ ์ฌํญ ์ฑ๊ฒฉ์ ๋ํ ๋ช ํํ ์ ํธ๋ฅผ ๊ฐ๋ฐ์์๊ฒ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ค์ ์ธ์ ์ด๋ป๊ฒ ์์กด์ฑ์ ์ ๊ทธ๋ ์ด๋ํ ์ง์ ๋ํด ์ ๋ณด์ ์ ๊ฐํ ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, PATCH ๋ฆด๋ฆฌ์ค๋ ์ฝ๋ ๋ณ๊ฒฝ ์์ด ์์ ํ๊ฒ ์ ๊ทธ๋ ์ด๋ํ ์ ์์ด์ผ ํ์ง๋ง, MAJOR ๋ฆด๋ฆฌ์ค๋ ์ ์คํ ๊ณ ๋ ค์ ์ ์ฌ์ ์ผ๋ก ์๋นํ ์์ ์ด ํ์ํฉ๋๋ค.
์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฒ์ ๋ฐ ์ ๋ฐ์ดํธ
์น ์ปดํฌ๋ํธ๋ฅผ ํจํค์งํ๊ณ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ๋ง์ณค๋ค๋ฉด, npm๊ณผ ๊ฐ์ ๋ ์ง์คํธ๋ฆฌ์ ๊ฒ์ํ๊ณ ๋ณ๊ฒฝ ์ฌํญ์ด ์๊ธธ ๋๋ง๋ค ์ ๋ฐ์ดํธํด์ผ ํฉ๋๋ค.
npm์ ๊ฒ์ํ๊ธฐ
npm์ ํจํค์ง๋ฅผ ๊ฒ์ํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์:
- npm ๊ณ์ ์์ฑ: ์์ง ๊ณ์ ์ด ์๋ค๋ฉด, npm ์น์ฌ์ดํธ์์ ๊ณ์ ์ ๋ง๋ญ๋๋ค.
- npm์ ๋ก๊ทธ์ธ: ํฐ๋ฏธ๋์์ `npm login`์ ์คํํ๊ณ ์๊ฒฉ ์ฆ๋ช ์ ์ ๋ ฅํฉ๋๋ค.
- ํจํค์ง ๊ฒ์: ํ๋ก์ ํธ์ ๋ฃจํธ ๋๋ ํฐ๋ฆฌ๋ก ์ด๋ํ์ฌ `npm publish`๋ฅผ ์คํํฉ๋๋ค.
ํจํค์ง ์ ๋ฐ์ดํธํ๊ธฐ
์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ ๋๋ง๋ค `package.json` ํ์ผ์ ๋ฒ์ ๋ฒํธ๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ํจํค์ง๋ฅผ ๋ค์ ๊ฒ์ํด์ผ ํฉ๋๋ค. ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ์ ์ ์ ๋ฐ์ดํธํ์ธ์:
npm version patch
: ์(patch) ๋ฒ์ ์ ์ฌ๋ฆฝ๋๋ค (์: 1.0.0 -> 1.0.1).npm version minor
: ๋ถ(minor) ๋ฒ์ ์ ์ฌ๋ฆฝ๋๋ค (์: 1.0.0 -> 1.1.0).npm version major
: ์ฃผ(major) ๋ฒ์ ์ ์ฌ๋ฆฝ๋๋ค (์: 1.0.0 -> 2.0.0).
๋ฒ์ ์ ์ ๋ฐ์ดํธํ ํ `npm publish`๋ฅผ ์คํํ์ฌ ์ ๋ฒ์ ์ npm์ ๊ฒ์ํฉ๋๋ค.
์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐฐํฌ ๋ฐ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฐฐํฌํ๊ณ ๋ฒ์ ๊ด๋ฆฌํ ๋ ์ผ๋์ ๋์ด์ผ ํ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ช ํํ๊ณ ํฌ๊ด์ ์ธ ๋ฌธ์ ์์ฑ: ๋ฌธ์๋ ๊ฐ๋ฐ์๊ฐ ์ปดํฌ๋ํธ ์ฌ์ฉ๋ฒ์ ์ดํดํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์ฌ์ฉ ์์ , API ์ฐธ์กฐ ๋ฐ ์ค์ํ ๊ฐ๋ ์ ๋ํ ์ค๋ช ์ ํฌํจํ์ธ์. Storybook๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ์๊ฐ์ ์ผ๋ก ๋ฌธ์ํํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์.
- ์์ ๋ฐ ๋ฐ๋ชจ ์ ๊ณต: ์ปดํฌ๋ํธ๊ฐ ์ฌ์ฉ๋ ์ ์๋ ๋ค์ํ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ๋ ์์ ์ ๋ฐ๋ชจ๋ฅผ ํฌํจํ์ธ์. ์ด๋ ๊ฐ๋ฐ์๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋น ๋ฅด๊ฒ ์์ํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ์ ์ฉ ์น์ฌ์ดํธ๋ฅผ ๋ง๋ค๊ฑฐ๋ CodePen ๋๋ StackBlitz์ ๊ฐ์ ํ๋ซํผ์ ์ฌ์ฉํ์ฌ ์์ ๋ฅผ ํธ์คํ ํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์.
- ์๋งจํฑ ๋ฒ์ ๊ด๋ฆฌ ์ฌ์ฉ: SemVer๋ฅผ ์ค์ํ๋ ๊ฒ์ ์ฌ์ฉ์์๊ฒ ๋ณ๊ฒฝ ์ฌํญ์ ์ฑ๊ฒฉ์ ์ ๋ฌํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
- ๋จ์ ํ ์คํธ ์์ฑ: ์ปดํฌ๋ํธ๊ฐ ์์๋๋ก ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ์ธ์. ์ด๋ ๋ฒ๊ทธ๋ฅผ ์กฐ๊ธฐ์ ๋ฐ๊ฒฌํ๊ณ ํธํ์ฑ์ด ๊นจ์ง๋ ๋ณ๊ฒฝ์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ์ง์์ ํตํฉ(CI) ์์คํ ์ฌ์ฉ: GitHub Actions, Travis CI ๋๋ CircleCI์ ๊ฐ์ CI ์์คํ ์ ์ฌ์ฉํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ด ์๊ธธ ๋๋ง๋ค ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์๋์ผ๋ก ๋น๋, ํ ์คํธ ๋ฐ ๊ฒ์ํ์ธ์.
- Shadow DOM ๋ฐ ์คํ์ผ๋ง ๊ณ ๋ ค: ์น ์ปดํฌ๋ํธ๋ ์คํ์ผ์ ์บก์ํํ๊ธฐ ์ํด Shadow DOM์ ํ์ฉํฉ๋๋ค. ์ปดํฌ๋ํธ์ ์คํ์ผ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ฉ๋๊ณ ์คํ์ผ์ด ์ปดํฌ๋ํธ ์ํ์ผ๋ก ์ ์ถ๋์ง ์๋๋ก ํ์ธ์. ์ปค์คํฐ๋ง์ด์ง์ ์ํด CSS Custom Properties(๋ณ์)๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์.
- ์ ๊ทผ์ฑ(A11y): ์น ์ปดํฌ๋ํธ๊ฐ ์ฅ์ ๋ฅผ ๊ฐ์ง ์ฌ์ฉ์์๊ฒ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ๋ง๋์ธ์. ์๋งจํฑ HTML์ ์ฌ์ฉํ๊ณ , ARIA ์์ฑ์ ์ ๊ณตํ๋ฉฐ, ๋ณด์กฐ ๊ธฐ์ ๋ก ์ปดํฌ๋ํธ๋ฅผ ํ ์คํธํ์ธ์. WCAG ๊ฐ์ด๋๋ผ์ธ์ ์ค์ํ๋ ๊ฒ์ ํฌ์ฉ์ฑ์ ์ํด ๋งค์ฐ ์ค์ํฉ๋๋ค.
- ๊ตญ์ ํ(i18n) ๋ฐ ํ์งํ(l10n): ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ฌ ์ธ์ด๋ฅผ ์ง์ํด์ผ ํ๋ ๊ฒฝ์ฐ, i18n ๋ฐ l10n์ ๊ตฌํํ์ธ์. ์ด๋ ๋ฒ์ญ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์ธ์ด๋ณ ๋ฆฌ์์ค๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ๋ค์ํ ๋ ์ง ํ์, ์ซ์ ํ์ ๋ฐ ๋ฌธํ์ ๊ด๋ก์ ์ ์ํ์ธ์.
- ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ ํธํ์ฑ: ์ปดํฌ๋ํธ๊ฐ ์ผ๊ด๋๊ฒ ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ๋ค์ํ ๋ธ๋ผ์ฐ์ (Chrome, Firefox, Safari, Edge)์์ ํ ์คํธํ์ธ์. ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ ํ ์คํธ๋ฅผ ์ํด BrowserStack ๋๋ Sauce Labs์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ธ์.
- ํ๋ ์์ํฌ์ ๊ตฌ์ ๋ฐ์ง ์๋ ์ค๊ณ: ์น ์ปดํฌ๋ํธ๋ ํ๋ ์์ํฌ์ ๊ตฌ์ ๋ฐ์ง ์๋๋ก ์ค๊ณ๋์์ง๋ง, ํน์ ํ๋ ์์ํฌ(React, Angular, Vue.js)์์ ์ ์ฌ์ ์ธ ์ถฉ๋์ด๋ ์ํธ ์ด์ฉ์ฑ ๋ฌธ์ ์ ์ ์ํ์ธ์. ์ด๋ฌํ ์ฐ๋ ค๋ฅผ ํด๊ฒฐํ๋ ์์ ์ ๋ฌธ์๋ฅผ ์ ๊ณตํ์ธ์.
- ์ง์ ์ ๊ณต ๋ฐ ํผ๋๋ฐฑ ์์ง: ๊ฐ๋ฐ์๊ฐ ์ง๋ฌธํ๊ณ , ๋ฒ๊ทธ๋ฅผ ๋ณด๊ณ ํ๊ณ , ํผ๋๋ฐฑ์ ์ ๊ณตํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ธ์. ์ด๋ ํฌ๋ผ, Slack ์ฑ๋ ๋๋ GitHub ์ด์ ํธ๋์ปค๋ฅผ ํตํด ์ด๋ฃจ์ด์ง ์ ์์ต๋๋ค. ์ฌ์ฉ์์ ์๊ฒฌ์ ์ ๊ทน์ ์ผ๋ก ๋ฃ๊ณ ๊ทธ๋ค์ ํผ๋๋ฐฑ์ ํฅํ ๋ฆด๋ฆฌ์ค์ ๋ฐ์ํ์ธ์.
- ์๋ํ๋ ๋ฆด๋ฆฌ์ค ๋ ธํธ: ์ปค๋ฐ ๊ธฐ๋ก์ ๊ธฐ๋ฐ์ผ๋ก ๋ฆด๋ฆฌ์ค ๋ ธํธ ์์ฑ์ ์๋ํํ์ธ์. ์ด๋ ์ฌ์ฉ์์๊ฒ ๊ฐ ๋ฆด๋ฆฌ์ค์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํ ๋ช ํํ ์์ฝ์ ์ ๊ณตํฉ๋๋ค. `conventional-changelog`์ ๊ฐ์ ๋๊ตฌ๊ฐ ์ด๋ฅผ ๋์ธ ์ ์์ต๋๋ค.
์ค์ ์ฌ๋ก ๋ฐ ์ผ์ด์ค ์คํฐ๋
์ฌ๋ฌ ์กฐ์ง๊ณผ ๊ฐ์ธ์ด ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๋ง๋ค๊ณ ๋ฐฐํฌํ์ต๋๋ค. ๋ช ๊ฐ์ง ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Google์ Material Web Components: Google์ Material Design์ ๊ธฐ๋ฐ์ผ๋ก ํ ์น ์ปดํฌ๋ํธ ์ธํธ์ ๋๋ค.
- Adobe์ Spectrum Web Components: Adobe์ Spectrum ๋์์ธ ์์คํ ์ ๊ตฌํํ๋ ์น ์ปดํฌ๋ํธ ๋ชจ์์ ๋๋ค.
- Vaadin Components: ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ถ์ ์ํ ํฌ๊ด์ ์ธ ์น ์ปดํฌ๋ํธ ์ธํธ์ ๋๋ค.
์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ๊ตฌํ๋ฉด ๋ฐฐํฌ, ๋ฒ์ ๊ด๋ฆฌ ๋ฐ ๋ฌธ์ํ์ ๋ํ ๋ชจ๋ฒ ์ฌ๋ก์ ๋ํ ๊ท์คํ ํต์ฐฐ๋ ฅ์ ์ป์ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ฐฐํฌํ๊ณ ๋ฒ์ ๊ด๋ฆฌํ๋ ๊ฒ์ ๊ณ ํ์ง ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ๋งํผ์ด๋ ์ค์ํฉ๋๋ค. ์ด ๊ฐ์ด๋์์ ์ค๋ช ํ ์ ๋ต๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด, ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ด ์ฌ๋ฌ๋ถ์ ์ปดํฌ๋ํธ์ ์ฝ๊ฒ ์ ๊ทผํ๊ณ , ์ ์ง๋ณด์ํ๋ฉฐ, ์ ๋ขฐํ ์ ์๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค. ์๋งจํฑ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ฑํํ๊ณ , ํฌ๊ด์ ์ธ ๋ฌธ์๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ฌ์ฉ์ ์ปค๋ฎค๋ํฐ์ ์ ๊ทน์ ์ผ๋ก ์ํตํ๋ ๊ฒ์ด ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฅ๊ธฐ์ ์ธ ์ฑ๊ณต์ ์ด์ ์ ๋๋ค.
ํ๋ฅญํ ์น ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ์ง์์ ์ธ ๊ณผ์ ์์ ๊ธฐ์ตํ์ธ์. ์ฌ์ฉ์ ํผ๋๋ฐฑ๊ณผ ์งํํ๋ ์น ํ์ค์ ๊ธฐ๋ฐ์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ๊ณ์ํด์ ๋ฐ๋ณตํ๊ณ ๊ฐ์ ํด ๋๊ฐ์ญ์์ค.