๊ธ๋ก๋ฒ ํ์ ์ํ ํ๋ก ํธ์๋ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฒ์ ๊ด๋ฆฌ ๋ฐ ๋ฐฐํฌ ์ ๋ต์ ๋ํ ์ข ํฉ ๊ฐ์ด๋. ์ผ๊ด์ฑ๊ณผ ํจ์จ์ฑ์ ๋ณด์ฅํ์ธ์.
ํ๋ก ํธ์๋ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: ๊ธ๋ก๋ฒ ํ์ ์ํ ๋ฒ์ ๊ด๋ฆฌ ๋ฐ ๋ฐฐํฌ ์ ๋ต
์ค๋๋ ๊ธ๋ณํ๋ ๋์งํธ ํ๊ฒฝ์์ ์ผ๊ด์ฑ ์๊ณ ํ์ฅ ๊ฐ๋ฅํ ์ฌ์ฉ์ ์ธํฐํ์ด์ค(UI)๋ฅผ ๊ตฌ์ถํ๊ณ ์ ์งํ๋ ๊ฒ์ ๋ชจ๋ ๊ท๋ชจ์ ์กฐ์ง์ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ์ ๊ตฌ์กฐํ๋ ํ๋ก ํธ์๋ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ๋ก, ์ฝ๋ ์ฌ์ฌ์ฉ์ ์ด์งํ๊ณ ๊ฐ๋ฐ ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ํํ๋ฉฐ ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํต์ผ๋ ๋ธ๋๋ ๊ฒฝํ์ ๋ณด์ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ ํนํ ์ง๋ฆฌ์ ์ผ๋ก ๋ถ์ฐ๋ ํ ๋ด์์ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ค๋ฉด ์ ์คํ ๊ณํ๊ณผ ๊ฒฌ๊ณ ํ ๋ฒ์ ๊ด๋ฆฌ ๋ฐ ๋ฐฐํฌ ์ ๋ต์ด ํ์ํฉ๋๋ค.
ํ๋ก ํธ์๋ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ค์ํ ์ด์
ํ๋ก ํธ์๋ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฒํผ, ํผ, ๋ด๋น๊ฒ์ด์ ๋ฐ, ๋ชจ๋ฌ๊ณผ ๊ฐ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ์์์ ๋ชจ์์ผ๋ก, ๋ ๋ฆฝ์ ์ธ ๋น๋ฉ ๋ธ๋ก์ผ๋ก ์ค๊ณ ๋ฐ ๊ฐ๋ฐ๋ฉ๋๋ค. ์ด๋ฌํ ์ปดํฌ๋ํธ๋ค์ ์ฌ๋ฌ ํ๋ก์ ํธ์ ์ฝ๊ฒ ํตํฉ๋ ์ ์์ด ๋ฐ๋ณต์ ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ ํ์๊ฐ ์์ต๋๋ค. ์ด๋ ๋ค์๊ณผ ๊ฐ์ ์ฌ๋ฌ ์ด์ ์ผ๋ก ์ด์ด์ง๋๋ค:
- ๊ฐ๋ฐ ์๋ ์ฆ๊ฐ: ๊ฐ๋ฐ์๋ ์ฌ์ ๊ตฌ์ถ๋ ์ปดํฌ๋ํธ๋ฅผ ํ์ฉํ์ฌ UI๋ฅผ ์ ์ํ๊ฒ ์กฐ๋ฆฝํ ์ ์์ผ๋ฏ๋ก ๊ฐ๋ฐ ์๊ฐ์ด ํฌ๊ฒ ๋จ์ถ๋ฉ๋๋ค.
- ์ผ๊ด์ฑ ํฅ์: ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ผ๊ด๋ ๋ชจ์๊ณผ ๋๋์ ๋ณด์ฅํ์ฌ ๋ธ๋๋ ์์ด๋ดํฐํฐ๋ฅผ ๊ฐํํฉ๋๋ค.
- ์ ์ง๋ณด์์ฑ ํฅ์: ์ปดํฌ๋ํธ์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ํด๋น ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์๋์ด ์ ์ง๋ณด์ ๋ฐ ์ ๋ฐ์ดํธ๊ฐ ๊ฐ์ํ๋ฉ๋๋ค.
- ์ฝ๋ ์ค๋ณต ๊ฐ์: ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฌ์ฉํ๋ฉด ์ฝ๋ ์ค๋ณต์ด ์ต์ํ๋์ด ๋ ๊นจ๋ํ๊ณ ํจ์จ์ ์ธ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
- ํ์ ๊ฐ์ : ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋์์ด๋์ ๊ฐ๋ฐ์๋ฅผ ์ํ ๊ณตํต๋ ์ดํ๋ฅผ ์ ๊ณตํ์ฌ ๋ ๋์ ํ์ ์ ์ด์งํฉ๋๋ค.
๋ฒ์ ๊ด๋ฆฌ ์ ๋ต
ํจ๊ณผ์ ์ธ ๋ฒ์ ๊ด๋ฆฌ๋ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ด๋ฆฌํ๊ณ ํธํ์ฑ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์๋งจํฑ ๋ฒ์ ๋(SemVer)์ ์ ๊ณ ํ์ค์ด๋ฉฐ ๊ฐ๋ ฅํ ๊ถ์ฅ๋ฉ๋๋ค.
์๋งจํฑ ๋ฒ์ ๋ (SemVer)
SemVer๋ MAJOR.MINOR.PATCH์ ์ธ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋ ๋ฒ์ ๋ฒํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- MAJOR: ํธํ๋์ง ์๋ API ๋ณ๊ฒฝ์ ๋ํ๋ ๋๋ค. ์๋น์๊ฐ ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํ๋ ๋ธ๋ ์ดํน ์ฒด์ธ์ง(breaking change)๊ฐ ๋ฐ์ํ ๋ MAJOR ๋ฒ์ ์ ์ฌ๋ฆฝ๋๋ค.
- MINOR: ํ์ ํธํ์ฑ์ ์ ์งํ๋ฉด์ ์๋ก์ด ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์์์ ๋ํ๋ ๋๋ค. ์ฆ, ๊ธฐ์กด ์ฝ๋๋ ์์ ์์ด ๊ณ์ ์๋ํฉ๋๋ค.
- PATCH: ํ์ ํธํ์ฑ์ ์ ์งํ๋ ๋ฒ๊ทธ ์์ ๋๋ ์ฌ์ํ ๊ฐ์ ์ ๋ํ๋ ๋๋ค.
์์: ํ์ฌ ๋ฒ์ ์ด 1.2.3์ธ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์๊ฐํด ๋ณด์ธ์.
- ์๋กญ๊ณ ํ์ ํธํ๋๋ ๊ธฐ๋ฅ์ ๋์ ํ๋ฉด ๋ฒ์ ์ 1.3.0์ด ๋ฉ๋๋ค.
- API๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ฒ๊ทธ๋ฅผ ์์ ํ๋ฉด ๋ฒ์ ์ 1.2.4๊ฐ ๋ฉ๋๋ค.
- ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํ๋ ๋ธ๋ ์ดํน ์ฒด์ธ์ง๋ฅผ ๋์ ํ๋ฉด ๋ฒ์ ์ 2.0.0์ด ๋ฉ๋๋ค.
์ ์ ์ถ์ ์ ๋ฒ์ : SemVer๋ ํ์ดํ๊ณผ ์๋ณ์(์: 1.0.0-alpha.1, 1.0.0-beta, 1.0.0-rc.2)๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ ์ถ์ ์ ๋ฒ์ ์ ํ์ฉํฉ๋๋ค. ์ด๋ ์์ ์ ์ธ ๋ฒ์ ์ ์ถ์ํ๊ธฐ ์ ์ ํ ์คํธํ๊ณ ํผ๋๋ฐฑ์ ์์งํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
SemVer์ ์ด์
- ๋ช ํ์ฑ: SemVer๋ ๊ฐ ๋ฆด๋ฆฌ์ค์ ๋ณ๊ฒฝ ์ฌํญ ์ฑ๊ฒฉ์ ๋ํด ๋ช ํํ ์ปค๋ฎค๋์ผ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
- ์๋ํ: npm ๋ฐ yarn๊ณผ ๊ฐ์ ๋๊ตฌ๋ SemVer๋ฅผ ์ฌ์ฉํ์ฌ ์ข ์์ฑ์ ๊ด๋ฆฌํ๊ณ ํธํ๋๋ ๋ฒ์ ์ผ๋ก ์๋ ์ ๋ฐ์ดํธํฉ๋๋ค.
- ์ํ ๊ฐ์: SemVer๋ ์ข ์์ฑ์ ์ ๋ฐ์ดํธํ ๋ ์๊ธฐ์น ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๋ฒ์ ๊ด๋ฆฌ ๋๊ตฌ ๋ฐ ์๋ํ
์ฌ๋ฌ ๋๊ตฌ๊ฐ ๋ฒ์ ๊ด๋ฆฌ ํ๋ก์ธ์ค๋ฅผ ์๋ํํ๊ณ SemVer ๊ฐ์ด๋๋ผ์ธ์ ๊ฐ์ ํ ์ ์์ต๋๋ค:
- Conventional Commits: ์ด ๋ช ์ธ๋ ์ปค๋ฐ ๋ฉ์์ง ํ์์ ํ์คํํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ์ฌ, ๋๊ตฌ๊ฐ ํฌํจ๋ ๋ณ๊ฒฝ ์ ํ์ ๋ฐ๋ผ ๋ค์ ๋ฒ์ ๋ฒํธ๋ฅผ ์๋์ผ๋ก ๊ฒฐ์ ํ ์ ์๊ฒ ํฉ๋๋ค.
- Semantic Release: ์ด ๋๊ตฌ๋ ๋ฒ์ ์ฆ๋ถ, ๋ฆด๋ฆฌ์ค ๋ ธํธ ์์ฑ, npm์ ํจํค์ง ๊ฒ์ ๋ฑ ์ ์ฒด ๋ฆด๋ฆฌ์ค ํ๋ก์ธ์ค๋ฅผ ์๋ํํฉ๋๋ค. ์ ์ ํ ๋ฒ์ ๋ฒํธ๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด Conventional Commits์ ์์กดํฉ๋๋ค.
- lerna: ์ฌ๋ฌ ํจํค์ง๊ฐ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก์ ํธ(๋ชจ๋ ธ๋ ํฌ)๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋๊ตฌ์ ๋๋ค. ๋ชจ๋ ธ๋ ํฌ ๋ด ๊ฐ๋ณ ํจํค์ง์ ๋ฒ์ ๊ด๋ฆฌ ๋ฐ ๊ฒ์๋ฅผ ์๋ํํ ์ ์์ต๋๋ค.
- changesets: ๋ชจ๋ ธ๋ ํฌ์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ด๋ฆฌํ๋ ๋ ๋ค๋ฅธ ์ธ๊ธฐ ์๋ ๋๊ตฌ๋ก, ๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํ ๋ช ์์ ์ธ ๋ณ๊ฒฝ ๋ก๊ทธ ํญ๋ชฉ์ ๋ง๋๋ ๋ฐ ์ค์ ์ ๋ก๋๋ค.
Conventional Commits ์ฌ์ฉ ์์:
"feat: Add new button style"๊ณผ ๊ฐ์ ์ปค๋ฐ ๋ฉ์์ง๋ ์๋ก์ด ๊ธฐ๋ฅ์ ๋ํ๋ด๋ฉฐ MINOR ๋ฒ์ ์ฆ๋ถ์ผ๋ก ์ด์ด์ง๋๋ค. "fix: Resolve a bug in the form validation"๊ณผ ๊ฐ์ ์ปค๋ฐ ๋ฉ์์ง๋ ๋ฒ๊ทธ ์์ ์ ๋ํ๋ด๋ฉฐ PATCH ๋ฒ์ ์ฆ๋ถ์ผ๋ก ์ด์ด์ง๋๋ค. "feat(breaking): Remove deprecated API"์ ๊ฐ์ ์ปค๋ฐ ๋ฉ์์ง๋ ๋ธ๋ ์ดํน ์ฒด์ธ์ง๋ฅผ ๋ํ๋ด๋ฉฐ MAJOR ๋ฒ์ ์ฆ๋ถ์ผ๋ก ์ด์ด์ง๋๋ค.
๋ฐฐํฌ ์ ๋ต
์ฌ๋ฐ๋ฅธ ๋ฐฐํฌ ์ ๋ต์ ์ ํํ๋ ๊ฒ์ ์ฌ๋ฌ ํ๊ณผ ํ๋ก์ ํธ์ ๊ฑธ์ณ ๊ฐ๋ฐ์๋ค์ด ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋๋ก ํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ npm์ด๋ yarn๊ณผ ๊ฐ์ ํจํค์ง ๋งค๋์ ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋ชจ๋ ธ๋ ํฌ ๊ตฌ์กฐ๋ฅผ ์ฑํํ๋ ๊ฒ์ ๋๋ค.
ํจํค์ง ๋งค๋์ (npm, yarn, pnpm)
์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ npm๊ณผ ๊ฐ์ ํจํค์ง ๋งค๋์ ์ ๊ฒ์ํ๋ ๊ฒ์ด ๊ฐ์ฅ ๊ฐ๋จํ๊ณ ๋๋ฆฌ ์ฑํ๋ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ค์ ์ต์ํ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฝ๊ฒ ์ค์นํ๊ณ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
- npm ๊ณ์ ์์ฑ: ์์ง ๊ณ์ ์ด ์๋ค๋ฉด npmjs.com์์ ๊ณ์ ์ ๋ง๋์ธ์.
- package.json ๊ตฌ์ฑ: ์ด ํ์ผ์๋ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด๋ฆ, ๋ฒ์ , ์ค๋ช , ์ข ์์ฑ ๋ฑ ๋ฉํ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ฉ๋๋ค. `name` ํ๋๊ฐ ๊ณ ์ ํ๊ณ ์ค๋ช ์ ์ธ์ง ํ์ธํ์ธ์. ๋ํ `main` ํ๋๋ฅผ ์ง์ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ง์ ์ ์ ๊ฐ๋ฆฌํค๋๋ก ํ์ธ์.
- ๋น๋ ๋๊ตฌ ์ฌ์ฉ: Webpack, Rollup ๋๋ Parcel๊ณผ ๊ฐ์ ๋น๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ๋ฐฐํฌ ๊ฐ๋ฅํ ํ์(์: UMD, ES ๋ชจ๋)์ผ๋ก ๋ฒ๋ค๋งํ์ธ์.
- ํจํค์ง ๊ฒ์: `npm publish` ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ npm์ ๊ฒ์ํ์ธ์.
package.json ์์:
{
"name": "@your-org/my-component-library",
"version": "1.0.0",
"description": "A collection of reusable UI components",
"main": "dist/index.js",
"module": "dist/index.esm.js",
"repository": {
"type": "git",
"url": "git+https://github.com/your-org/my-component-library.git"
},
"keywords": [
"react",
"components",
"ui library"
],
"author": "Your Organization",
"license": "MIT",
"bugs": {
"url": "https://github.com/your-org/my-component-library/issues"
},
"homepage": "https://github.com/your-org/my-component-library#readme",
"peerDependencies": {
"react": ">=16.8.0"
},
"devDependencies": {
"webpack": "^5.0.0"
}
}
์ค์ฝํ ํจํค์ง: ์ด๋ฆ ์ถฉ๋์ ํผํ๋ ค๋ฉด ์ค์ฝํ ํจํค์ง(์: `@your-org/my-component-library`) ์ฌ์ฉ์ ๊ณ ๋ คํ์ธ์. ์ค์ฝํ ํจํค์ง๋ ์กฐ์ง ์ด๋ฆ์ด๋ ์ฌ์ฉ์ ์ด๋ฆ์ผ๋ก ์ ๋์ฌ๊ฐ ๋ถ์ด npm ๋ ์ง์คํธ๋ฆฌ ๋ด์์ ๊ณ ์ ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
๋ชจ๋ ธ๋ ํฌ
๋ชจ๋ ธ๋ ํฌ๋ ์ฌ๋ฌ ํจํค์ง๋ฅผ ํฌํจํ๋ ๋จ์ผ ์ ์ฅ์์ ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ํธ ์์กด์ ์ธ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ด๋ฆฌํ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
๋ชจ๋ ธ๋ ํฌ์ ์ด์
- ์ฝ๋ ๊ณต์ : ์ฌ๋ฌ ํ๋ก์ ํธ ๊ฐ์ ์ฝ๋์ ์ปดํฌ๋ํธ๋ฅผ ์ฝ๊ฒ ๊ณต์ ํ ์ ์์ต๋๋ค.
- ๋จ์ํ๋ ์ข ์์ฑ ๊ด๋ฆฌ: ์ข ์์ฑ์ ํ ๊ณณ์์ ๊ด๋ฆฌํ์ฌ ๋ถ์ผ์น๋ฅผ ์ค์ ๋๋ค.
- ์์์ ๋ณ๊ฒฝ: ๋จ์ผ ์ปค๋ฐ์ผ๋ก ์ฌ๋ฌ ํจํค์ง์ ๊ฑธ์ณ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ์ฌ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค.
- ํ์ ๊ฐ์ : ๋ชจ๋ ๊ด๋ จ ํ๋ก์ ํธ๋ฅผ ์ํ ์ค์ ์์น๋ฅผ ์ ๊ณตํ์ฌ ํ์ ์ ์ด์งํฉ๋๋ค.
๋ชจ๋ ธ๋ ํฌ ๊ด๋ฆฌ ๋๊ตฌ
- Lerna: ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ธ๋ ํฌ๋ฅผ ๊ด๋ฆฌํ๋ ์ธ๊ธฐ ์๋ ๋๊ตฌ์ ๋๋ค. ๋ฒ์ ๊ด๋ฆฌ, ๊ฒ์, ์ข ์์ฑ ๊ด๋ฆฌ๋ฅผ ์๋ํํ ์ ์์ต๋๋ค.
- Yarn Workspaces: Yarn Workspaces๋ ๋ชจ๋ ธ๋ ํฌ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ด์ฅ ์ง์์ ์ ๊ณตํฉ๋๋ค.
- Nx: ์ต์๊ธ ๋ชจ๋ ธ๋ ํฌ ์ง์๊ณผ ๊ณ ๊ธ ์บ์ฑ ๊ธฐ๋ฅ์ ๊ฐ์ถ ๋น๋ ์์คํ ์ ๋๋ค.
- pnpm: ์ข ์์ฑ์ ์ฌ๋ณผ๋ฆญ ๋งํฌํ์ฌ ํนํ ๋ชจ๋ ธ๋ ํฌ์์ ํจ์จ์ ์ธ ํจํค์ง ๋งค๋์ ์ ๋๋ค.
๋ชจ๋ ธ๋ ํฌ ๊ตฌ์กฐ ์์:
monorepo/
โโโ packages/
โ โโโ component-library/
โ โ โโโ package.json
โ โ โโโ src/
โ โ โโโ ...
โ โโโ application-a/
โ โ โโโ package.json
โ โ โโโ src/
โ โ โโโ ...
โ โโโ application-b/
โ โโโ package.json
โ โโโ src/
โ โโโ ...
โโโ package.json
โโโ lerna.json (or yarn.lock, nx.json)
์ง์์ ํตํฉ ๋ฐ ์ง์์ ์ ๋ฌ (CI/CD)
CI/CD ํ์ดํ๋ผ์ธ์ ๊ตฌํํ๋ ๊ฒ์ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋น๋, ํ ์คํธ, ๋ฐฐํฌ ํ๋ก์ธ์ค๋ฅผ ์๋ํํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์ด๋ฅผ ํตํด ๋ณ๊ฒฝ ์ฌํญ์ด ๋น๋ฒํ๊ณ ์์ ์ ์ผ๋ก ํตํฉ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
CI/CD ํ์ดํ๋ผ์ธ์ ์ฃผ์ ๋จ๊ณ
- ์ฝ๋ ์ปค๋ฐ: ๊ฐ๋ฐ์๊ฐ ๋ฒ์ ๊ด๋ฆฌ ์์คํ (์: Git)์ ๋ณ๊ฒฝ ์ฌํญ์ ์ปค๋ฐํฉ๋๋ค.
- ๋น๋: CI ์๋ฒ๊ฐ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์๋์ผ๋ก ๋น๋ํฉ๋๋ค.
- ํ ์คํธ: ์ฝ๋ ํ์ง์ ๋ณด์ฅํ๊ธฐ ์ํด ์๋ํ๋ ํ ์คํธ๊ฐ ์คํ๋ฉ๋๋ค.
- ๋ฒ์ ์ฆ๋ถ: ์ปค๋ฐ ๋ฉ์์ง์ ๋ฐ๋ผ ๋ฒ์ ๋ฒํธ๊ฐ ์๋์ผ๋ก ์ฆ๊ฐํฉ๋๋ค(Conventional Commits ๋๋ ์ ์ฌํ ๋ฐฉ์ ์ฌ์ฉ).
- ๊ฒ์: ์ ๋ฐ์ดํธ๋ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ npm ๋๋ ๋ค๋ฅธ ํจํค์ง ๋ ์ง์คํธ๋ฆฌ์ ๊ฒ์๋ฉ๋๋ค.
- ๋ฐฐํฌ: ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์กดํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ต์ ๋ฒ์ ์ผ๋ก ์๋ ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
์ฃผ์ CI/CD ๋๊ตฌ
- GitHub Actions: GitHub ์ ์ฅ์์ ์ํํ๊ฒ ํตํฉ๋๋ ๋ด์ฅ CI/CD ํ๋ซํผ์ ๋๋ค.
- GitLab CI/CD: GitLab๊ณผ ๊ธด๋ฐํ๊ฒ ํตํฉ๋ ๋ ๋ค๋ฅธ ๊ฐ๋ ฅํ CI/CD ํ๋ซํผ์ ๋๋ค.
- Jenkins: ๋๋ฆฌ ์ฌ์ฉ๋๋ ์คํ ์์ค ์๋ํ ์๋ฒ์ ๋๋ค.
- CircleCI: ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ CI/CD ํ๋ซํผ์ ๋๋ค.
- Travis CI: ๋ ๋ค๋ฅธ ์ธ๊ธฐ ์๋ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ CI/CD ํ๋ซํผ์ ๋๋ค.
GitHub Actions ์ํฌํ๋ก์ฐ ์์:
name: CI/CD
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Use Node.js 16
uses: actions/setup-node@v3
with:
node-version: 16
- name: Install dependencies
run: npm ci
- name: Build
run: npm run build
- name: Test
run: npm run test
publish:
needs: build
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v3
- name: Use Node.js 16
uses: actions/setup-node@v3
with:
node-version: 16
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Install dependencies
run: npm ci
- name: Semantic Release
run: npx semantic-release
๋ฌธ์ํ ๋ฐ ์คํ์ผ ๊ฐ์ด๋
ํฌ๊ด์ ์ธ ๋ฌธ์ํ๋ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋๋ ๋ฐ ํ์์ ์ ๋๋ค. ์ ๋ฌธ์ํ๋ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ๋ค์์ด ํฌํจ๋์ด์ผ ํฉ๋๋ค:
- ์ปดํฌ๋ํธ API: ๊ฐ ์ปดํฌ๋ํธ์ ์์ฑ, ๋ฉ์๋, ์ด๋ฒคํธ์ ๋ํ ์์ธํ ์ค๋ช .
- ์ฌ์ฉ ์์ : ๊ฐ ์ปดํฌ๋ํธ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ํ ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ ์์ .
- ๋์์ธ ๊ฐ์ด๋๋ผ์ธ: ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ์ฉ๋๋ ๋์์ธ ์์น ๋ฐ ์คํ์ผ์ ๋ํ ์ ๋ณด.
- ์ ๊ทผ์ฑ ๊ณ ๋ ค์ฌํญ: ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์๊ฐ ์ปดํฌ๋ํธ์ ์ ๊ทผํ ์ ์๋๋ก ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ง์นจ.
- ๊ธฐ์ฌ ๊ฐ์ด๋๋ผ์ธ: ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ์ฌํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ง์นจ.
๋ฌธ์ ์์ฑ ๋๊ตฌ
- Storybook: UI ์ปดํฌ๋ํธ๋ฅผ ๊ฐ๋ฐํ๊ณ ๋ฌธ์ํํ๋ ์ธ๊ธฐ ์๋ ๋๊ตฌ์ ๋๋ค. ๊ฐ ์ปดํฌ๋ํธ์ ๊ธฐ๋ฅ์ ๋ณด์ฌ์ฃผ๋ ๋ํํ ์คํ ๋ฆฌ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
- Docz: ๋งํฌ๋ค์ด ํ์ผ๋ก ๋ฌธ์ ์น์ฌ์ดํธ๋ฅผ ๋ง๋๋ ๋๊ตฌ์ ๋๋ค.
- Styleguidist: ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ก ๋ฌธ์ ์น์ฌ์ดํธ๋ฅผ ์์ฑํ๋ ๋๊ตฌ์ ๋๋ค.
- Compodoc: ์ต๊ทค๋ฌ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ฉ ๋ฌธ์๋ฅผ ์์ฑํ๋ ๋๊ตฌ์ ๋๋ค.
๋ฌธ์ ๊ตฌ์กฐ ์์ (Storybook):
stories/
โโโ Button.stories.js
โโโ Input.stories.js
โโโ ...
ํ์ ๋ฐ ์ปค๋ฎค๋์ผ์ด์
ํจ๊ณผ์ ์ธ ํ์ ๊ณผ ์ปค๋ฎค๋์ผ์ด์ ์ ๊ธ๋ก๋ฒ ํ ๋ด์์ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ๋ ผ์ํ๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉฐ ํผ๋๋ฐฑ์ ์์งํ๊ธฐ ์ํ ๋ช ํํ ์ปค๋ฎค๋์ผ์ด์ ์ฑ๋๊ณผ ํ๋ก์ธ์ค๋ฅผ ๊ตฌ์ถํ์ธ์.
ํ์ ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
- ๋ช ํํ ์์ ๊ถ ๋ชจ๋ธ ๊ตฌ์ถ: ๋๊ฐ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ง๋ณด์ํ๊ณ ์ ๋ฐ์ดํธํ ์ฑ ์์ด ์๋์ง ์ ์ํฉ๋๋ค.
- ๊ณต์ ๋์์ธ ์์คํ ์ฌ์ฉ: ๋์์ด๋์ ๊ฐ๋ฐ์๊ฐ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ์ฉ๋๋ ๋์์ธ ์์น๊ณผ ์คํ์ผ์ ๋ํด ์ผ์นํ๋๋ก ํฉ๋๋ค.
- ์ ๊ธฐ์ ์ธ ์ฝ๋ ๋ฆฌ๋ทฐ ์ํ: ํ์ง๊ณผ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฆฌ๋ทฐํฉ๋๋ค.
- ๋ฒ์ ๊ด๋ฆฌ ์์คํ ์ฌ์ฉ: Git ๋๋ ๋ค๋ฅธ ๋ฒ์ ๊ด๋ฆฌ ์์คํ ์ ์ฌ์ฉํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ ์ถ์ ํ๊ณ ์ฝ๋์ ๋ํด ํ์ ํฉ๋๋ค.
- ์ปค๋ฎค๋์ผ์ด์ ํ๋ซํผ ์ฌ์ฉ: Slack, Microsoft Teams ๋๋ ๋ค๋ฅธ ์ปค๋ฎค๋์ผ์ด์ ํ๋ซํผ์ ์ฌ์ฉํ์ฌ ์ํต๊ณผ ํ์ ์ ์ด์งํฉ๋๋ค.
- ๋ช ํํ ์ปค๋ฎค๋์ผ์ด์ ์ฑ๋ ๊ตฌ์ถ: ๋ค์ํ ์ ํ์ ์ปค๋ฎค๋์ผ์ด์ (์: ์ผ๋ฐ ํ ๋ก , ๋ฒ๊ทธ ๋ฆฌํฌํธ, ๊ธฐ๋ฅ ์์ฒญ)์ ์ํ ํน์ ์ฑ๋์ ์ ์ํฉ๋๋ค.
- ๊ฒฐ์ ์ฌํญ ๋ฌธ์ํ: ํฌ๋ช ์ฑ๊ณผ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ด๋ จ๋ ์ค์ํ ๊ฒฐ์ ์ ๋ฌธ์ํํฉ๋๋ค.
๋ธ๋ ์ดํน ์ฒด์ธ์ง(Breaking Change) ์ฒ๋ฆฌ
๋ธ๋ ์ดํน ์ฒด์ธ์ง๋ ์งํํ๋ ๋ชจ๋ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ถ๊ฐํผํฉ๋๋ค. ํผ๋์ ์ต์ํํ๊ณ ์๋น์๋ฅผ ์ํ ์ํํ ์ ํ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ด๋ฅผ ์ ์คํ๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ธ๋ ์ดํน ์ฒด์ธ์ง ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
- ๋ช ํํ๊ฒ ์ํตํ๊ธฐ: ์์ ๋ ๋ธ๋ ์ดํน ์ฒด์ธ์ง์ ๋ํด ์ถฉ๋ถํ ๊ฒฝ๊ณ ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ๋ง์ด๊ทธ๋ ์ด์ ๊ฐ์ด๋ ์ ๊ณต: ๋ณ๊ฒฝ ์ฌํญ์ ๋ง๊ฒ ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ์ง์นจ์ ์ ๊ณตํฉ๋๋ค.
- ์ค๋๋ API ์ฌ์ฉ ์ค๋จ(Deprecate): ์ฌ์ฉ ์ค๋จ๋ API์ ๋ช ํํ ๊ฒฝ๊ณ ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค.
- ํธํ์ฑ ๊ณ์ธต ์ ๊ณต: ๊ฐ๋ฅํ๋ค๋ฉด ์๋น์๊ฐ ์ ํ๋ ์๊ฐ ๋์ ์ด์ API๋ฅผ ๊ณ์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ํธํ์ฑ ๊ณ์ธต์ ์ ๊ณตํฉ๋๋ค.
- ์ง์ ์ ๊ณต: ์๋น์๊ฐ ์๋ก์ด API๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๋ฐ ๋์์ด ๋๋๋ก ์ง์์ ์ ๊ณตํฉ๋๋ค.
์ฌ์ฉ ์ค๋จ ๊ฒฝ๊ณ ์์:
// ๋ฒ์ 2.0.0์์ ์ฌ์ฉ ์ค๋จ๋์์ผ๋ฉฐ, ๋ฒ์ 3.0.0์์ ์ ๊ฑฐ๋ ์์ ์
๋๋ค.
console.warn('`oldMethod` ํจ์๋ ์ฌ์ฉ ์ค๋จ๋์์ผ๋ฉฐ ๋ฒ์ 3.0.0์์ ์ ๊ฑฐ๋ ์์ ์
๋๋ค. ๋์ `newMethod`๋ฅผ ์ฌ์ฉํด ์ฃผ์ธ์.');
์ ๊ทผ์ฑ ๊ณ ๋ ค์ฌํญ
์ ๊ทผ์ฑ์ ๋ชจ๋ ํ๋ก ํธ์๋ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ค์ํ ์ธก๋ฉด์ ๋๋ค. WCAG(์น ์ฝํ ์ธ ์ ๊ทผ์ฑ ๊ฐ์ด๋๋ผ์ธ)์ ๊ฐ์ ์ ๊ทผ์ฑ ๊ฐ์ด๋๋ผ์ธ์ ์ค์ํ์ฌ ์ปดํฌ๋ํธ๊ฐ ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์์๊ฒ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ๋ณด์ฅํ์ธ์.
์ฃผ์ ์ ๊ทผ์ฑ ๊ณ ๋ ค์ฌํญ
- ์๋งจํฑ HTML: ์๋งจํฑ HTML ์์๋ฅผ ์ฌ์ฉํ์ฌ ์ฝํ ์ธ ์ ๊ตฌ์กฐ์ ์๋ฏธ๋ฅผ ๋ถ์ฌํฉ๋๋ค.
- ARIA ์์ฑ: ARIA(Accessible Rich Internet Applications) ์์ฑ์ ์ฌ์ฉํ์ฌ ๋์ ์ฝํ ์ธ ์ ์ ๊ทผ์ฑ์ ํฅ์์ํต๋๋ค.
- ํค๋ณด๋ ๋ด๋น๊ฒ์ด์ : ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ํค๋ณด๋๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ์์ ๋๋น: ์ ์๋ ฅ ์ฌ์ฉ์๊ฐ ํ ์คํธ๋ฅผ ์ฝ์ ์ ์๋๋ก ์ถฉ๋ถํ ์์ ๋๋น๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์คํฌ๋ฆฐ ๋ฆฌ๋ ํธํ์ฑ: ์คํฌ๋ฆฐ ๋ฆฌ๋๋ก ์ปดํฌ๋ํธ๋ฅผ ํ ์คํธํ์ฌ ์ ๋๋ก ํด์๋๋์ง ํ์ธํฉ๋๋ค.
- ํฌ์ปค์ค ๊ด๋ฆฌ: ์ฌ์ฉ์๊ฐ ์ปดํฌ๋ํธ ๊ฐ์ ์ฝ๊ฒ ์ด๋ํ ์ ์๋๋ก ํฌ์ปค์ค๋ฅผ ์ ์ ํ๊ฒ ๊ด๋ฆฌํฉ๋๋ค.
์ฑ๋ฅ ์ต์ ํ
์ฑ๋ฅ์ ํ๋ก ํธ์๋ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ ๋ค๋ฅธ ์ค์ํ ์ธก๋ฉด์ ๋๋ค. ์ปดํฌ๋ํธ๊ฐ ์ ์ํ๊ฒ ๋ก๋๋๊ณ ํจ์จ์ ์ผ๋ก ์๋ํ๋๋ก ์ต์ ํํ์ธ์.
์ฃผ์ ์ฑ๋ฅ ์ต์ ํ ๊ธฐ๋ฒ
- ์ฝ๋ ๋ถํ (Code Splitting): ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ ์์ ์ฒญํฌ๋ก ๋ถํ ํ์ฌ ์ด๊ธฐ ๋ก๋ ์๊ฐ์ ์ค์ ๋๋ค.
- ์ง์ฐ ๋ก๋ฉ(Lazy Loading): ์ปดํฌ๋ํธ๊ฐ ํ์ํ ๋๋ง ๋ก๋ํฉ๋๋ค.
- ํธ๋ฆฌ ์์ดํน(Tree Shaking): ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ์ฉํ์ง ์๋ ์ฝ๋๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
- ์ด๋ฏธ์ง ์ต์ ํ: ์ด๋ฏธ์ง ํ์ผ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ธฐ ์ํด ์ด๋ฏธ์ง๋ฅผ ์ต์ ํํฉ๋๋ค.
- ๋ฉ๋ชจ์ด์ ์ด์ (Memoization): ๋ถํ์ํ ์ฌ๋ ๋๋ง์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ปดํฌ๋ํธ๋ฅผ ๋ฉ๋ชจ์ด์ฆํฉ๋๋ค.
- ๊ฐ์ํ(Virtualization): ๊ฐ์ํ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ํฐ ๋ฐ์ดํฐ ๋ชฉ๋ก์ ํจ์จ์ ์ผ๋ก ๋ ๋๋งํฉ๋๋ค.
๊ฒฐ๋ก
ํ๋ก ํธ์๋ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตฌ์ถํ๊ณ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ค์ํ ์์ ์ด์ง๋ง, ๊ฐ๋ฐ ์๋, ์ผ๊ด์ฑ, ์ ์ง๋ณด์์ฑ ์ธก๋ฉด์์ ์๋นํ ์ด์ ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ด ๊ฐ์ด๋์์ ์ค๋ช ํ ๋ฒ์ ๊ด๋ฆฌ ๋ฐ ๋ฐฐํฌ ์ ๋ต์ ๋ฐ๋ฅด๋ฉด ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ฝ๊ฒ ์ ๊ทผ ๊ฐ๋ฅํ๊ณ , ์ ์ ์ง ๊ด๋ฆฌ๋๋ฉฐ, ์กฐ์ง์ ๋์์์ด ๋ณํํ๋ ์๊ตฌ์ ์ ์ํ ์ ์๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค. ๊ธ๋ก๋ฒ ํ์ ์ง์ ์ผ๋ก ๊ฐ์น ์๋ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ํ์ , ์ปค๋ฎค๋์ผ์ด์ , ์ ๊ทผ์ฑ์ ์ฐ์ ์ํ๋ ๊ฒ์ ์์ง ๋ง์ธ์.
์๋งจํฑ ๋ฒ์ ๋, ์๋ํ๋ CI/CD ํ์ดํ๋ผ์ธ, ํฌ๊ด์ ์ธ ๋ฌธ์ํ, ํ์ ์ ๋ํ ๊ฐํ ์ง์ค์ ํฌํจํ๋ ๊ฒฌ๊ณ ํ ์ ๋ต์ ๊ตฌํํจ์ผ๋ก์จ, ๊ธ๋ก๋ฒ ํ์ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๊ฐ๋ฐ์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ๋ฐํํ๊ณ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ผ๊ด๋๊ฒ ๋ฐ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.