๊ธ๋ก๋ฒ ํ์ ์ํ ํ์ ๋๊ตฌ, ์ํฌํ๋ก์ฐ, ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃจ๋ฉฐ ๊ฒฌ๊ณ ํ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ์ข ํฉ ๊ฐ์ด๋์ ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ ์ธํ๋ผ: ๊ธ๋ก๋ฒ ํ์ ์ํ ๊ตฌํ ํ๋ ์์ํฌ
์ค๋๋ ๋น ๋ฅด๊ฒ ๋ฐ์ ํ๋ ๊ธฐ์ ํ๊ฒฝ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์น ๊ฐ๋ฐ์ ์ด์์ด ๋์์ต๋๋ค. ๊ทธ ๋ค์ฌ๋ค๋ฅํจ๊ณผ ๋ณดํธ์ฑ ๋๋ถ์ ํ๋ก ํธ์๋์ ๋ฐฑ์๋ ๊ฐ๋ฐ ๋ชจ๋์ ํ์์ ์ด๋ฉฐ, ์ํธ์์ฉ์ ์ธ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ถํฐ ๋ณต์กํ ์๋ฒ์ฌ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋ฅด๊ธฐ๊น์ง ๋ชจ๋ ๊ฒ์ ๊ตฌ๋ํฉ๋๋ค. ๊ฒฌ๊ณ ํ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ์ฝ๋ ํ์ง์ ๋ณด์ฅํ๊ณ , ๊ฐ๋ฐ ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ํํ๋ฉฐ, ๋ถ์ฐ๋ ๊ธ๋ก๋ฒ ํ ๋ด ํ์ ์ ์ด์งํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์ด ์ข ํฉ ๊ฐ์ด๋๋ ๊ธ๋ก๋ฒ ํ์ ๋์ ๊ณผ์ ์ ๊ธฐํ์ ๋ง์ถฐ์ง ํ๋์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ตฌํ ํ๋ ์์ํฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ฝ๋ ๋ฆฐํ ๊ณผ ํฌ๋งทํ ๋ถํฐ ์ง์์ ํตํฉ ๋ฐ ๋ฐฐํฌ์ ์ด๋ฅด๊ธฐ๊น์ง ๋ชจ๋ ๊ฒ์ ๋ค๋ฃจ๋ฉฐ ํ์์ ์ธ ๋๊ตฌ, ์ํฌํ๋ก์ฐ, ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ํ๊ตฌํ ๊ฒ์ ๋๋ค.
๊ธ๋ก๋ฒ ์๋ฐ์คํฌ๋ฆฝํธ ํ์๊ฒ ๊ฒฌ๊ณ ํ ์ธํ๋ผ๊ฐ ์ค์ํ ์ด์
๊ธ๋ก๋ฒ ํ์ ๊ฐ์ ๊ณต๊ฐ์ ์๋ ํ์ ๋นํด ๋ ํนํ ์ด๋ ค์์ ์ง๋ฉดํฉ๋๋ค. ์์ฌ์ํต ์ฅ๋ฒฝ, ๋ค๋ฅธ ์๊ฐ๋, ๊ทธ๋ฆฌ๊ณ ๋ค์ํ ๋ฌธํ์ ๊ท๋ฒ์ ํ์ ๊ณผ ์์ฐ์ฑ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ์ ์ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ ์ธํ๋ผ๋ ํ์คํ๋๊ณ ์๋ํ๋ ์ํฌํ๋ก์ฐ๋ฅผ ์ ๊ณตํ๊ณ , ์ผ๊ด์ฑ์ ์ฆ์งํ๋ฉฐ, ๋ชจ๋ฒ ์ฌ๋ก์ ๋ํ ๊ณต๋์ ์ดํด๋ฅผ ์ด์งํจ์ผ๋ก์จ ์ด๋ฌํ ์ด๋ ค์์ ์ํํ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ์ ๊ทธ๋ ๊ฒ ์ค์ํ์ง ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ํฅ์๋ ์ฝ๋ ํ์ง: ์ผ๊ด๋ ์ฝ๋ ์คํ์ผ, ์๋ํ๋ ํ ์คํธ, ์ฝ๋ ๋ฆฌ๋ทฐ ํ๋ก์ธ์ค๋ ๊ฐ๋ฐ ์์ ์ฃผ๊ธฐ ์ด๊ธฐ์ ์ค๋ฅ๋ฅผ ์๋ณํ๊ณ ์๋ฐฉํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ๋ ๋น ๋ฅธ ๊ฐ๋ฐ ์ฃผ๊ธฐ: ์๋ํ๋ ์ฝ๋ ๋น๋, ํ ์คํธ, ๋ฐฐํฌ์ ๊ฐ์ ๋ฐ๋ณต์ ์ธ ์์ ์ ๊ฐ์ํํ์ฌ ๊ฐ๋ฐ์๊ฐ ์๋ก์ด ๊ธฐ๋ฅ ์์ฑ์ ์ง์คํ ์ ์๋๋ก ํฉ๋๋ค.
- ํฅ์๋ ํ์ : ํ์คํ๋ ์ํฌํ๋ก์ฐ์ ๊ณต์ ๋ ํด๋ง์ ์ผ๊ด์ฑ์ ๋์ด๊ณ ๋ง์ฐฐ์ ์ค์ฌ ํ์๋ค์ด ์์น์ ๊ด๊ณ์์ด ๋ ์ฝ๊ฒ ํ์ ํ ์ ์๋๋ก ๋ง๋ญ๋๋ค.
- ์จ๋ณด๋ฉ ์๊ฐ ๋จ์ถ: ๋ช ํํ๊ณ ์ ๋ฌธ์ํ๋ ์ธํ๋ผ๋ ์๋ก์ด ํ์๋ค์ด ๋น ๋ฅด๊ฒ ์ ์ํ ์ ์๊ฒ ํ์ฌ ๊ฐ๋ฐ ํ๋ก์ธ์ค์ ์ค๋จ์ ์ต์ํํฉ๋๋ค.
- ํ์ฅ์ฑ ์ฆ๊ฐ: ์ ์ค๊ณ๋ ์ธํ๋ผ๋ ์ฑ์ฅํ๋ ํ๊ณผ ์ฆ๊ฐํ๋ ํ๋ก์ ํธ ๋ณต์ก์ฑ์ ์์ฉํ๊ธฐ ์ํด ์ฝ๊ฒ ํ์ฅ๋ ์ ์์ต๋๋ค.
- ๊ธ๋ก๋ฒ ์๊ฐ๋ ํจ์จ์ฑ: CI/CD์ ๊ฐ์ ์๋ํ๋ ํ๋ก์ธ์ค๋ ํ์๋ค์ด ๋ค๋ฅธ ์๊ฐ๋์ ์๋๋ผ๋ ๊ฐ๋ฐ์ด ํจ์จ์ ์ผ๋ก ๊ณ์๋ ์ ์๊ฒ ํ์ฌ ์ง์์ ์ธ ์งํ์ ๋ณด์ฅํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํ ์๊ฐ๋์์ ๋น๋๊ฐ ํธ๋ฆฌ๊ฑฐ๋๊ณ ๋ค๋ฅธ ํ์ด ํ๋ฃจ๋ฅผ ์์ํ๋ ๋์ ๋ฐฐํฌ๋ ์ ์์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ ์ธํ๋ผ์ ํต์ฌ ๊ตฌ์ฑ ์์
ํ๋์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ ์ธํ๋ผ๋ ์ฌ๋ฌ ํต์ฌ ๊ตฌ์ฑ ์์๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ๊ฐ ๊ตฌ์ฑ ์์๋ ์ฝ๋ ํ์ง, ํจ์จ์ฑ ๋ฐ ํ์ ์ ๋ณด์ฅํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ๊ฐ ๊ตฌ์ฑ ์์๋ฅผ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค:1. ์ฝ๋ ๋ฆฐํ ๋ฐ ํฌ๋งทํ
์ผ๊ด๋ ์ฝ๋ ์คํ์ผ์ ํนํ ํฌ๊ณ ๋ถ์ฐ๋ ํ์์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํ์์ ์ ๋๋ค. ์ฝ๋ ๋ฆฐํฐ์ ํฌ๋งทํฐ๋ ์ฝ๋ฉ ํ์ค์ ๊ฐ์ ํ๋ ํ๋ก์ธ์ค๋ฅผ ์๋ํํ์ฌ ๋ชจ๋ ์ฝ๋๊ฐ ์ผ๊ด๋ ์คํ์ผ ๊ฐ์ด๋๋ฅผ ๋ฐ๋ฅด๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ ์ฝ๋ ์คํ์ผ์ ๋ํ ์ฃผ๊ด์ ์ธ ๋ ผ์์ ์ต์ํํ๊ณ ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ์ฝ๊ณ ๊ฒํ ํ ๋์ ์ธ์ง ๋ถํ๋ฅผ ์ค์ฌ์ค๋๋ค.
๋๊ตฌ:
- ESLint: ๊ด๋ฒ์ํ ์ฝ๋ฉ ๊ท์น์ ๊ฐ์ ํ๋๋ก ์ฌ์ฉ์ ์ ์ํ ์ ์๋ ๋งค์ฐ ๊ตฌ์ฑ ๊ฐ๋ฅํ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฆฐํฐ์ ๋๋ค. ์๋ง์ ํ๋ฌ๊ทธ์ธ๊ณผ ํตํฉ์ ์ง์ํ์ฌ ๊ธฐ์กด ์ํฌํ๋ก์ฐ์ ์ฝ๊ฒ ํตํฉํ ์ ์์ต๋๋ค.
- Prettier: ๋ฏธ๋ฆฌ ์ ์๋ ์คํ์ผ ๊ฐ์ด๋์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ์๋์ผ๋ก ํฌ๋งทํ๋ ๋ ๋จ์ ์ธ(opinionated) ์ฝ๋ ํฌ๋งทํฐ์ ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ, ํ์ ์คํฌ๋ฆฝํธ, CSS๋ฅผ ํฌํจํ ๋ค์ํ ์ธ์ด๋ฅผ ์ง์ํฉ๋๋ค.
- Stylelint: CSS, SCSS, Less ์คํ์ผ์ํธ์ ๋ํ ์ฝ๋ฉ ํ์ค์ ๊ฐ์ ํ๋ ๊ฐ๋ ฅํ CSS ๋ฆฐํฐ์ ๋๋ค.
- EditorConfig: ๋ค๋ฅธ ํ์ผ ์ ํ์ ๋ํ ์ฝ๋ฉ ์คํ์ผ ๊ท์น์ ์ ์ํ๋ ๊ฐ๋จํ ํ์ผ ํ์์ ๋๋ค. ์ฌ๋ฌ ํธ์ง๊ธฐ์ IDE์์ ์ผ๊ด๋ ์ฝ๋ ์คํ์ผ์ ๋ณด์ฅํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๊ตฌํ:
pre-commit ํ ์ ์ฌ์ฉํ์ฌ ESLint์ Prettier๋ฅผ ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ์ ํตํฉํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๊ฐ ์ปค๋ฐ๋๊ธฐ ์ ์ ์๋์ผ๋ก ๋ฆฐํ ๋ฐ ํฌ๋งทํ ๋์ด ์คํ์ผ ์๋ฐ์ด ์ฝ๋๋ฒ ์ด์ค์ ๋ค์ด๊ฐ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. ์๋ฅผ ๋ค์ด, Husky์ lint-staged๋ฅผ ์ฌ์ฉํ์ฌ ์คํ ์ด์ง๋ ํ์ผ์ ๋ํด ESLint์ Prettier๋ฅผ ์คํํ๋ pre-commit ํ ์ ์ค์ ํ ์ ์์ต๋๋ค.
์์ `package.json` ์ค์ :
{
"devDependencies": {
"eslint": "^8.0.0",
"prettier": "^2.0.0",
"husky": "^7.0.0",
"lint-staged": "^12.0.0"
},
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
"lint-staged": {
"*.{js,jsx,ts,tsx}": ["eslint --fix", "prettier --write"]
}
}
2. ๋ฒ์ ๊ด๋ฆฌ
๋ฒ์ ๊ด๋ฆฌ ์์คํ ์ ์๊ฐ์ ํ๋ฆ์ ๋ฐ๋ฅธ ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ถ์ ํ๊ณ , ํ์ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ฉฐ, ์ด์ ๋ฒ์ ์ผ๋ก์ ๋กค๋ฐฑ์ ์ฉ์ดํ๊ฒ ํ๋ ๋ฐ ํ์์ ์ ๋๋ค. Git์ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ฒ์ ๊ด๋ฆฌ ์์คํ ์ผ๋ก, ๊ฐ๋ ฅํ ๋ธ๋์นญ ๋ฐ ๋ณํฉ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
๋๊ตฌ:
- Git: ์ฌ๋ฌ ๊ฐ๋ฐ์๊ฐ ๋์์ ๋์ผํ ์ฝ๋๋ฒ ์ด์ค์์ ์์ ํ ์ ์๊ฒ ํ๋ ๋ถ์ฐ ๋ฒ์ ๊ด๋ฆฌ ์์คํ ์ ๋๋ค.
- GitHub: Git ์ ์ฅ์๋ฅผ ํธ์คํ ํ๊ธฐ ์ํ ์น ๊ธฐ๋ฐ ํ๋ซํผ์ผ๋ก, ํ ๋ฆฌํ์คํธ, ์ด์ ์ถ์ , ์ฝ๋ ๋ฆฌ๋ทฐ์ ๊ฐ์ ํ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- GitLab: Git ์ ์ฅ์ ๊ด๋ฆฌ, CI/CD ๋ฐ ๊ธฐํ ๊ฐ๋ฐ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๋ ์น ๊ธฐ๋ฐ DevOps ํ๋ซํผ์ ๋๋ค.
- Bitbucket: ๋น๊ณต๊ฐ ์ ์ฅ์ ๋ฐ Jira์์ ํตํฉ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์น ๊ธฐ๋ฐ Git ์ ์ฅ์ ๊ด๋ฆฌ ์๋น์ค์ ๋๋ค.
๊ตฌํ:
์ฝ๋์ ๋ค๋ฅธ ๋ฒ์ ์ ๊ด๋ฆฌํ๊ธฐ ์ํด Gitflow๋ GitHub Flow์ ๊ฐ์ ๋ช ํํ ๋ธ๋์นญ ์ ๋ต์ ์๋ฆฝํ์ธ์. ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ์ํด ํ ๋ฆฌํ์คํธ๋ฅผ ์ฌ์ฉํ๊ณ , ๋ชจ๋ ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฉ์ธ ๋ธ๋์น์ ๋ณํฉ๋๊ธฐ ์ ์ ์ต์ ํ ๋ช ์ ๋ค๋ฅธ ํ์์ ์ํด ๊ฒํ ๋๋๋ก ํ์ธ์. ๋ชจ๋ ํ ๋ฆฌํ์คํธ๊ฐ ํน์ ํ์ง ๊ธฐ์ค์ ์ถฉ์กฑํ๋๋ก ์ฝ๋ ๋ฆฌ๋ทฐ ๊ท์น์ ๊ฐ์ ํ์ธ์.
์์ Gitflow ์ํฌํ๋ก์ฐ:
- `main` ๋ธ๋์น: ํ๋ก๋์ ์ค๋น๊ฐ ๋ ์ฝ๋๋ฅผ ํฌํจํฉ๋๋ค.
- `develop` ๋ธ๋์น: ์ต์ ๊ฐ๋ฐ ์ฝ๋๋ฅผ ํฌํจํฉ๋๋ค.
- `feature` ๋ธ๋์น: ์๋ก์ด ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- `release` ๋ธ๋์น: ๋ฆด๋ฆฌ์ค๋ฅผ ์ค๋นํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- `hotfix` ๋ธ๋์น: ํ๋ก๋์ ์ ๋ฒ๊ทธ๋ฅผ ์์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
3. ํ ์คํ
์๋ํ๋ ํ ์คํ ์ ์ฝ๋ ํ์ง์ ๋ณด์ฅํ๊ณ ํ๊ท(regression)๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ํฌ๊ด์ ์ธ ํ ์คํธ ์ค์ํธ์๋ ๋จ์ ํ ์คํธ, ํตํฉ ํ ์คํธ, ์๋ํฌ์๋ ํ ์คํธ๊ฐ ํฌํจ๋์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ํ ์ธก๋ฉด์ ์ปค๋ฒํด์ผ ํฉ๋๋ค.
๋๊ตฌ:
- Jest: ํ ์คํธ ๋ฌ๋, ๋จ์ธ(assertion) ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ๋ชจํน(mocking) ๊ธฐ๋ฅ์ ํฌํจํ์ฌ ํ ์คํธ๋ฅผ ์์ฑํ๊ณ ์คํํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ฒ์ ์ ๊ณตํ๋ ์ธ๊ธฐ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ ์คํธ ํ๋ ์์ํฌ์ ๋๋ค.
- Mocha: ๋ค์ํ ๋จ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ ์คํธ ๋ฌ๋๋ฅผ ์ง์ํ๋ ์ ์ฐํ ์๋ฐ์คํฌ๋ฆฝํธ ํ ์คํธ ํ๋ ์์ํฌ์ ๋๋ค.
- Chai: Mocha๋ ๋ค๋ฅธ ํ ์คํธ ํ๋ ์์ํฌ์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ ๋จ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
- Cypress: ์ค์ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ํ ์คํธ๋ฅผ ์์ฑํ๊ณ ์คํํ ์ ์๊ฒ ํด์ฃผ๋ ์๋ํฌ์๋ ํ ์คํธ ํ๋ ์์ํฌ์ ๋๋ค.
- Selenium: ์๋ํฌ์๋ ํ ์คํธ์ ์ฌ์ฉํ ์ ์๋ ๋ธ๋ผ์ฐ์ ์๋ํ ํ๋ ์์ํฌ์ ๋๋ค.
๊ตฌํ:
๊ฐ๋ณ ์ปดํฌ๋ํธ์ ํจ์์ ๋ํ ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ์ฌ ์์๋๋ก ๋์ํ๋์ง ํ์ธํ์ธ์. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ๋ค์ด ์ฌ๋ฐ๋ฅด๊ฒ ํจ๊ป ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ํตํฉ ํ ์คํธ๋ฅผ ์์ฑํ์ธ์. ์ฌ์ฉ์ ์ํธ์์ฉ์ ์๋ฎฌ๋ ์ด์ ํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์ฒด์ ์ผ๋ก ๊ธฐ๋ฅํ๋์ง ํ์ธํ๊ธฐ ์ํด ์๋ํฌ์๋ ํ ์คํธ๋ฅผ ์์ฑํ์ธ์. CI/CD ํ์ดํ๋ผ์ธ์ ํ ์คํ ์ ํตํฉํ์ฌ ์ฝ๋๊ฐ ํ๋ก๋์ ์ ๋ฐฐํฌ๋๊ธฐ ์ ์ ๋ชจ๋ ํ ์คํธ๊ฐ ํต๊ณผํ๋์ง ํ์ธํ์ธ์. ์๋ํ๋ ํ ์คํธ๋ก ๊ฐ๋ฅํ ํ ๋ง์ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ปค๋ฒํ๋๋ก ๋์ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๋ชฉํ๋ก ํ์ธ์.
์์ Jest ํ ์คํธ:
// sum.test.js
const sum = require('./sum');
test('1 + 2๋ 3๊ณผ ๊ฐ์์ผ ํจ', () => {
expect(sum(1, 2)).toBe(3);
});
4. ์ง์์ ํตํฉ ๋ฐ ์ง์์ ๋ฐฐํฌ (CI/CD)
CI/CD๋ ์ฝ๋ ๋น๋, ํ ์คํธ, ๋ฐฐํฌ ํ๋ก์ธ์ค๋ฅผ ์๋ํํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ด ๋น๋ฒํ๊ณ ์์ ์ ์ผ๋ก ํตํฉ ๋ฐ ๋ฐฐํฌ๋๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ ํตํฉ ๋ฌธ์ ์ ์ํ์ ์ค์ด๊ณ ๋ ๋น ๋ฅธ ํผ๋๋ฐฑ ๋ฃจํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
๋๊ตฌ:
- Jenkins: ์ฝ๋ ๋น๋, ํ ์คํธ, ๋ฐฐํฌ์ ์ฌ์ฉํ ์ ์๋ ์คํ์์ค ์๋ํ ์๋ฒ์ ๋๋ค.
- GitHub Actions: ์ํํธ์จ์ด ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ๋ฅผ ์๋ํํ ์ ์๊ฒ ํด์ฃผ๋ GitHub์ ๋ด์ฅ๋ CI/CD ํ๋ซํผ์ ๋๋ค.
- GitLab CI/CD: GitLab๊ณผ ํตํฉ๋ CI/CD ํ๋ซํผ์ผ๋ก, ์ฝ๋ ๋น๋, ํ ์คํธ, ๋ฐฐํฌ๋ฅผ ์ํ ๊ด๋ฒ์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- CircleCI: CI/CD ํ์ดํ๋ผ์ธ์ ์ค์ ํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ธ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ CI/CD ํ๋ซํผ์ ๋๋ค.
- Travis CI: GitHub์ ์ํํ๊ฒ ํตํฉ๋๊ณ ์ํํธ์จ์ด ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ๋ฅผ ์๋ํํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ CI/CD ํ๋ซํผ์ ๋๋ค.
- Azure DevOps: CI/CD๋ฅผ ํฌํจํ์ฌ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ์ํ ํฌ๊ด์ ์ธ ๋๊ตฌ ์ธํธ๋ฅผ ์ ๊ณตํ๋ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ์๋น์ค ์ ํ๊ตฐ์ ๋๋ค.
๊ตฌํ:
๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ฅ์์ ํธ์๋ ๋๋ง๋ค ์ฝ๋๋ฅผ ์๋์ผ๋ก ๋น๋, ํ ์คํธ, ๋ฐฐํฌํ๋ CI/CD ํ์ดํ๋ผ์ธ์ ๋ง๋์ธ์. ๋น๋ ์๋ฒ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ์ปดํ์ผํ๊ณ ํจํค์งํ์ธ์. ์๋ํ๋ ํ ์คํธ๋ฅผ ์คํํ์ฌ ์ฝ๋ ํ์ง์ ํ์ธํ์ธ์. ์ถ๊ฐ ํ ์คํธ๋ฅผ ์ํด ์ฝ๋๋ฅผ ์คํ ์ด์ง ํ๊ฒฝ์ ๋ฐฐํฌํ์ธ์. ์ฒ ์ ํ ํ ์คํธ์ ์น์ธ์ ๊ฑฐ์น ํ ์ฝ๋๋ฅผ ํ๋ก๋์ ์ ๋ฐฐํฌํ์ธ์.
์์ GitHub Actions ์ํฌํ๋ก์ฐ:
# .github/workflows/main.yml
name: CI/CD
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Node.js 16 ์ฌ์ฉ
uses: actions/setup-node@v2
with:
node-version: '16.x'
- name: ์์กด์ฑ ์ค์น
run: npm install
- name: ํ
์คํธ ์คํ
run: npm run test
- name: ๋น๋
run: npm run build
- name: ํ๋ก๋์
์ ๋ฐฐํฌ
if: github.ref == 'refs/heads/main'
run: |
# ์ฌ๊ธฐ์ ๋ฐฐํฌ ๋จ๊ณ๋ฅผ ์ถ๊ฐํ์ธ์
echo "ํ๋ก๋์
์ ๋ฐฐํฌ ์ค..."
5. ํจํค์ง ๊ด๋ฆฌ
ํจํค์ง ๊ด๋ฆฌ์๋ ์์กด์ฑ์ ์ค์น, ์ ๋ฐ์ดํธ, ๊ด๋ฆฌํ๋ ๊ณผ์ ์ ๋จ์ํํฉ๋๋ค. ๋ชจ๋ ํ์์ด ๋์ผํ ๋ฒ์ ์ ์์กด์ฑ์ ์ฌ์ฉํ๋๋ก ๋ณด์ฅํ์ฌ ํธํ์ฑ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ณ ๊ฐ๋ฐ ๊ณผ์ ์ ๋จ์ํํฉ๋๋ค.
๋๊ตฌ:
- npm: ๋ฐฉ๋ํ ์๋ฐ์คํฌ๋ฆฝํธ ํจํค์ง ์ํ๊ณ์ ์ ๊ทผํ ์ ์๊ฒ ํด์ฃผ๋ Node.js์ ๊ธฐ๋ณธ ํจํค์ง ๊ด๋ฆฌ์์ ๋๋ค.
- Yarn: npm์ ๋นํด ํฅ์๋ ์ฑ๋ฅ๊ณผ ๋ณด์์ ์ ๊ณตํ๋ ๋น ๋ฅด๊ณ ์์ ์ ์ธ ํจํค์ง ๊ด๋ฆฌ์์ ๋๋ค.
- pnpm: ํ๋ ๋งํฌ์ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋์คํฌ ๊ณต๊ฐ์ ์ ์ฝํ๊ณ ์ค์น ์๋๋ฅผ ํฅ์์ํค๋ ํจํค์ง ๊ด๋ฆฌ์์ ๋๋ค.
๊ตฌํ:
ํ๋ก์ ํธ์ ๋ชจ๋ ์์กด์ฑ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ์ฌ์ฉํ์ธ์. ๋ชจ๋ ํ์์ด ๋์ผํ ๋ฒ์ ์ ์์กด์ฑ์ ์ฌ์ฉํ๋๋ก `package-lock.json` ๋๋ `yarn.lock` ํ์ผ์ ์ฌ์ฉํ์ธ์. ๋ฒ๊ทธ ์์ , ๋ณด์ ํจ์น, ์๋ก์ด ๊ธฐ๋ฅ์ ํ์ฉํ๊ธฐ ์ํด ์ ๊ธฐ์ ์ผ๋ก ์์กด์ฑ์ ์ ๋ฐ์ดํธํ์ธ์. ๋ด๋ถ ํจํค์ง๋ฅผ ํธ์คํ ํ๊ณ ์์กด์ฑ ์ ๊ทผ์ ์ ์ดํ๊ธฐ ์ํด ๋น๊ณต๊ฐ ํจํค์ง ๋ ์ง์คํธ๋ฆฌ ์ฌ์ฉ์ ๊ณ ๋ คํ์ธ์. ๋น๊ณต๊ฐ ๋ ์ง์คํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ด๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ปดํฌ๋ํธ๋ฅผ ๊ด๋ฆฌํ๊ณ , ๋ฒ์ ๊ด๋ฆฌ ์ ์ฑ ์ ๊ฐ์ ํ๋ฉฐ, ๋ฏผ๊ฐํ ์ฝ๋๊ฐ ๊ณต๊ฐ์ ์ผ๋ก ๋ ธ์ถ๋์ง ์๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค. ์๋ก๋ npm Enterprise, Artifactory, Nexus Repository๊ฐ ์์ต๋๋ค.
์์ `package.json` ํ์ผ:
{
"name": "my-project",
"version": "1.0.0",
"dependencies": {
"react": "^17.0.0",
"axios": "^0.21.0"
},
"devDependencies": {
"eslint": "^8.0.0",
"prettier": "^2.0.0"
}
}
6. ๋ชจ๋ํฐ๋ง ๋ฐ ๋ก๊น
๋ชจ๋ํฐ๋ง๊ณผ ๋ก๊น ์ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ์ถ์ ํ๊ณ , ์ค๋ฅ๋ฅผ ์๋ณํ๋ฉฐ, ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์ด๋ ํ๋ก๋์ ํ๊ฒฝ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์์ ๋ํ ๊ท์คํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค.
๋๊ตฌ:
- Sentry: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค๋ฅ๋ฅผ ์๋ณํ๊ณ ์์ ํ๋ ๋ฐ ๋์์ด ๋๋ ์ค๋ฅ ์ถ์ ๋ฐ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ํ๋ซํผ์ ๋๋ค.
- New Relic: ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ์ธํ๋ผ์ ์ฑ๋ฅ์ ๋ํ ์ค์๊ฐ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ๋ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ํ๋ซํผ์ ๋๋ค.
- Datadog: ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ์ธํ๋ผ์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์์ฑ์ ์ ๊ณตํ๋ ๋ชจ๋ํฐ๋ง ๋ฐ ๋ถ์ ํ๋ซํผ์ ๋๋ค.
- Logrocket: ์ฌ์ฉ์๊ฐ ์น์ฌ์ดํธ์์ ์ ํํ ๋ฌด์์ ํ๋์ง ๋ณผ ์ ์๊ฒ ํด์ฃผ๋ ์ธ์ ๋ฆฌํ๋ ์ด ๋ฐ ์ค๋ฅ ์ถ์ ๋๊ตฌ์ ๋๋ค.
- Graylog: ๋ค์ํ ์์ค์์ ๋ก๊ทธ๋ฅผ ์์ง, ๋ถ์, ์๊ฐํํ ์ ์๊ฒ ํด์ฃผ๋ ์คํ์์ค ๋ก๊ทธ ๊ด๋ฆฌ ํ๋ซํผ์ ๋๋ค.
๊ตฌํ:
์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ ๋ถ๋ถ์์ ๋ก๊ทธ๋ฅผ ์์งํ๊ธฐ ์ํด ์ค์ ์ง์ค์ ๋ก๊น ์ ๊ตฌํํ์ธ์. ์๋ต ์๊ฐ, ์ค๋ฅ์จ, ๋ฆฌ์์ค ์ฌ์ฉ๋ฅ ๊ณผ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ์ถ์ ํ๊ธฐ ์ํด ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ธ์. ์ค์ํ ๋ฌธ์ ์ ๋ํด ์๋ฆผ์ ๋ฐ๋๋ก ๊ฒฝ๊ณ ๋ฅผ ์ค์ ํ์ธ์. ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ํด๊ฒฐํ๊ธฐ ์ํด ๋ก๊ทธ์ ๋ฉํธ๋ฆญ์ ๋ถ์ํ์ธ์. ์ฌ๋ฌ ์๋น์ค์ ๊ฑธ์น ์์ฒญ์ ์ถ์ ํ๊ธฐ ์ํด ๋ถ์ฐ ์ถ์ ์ ์ฌ์ฉํ์ธ์.
7. ๋ฌธ์ํ
ํฌ๊ด์ ์ธ ๋ฌธ์ํ๋ ์๋ก์ด ํ์์ ์จ๋ณด๋ฉํ๊ณ , ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ ์ง๋ณด์ํ๋ฉฐ, ๋ชจ๋ ์ฌ๋์ด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํ๋๋ก ๋ณด์ฅํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ๋ฌธ์์๋ API ๋ฌธ์, ์ํคํ ์ฒ ๋ค์ด์ด๊ทธ๋จ, ๊ฐ๋ฐ์ ๊ฐ์ด๋๊ฐ ํฌํจ๋์ด์ผ ํฉ๋๋ค.
๋๊ตฌ:
- JSDoc: ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ก๋ถํฐ API ๋ฌธ์๋ฅผ ์์ฑํ๋ ๋ฌธ์ ์์ฑ๊ธฐ์ ๋๋ค.
- Swagger/OpenAPI: RESTful API๋ฅผ ์ค๊ณ, ๊ตฌ์ถ, ๋ฌธ์ํ, ์๋นํ๊ธฐ ์ํ ํ๋ ์์ํฌ์ ๋๋ค.
- Confluence: ํ๊ณผ ๋ฌธ์๋ฅผ ์์ฑํ๊ณ ๊ณต์ ํ ์ ์๊ฒ ํด์ฃผ๋ ํ์ ๋ฐ ๋ฌธ์ํ ํ๋ซํผ์ ๋๋ค.
- Notion: ๋ฉ๋ชจ ์์ฑ, ํ๋ก์ ํธ ๊ด๋ฆฌ, ํ์ ๊ธฐ๋ฅ์ ๊ฒฐํฉํ ์์ ๊ณต๊ฐ์ ๋๋ค.
- Read the Docs: Git ์ ์ฅ์์์ ๋ฌธ์๋ฅผ ๋น๋ํ๊ณ ํธ์คํ ํ๋ ๋ฌธ์ ํธ์คํ ํ๋ซํผ์ ๋๋ค.
๊ตฌํ:
์ฝ๋๋ก๋ถํฐ API ๋ฌธ์๋ฅผ ์์ฑํ๊ธฐ ์ํด ๋ฌธ์ ์์ฑ๊ธฐ๋ฅผ ์ฌ์ฉํ์ธ์. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๋ ๊ฐ๋ฐ์ ๊ฐ์ด๋๋ฅผ ์์ฑํ์ธ์. ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์กฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ํคํ ์ฒ ๋ค์ด์ด๊ทธ๋จ์ ๋ง๋์ธ์. ์ต์ ๋ณ๊ฒฝ ์ฌํญ์ผ๋ก ๋ฌธ์๋ฅผ ์ต์ ์ํ๋ก ์ ์งํ์ธ์. ๋ชจ๋ ํ์์ด ๋ฌธ์์ ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋๋ก ๋ณด์ฅํ์ธ์.
์์ JSDoc ์ฃผ์:
/**
* ๋ ์ซ์๋ฅผ ๋ํฉ๋๋ค.
*
* @param {number} a ์ฒซ ๋ฒ์งธ ์ซ์.
* @param {number} b ๋ ๋ฒ์งธ ์ซ์.
* @returns {number} ๋ ์ซ์์ ํฉ.
*/
function sum(a, b) {
return a + b;
}
๊ธ๋ก๋ฒ ํ์ ์ํ ์ธํ๋ผ ๋ง์ถคํ
๊ธ๋ก๋ฒ ํ์ ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ ์ธํ๋ผ๋ฅผ ๊ตฌํํ ๋, ๋ถ์ฐ๋ ์ธ๋ ฅ๊ณผ ํจ๊ป ์ค๋ ๋ ํนํ ๋์ ๊ณผ์ ์ ๊ธฐํ๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ํต์ฌ ๊ณ ๋ ค ์ฌํญ์ ๋๋ค:
1. ์ปค๋ฎค๋์ผ์ด์ ๋ฐ ํ์
ํจ๊ณผ์ ์ธ ์ปค๋ฎค๋์ผ์ด์ ๊ณผ ํ์ ์ ๊ธ๋ก๋ฒ ํ์๊ฒ ํ์์ ์ ๋๋ค. Slack์ด๋ Microsoft Teams์ ๊ฐ์ ์ค์๊ฐ ์ปค๋ฎค๋์ผ์ด์ ์ ์ฉ์ดํ๊ฒ ํ๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ธ์. ๋ค๋ฅธ ์ฃผ์ ์ ๋ํ ๋ช ํํ ์ปค๋ฎค๋์ผ์ด์ ์ฑ๋์ ์ค์ ํ์ธ์. ๊ด๊ณ๋ฅผ ๊ตฌ์ถํ๊ณ ๊ณต๋์ฒด ์์์ ํจ์ํ๊ธฐ ์ํด ํ์ ํ์๋ฅผ ์ฌ์ฉํ์ธ์. ๋ชจ๋ ์ฌ๋์ด ๊ฐ์ ์ ๋ณด๋ฅผ ๊ณต์ ํ๋๋ก ๋ชจ๋ ๊ฒฐ์ ๊ณผ ๋ ผ์๋ฅผ ๋ฌธ์ํํ์ธ์. ์ปค๋ฎค๋์ผ์ด์ ์คํ์ผ์ ๋ฌธํ์ ์ฐจ์ด๋ฅผ ๊ณ ๋ คํ๊ณ ์ ๊ทผ ๋ฐฉ์์ ๊ทธ์ ๋ง๊ฒ ์กฐ์ ํ์ธ์. ์๋ฅผ ๋ค์ด, ์ผ๋ถ ์์ ๋ฌธํ์์ ํํ ์ง์ ์ ์ธ ์ปค๋ฎค๋์ผ์ด์ ์คํ์ผ์ ๋ค๋ฅธ ๋ฌธํ์์๋ ๊ณต๊ฒฉ์ ์ผ๋ก ์ธ์๋ ์ ์์ต๋๋ค. ๋ฌธํ์ ์ฐจ์ด๋ฅผ ๋ฉ์ฐ๊ธฐ ์ํด ์ ๊ทน์ ์ธ ๊ฒฝ์ฒญ๊ณผ ๊ณต๊ฐ์ ์ฅ๋ คํ์ธ์.
2. ์๊ฐ๋ ๊ด๋ฆฌ
๋ค๋ฅธ ์๊ฐ๋๋ฅผ ๋ค๋ฃจ๋ ๊ฒ์ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์ฌ๋ฌ ์๊ฐ๋์ ๊ฑธ์ณ ํ์์ ์์ ์ ์์ฝํ ์ ์๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ธ์. ํ์๋ค๊ณผ ์ํตํ ๋ ์๊ฐ๋ ์ฐจ์ด๋ฅผ ์ผ๋์ ๋์ธ์. ์ค์๊ฐ ์ปค๋ฎค๋์ผ์ด์ ์ ํ์์ฑ์ ์ต์ํํ๊ธฐ ์ํด ์ด๋ฉ์ผ์ด๋ ํ๋ก์ ํธ ๊ด๋ฆฌ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋น๋๊ธฐ์ ์ปค๋ฎค๋์ผ์ด์ ์ ๋ต์ ๊ตฌํํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์. ์๋ํ๋ฅผ ํ์ฉํ์ฌ ๋ฐค๋ฎ ์ธ์ ๋ ์ง ํธ๋ฆฌ๊ฑฐ๋ ์ ์๋ ์๋ํ๋ ๋น๋ ๋ฐ ๋ฐฐํฌ์ ๊ฐ์ด ์ฌ๋ฌ ์๊ฐ๋์ ๊ฑธ์ณ ํ๋ก์ธ์ค๊ฐ ์ํํ๊ฒ ์คํ๋๋๋ก ํ์ธ์.
3. ๋ฌธํ์ ๊ฐ์์ฑ
์ ๋ฌด ์คํ์ผ, ์ปค๋ฎค๋์ผ์ด์ ์คํ์ผ, ๊ธฐ๋์น์์์ ๋ฌธํ์ ์ฐจ์ด๋ฅผ ์ธ์งํ์ธ์. ํ์๋ค์ด ๋ค๋ฅธ ๋ฌธํ๋ฅผ ์ดํดํ๊ณ ์กด์คํ ์ ์๋๋ก ๋ฌธํ์ ๊ฐ์์ฑ ๊ต์ก์ ์ ๊ณตํ์ธ์. ํ์๋ค์ด ์๋ก์ ๋ฌธํ์ ๋ํด ๋ฐฐ์ฐ๋๋ก ์ฅ๋ คํ์ธ์. ๋ชจ๋ ์ฌ๋์ด ๊ฐ์น ์๊ณ ์กด์ค๋ฐ๋๋ค๊ณ ๋๋ผ๋ ํ์ํ๊ณ ํฌ์ฉ์ ์ธ ํ๊ฒฝ์ ๋ง๋์ธ์. ๋ฌธํ์ ๊ณตํด์ผ๊ณผ ํ์ฌ๋ฅผ ๊ธฐ๋ ํ์ธ์. ๋ฌธํ์ ๊ท๋ฒ์ด๋ ๊ดํ์ ๋ํด ๊ฐ์ ํ์ง ๋ง์ธ์. ์๋ฅผ ๋ค์ด, ๊ณตํด์ผ ์ผ์ ์ ๊ตญ๊ฐ๋ง๋ค ํฌ๊ฒ ๋ค๋ฅผ ์ ์์ผ๋ฏ๋ก ํ๋ก์ ํธ์ ๋ง๊ฐ์ผ์ ๊ณํํ ๋ ์ด๋ฌํ ์ฐจ์ด๋ฅผ ์ธ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ํ ํ๊ฒฝ์ด ๋ชจ๋ ๋ฌธํ๋ฅผ ํฌ์ฉํ๊ณ ์กด์คํ๋์ง ํ์ธํ๊ธฐ ์ํด ์ ๊ธฐ์ ์ผ๋ก ํ์๋ค๋ก๋ถํฐ ํผ๋๋ฐฑ์ ๊ตฌํ์ธ์.
4. ๋ฌธ์ํ ๋ฐ ์ง์ ๊ณต์
ํฌ๊ด์ ์ธ ๋ฌธ์ํ๋ ๊ธ๋ก๋ฒ ํ์๊ฒ ํจ์ฌ ๋ ์ค์ํฉ๋๋ค. ์ฝ๋ฉ ํ์ค๋ถํฐ ์ํคํ ์ฒ ๊ฒฐ์ , ํ๋ก์ ํธ ์ํฌํ๋ก์ฐ์ ์ด๋ฅด๊ธฐ๊น์ง ๋ชจ๋ ๊ฒ์ ๋ฌธ์ํํ์ธ์. ๋ชจ๋ ๋ฌธ์๋ฅผ ์ํ ์ค์ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ์ธ์. ์์น์ ๊ด๊ณ์์ด ๋ชจ๋ ํ์์ด ๋ฌธ์์ ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋๋ก ๋ณด์ฅํ์ธ์. ํ์๋ค์ด ๋ฌธ์ํ์ ๊ธฐ์ฌํ๋๋ก ์ฅ๋ คํ์ธ์. ํ์๋ค์ด ์ ๋ฌธ ์ง์์ ๊ณต์ ํ๊ณ ์๋ก์๊ฒ์ ๋ฐฐ์ธ ์ ์๋ ์ง์ ๊ณต์ ํ๋ก์ธ์ค๋ฅผ ๊ตฌํํ์ธ์. ์ด๋ ์ ๊ธฐ์ ์ธ ์ง์ ๊ณต์ ์ธ์ , ๋ด๋ถ ๋ธ๋ก๊ทธ ๋๋ ๊ณต์ ๋ ์ง์ ๊ธฐ๋ฐ์ ํฌํจํ ์ ์์ต๋๋ค. ์์ด๊ฐ ๋ชจ๊ตญ์ด๊ฐ ์๋ ์ฌ๋๋ค์ด ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ก ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ ์ธ์ด๋ก ๋ฌธ์๋ฅผ ์์ฑํ๋๋ก ์ฅ๋ คํ์ธ์. ์๋ฉด ๋ฌธ์๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ๋ค์ด์ด๊ทธ๋จ๊ณผ ์คํฌ๋ฆฐ์ท๊ณผ ๊ฐ์ ์๊ฐ์ ๋ณด์กฐ ์๋ฃ๋ฅผ ์ฌ์ฉํ์ธ์.
5. ํด๋ง ๋ฐ ์ธํ๋ผ
์ ์ธ๊ณ ์ด๋์์๋ ์ ๊ทผ ๊ฐ๋ฅํ๊ณ ์ ๋ขฐํ ์ ์๋ ๋๊ตฌ์ ์ธํ๋ผ๋ฅผ ์ ํํ์ธ์. ํ์๋ค์ด ์ด๋ค ์์น์์๋ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋๋ก ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ์๋น์ค๋ฅผ ์ฌ์ฉํ์ธ์. ํ์๋ค์ด ๋๊ตฌ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ๊ต์ก๊ณผ ์ง์์ ์ ๊ณตํ์ธ์. ์ธํ๋ผ๊ฐ ์ฑ์ฅํ๋ ํ์ ์์ฉํ ์ ์๋๋ก ํ์ฅ ๊ฐ๋ฅํ์ง ํ์ธํ์ธ์. ๋ค๋ฅธ ์ง์ญ์ ํ์๋ค์ ์ํด ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ(CDN) ์ฌ์ฉ์ ๊ณ ๋ คํ์ธ์. ํ์๋ค์ด ๋ชจ๊ตญ์ด๋ก ์ฝ๋์ ๋ฌธ์๋ฅผ ์์ ํ ์ ์๋๋ก ์ฌ๋ฌ ์ธ์ด์ ๋ฌธ์ ์งํฉ์ ์ง์ํ๋ ๋๊ตฌ๋ฅผ ํ์ฉํ์ธ์. ๋ชจ๋ ๋๊ตฌ๊ฐ ํ์ํ ๋ฐ์ดํฐ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ ๋ฐ ๊ท์ ์ค์ ๊ท์ ์ ์ถฉ์กฑํ๋์ง ํ์ธํ์ธ์. ํนํ ๊ตญ์ ํ ๋ฐ ๊ตญ๊ฒฝ์ ๋๋ ๋ฐ์ดํฐ ์ ์ฅ๊ณผ ๊ด๋ จํ์ฌ ์ค์ํฉ๋๋ค.
์์ ๊ตฌํ ์๋๋ฆฌ์ค: ๋ถ์ฐ๋ ์ด์ปค๋จธ์ค ํ
์๋ก์ด ์จ๋ผ์ธ ์คํ ์ด๋ฅผ ๊ตฌ์ถํ๋ ๋ถ์ฐ๋ ์ด์ปค๋จธ์ค ํ์ ์๋ฅผ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค. ์ด ํ์ ๋ถ๋ฏธ, ์ ๋ฝ, ์์์์ ๋ถ์ฐ๋์ด ์์ต๋๋ค.
1. ์ธํ๋ผ ์ค์
- ๋ฒ์ ๊ด๋ฆฌ: ํ์ Gitflow ๋ธ๋์นญ ์ ๋ต์ ์ฌ์ฉํ์ฌ GitHub๋ฅผ ๋ฒ์ ๊ด๋ฆฌ์ฉ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
- ์ฝ๋ ๋ฆฐํ ๋ฐ ํฌ๋งทํ : ESLint์ Prettier๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋ ์คํ์ผ์ ๊ฐ์ ํ๋ฉฐ, ์ฝ๋๋ฅผ ์๋์ผ๋ก ๋ฆฐํ ํ๊ณ ํฌ๋งทํ๊ธฐ ์ํด pre-commit ํ ์ ์ฌ์ฉํฉ๋๋ค.
- ํ ์คํ : Jest๋ ๋จ์ ๋ฐ ํตํฉ ํ ์คํธ์ ์ฌ์ฉ๋๊ณ , Cypress๋ ์๋ํฌ์๋ ํ ์คํธ์ ์ฌ์ฉ๋ฉ๋๋ค.
- CI/CD: GitHub Actions๋ฅผ CI/CD์ ์ฌ์ฉํ๋ฉฐ, ์คํ ์ด์ง ๋ฐ ํ๋ก๋์ ํ๊ฒฝ์ ๋ํ ์๋ํ๋ ๋น๋, ํ ์คํธ, ๋ฐฐํฌ๊ฐ ์ด๋ฃจ์ด์ง๋๋ค.
- ํจํค์ง ๊ด๋ฆฌ: npm์ ํจํค์ง ๊ด๋ฆฌ์ ์ฌ์ฉํ๋ฉฐ, ์ผ๊ด๋ ์์กด์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด `package-lock.json` ํ์ผ์ ์ฌ์ฉํฉ๋๋ค.
- ๋ชจ๋ํฐ๋ง ๋ฐ ๋ก๊น : Sentry๋ ์ค๋ฅ ์ถ์ ์, New Relic์ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง์ ์ฌ์ฉ๋ฉ๋๋ค.
- ๋ฌธ์ํ: JSDoc์ API ๋ฌธ์๋ฅผ ์์ฑํ๋ ๋ฐ, Confluence๋ ๊ฐ๋ฐ์ ๊ฐ์ด๋ ๋ฐ ์ํคํ ์ฒ ๋ค์ด์ด๊ทธ๋จ์ ์ฌ์ฉ๋ฉ๋๋ค.
2. ์ํฌํ๋ก์ฐ
- ๊ฐ๋ฐ์๋ค์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ํด feature ๋ธ๋์น๋ฅผ ์์ฑํฉ๋๋ค.
- ์ฝ๋๋ ํ ๋ฆฌํ์คํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒํ ๋ฉ๋๋ค.
- ๊ฐ ํ ๋ฆฌํ์คํธ์ ๋ํด ์๋ํ๋ ํ ์คํธ๊ฐ ์คํ๋ฉ๋๋ค.
- ์ฝ๋๋ ๊ฒํ ๋ฐ ํ ์คํธ ํ `develop` ๋ธ๋์น์ ๋ณํฉ๋ฉ๋๋ค.
- `develop` ๋ธ๋์น๋ ์คํ ์ด์ง ํ๊ฒฝ์ ๋ฐฐํฌ๋ฉ๋๋ค.
- `develop` ๋ธ๋์น๋ ๋ฆด๋ฆฌ์ค๋ฅผ ์ํด `main` ๋ธ๋์น์ ๋ณํฉ๋ฉ๋๋ค.
- `main` ๋ธ๋์น๋ ํ๋ก๋์ ํ๊ฒฝ์ ๋ฐฐํฌ๋ฉ๋๋ค.
3. ๊ธ๋ก๋ฒ ํ ๊ณ ๋ ค์ฌํญ
- ํ์ ์ปค๋ฎค๋์ผ์ด์ ์ ์ํด Slack์ ์ฌ์ฉํ๋ฉฐ, ๋ค๋ฅธ ์ฃผ์ ์ ๋ํ ์ ์ฉ ์ฑ๋์ด ์์ต๋๋ค.
- ํ์๋ ์๊ฐ๋ ๋ณํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์์ฝ๋ฉ๋๋ค.
- ํ์ ๊ธด๊ธํ์ง ์์ ๋ฌธ์ ์ ๋ํด ์ด๋ฉ์ผ ๋ฐ ํ๋ก์ ํธ ๊ด๋ฆฌ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๋น๋๊ธฐ์ ์ปค๋ฎค๋์ผ์ด์ ๋ฌธํ๋ฅผ ํ๋ฆฝํ์ต๋๋ค.
- ๋ฌธ์๋ ํ ์คํธ๋ฅผ ๋ณด์ํ๊ธฐ ์ํ ์๊ฐ์ ๋ณด์กฐ ์๋ฃ์ ํจ๊ป ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ ์์ด๋ก ์์ฑ๋ฉ๋๋ค.
- ํ์ ์ ์ธ๊ณ ์ด๋์์๋ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋๋ก ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ์๋น์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๊ฒฐ๋ก
๊ฒฌ๊ณ ํ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ์ฝ๋ ํ์ง์ ๋ณด์ฅํ๊ณ , ๊ฐ๋ฐ ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ํํ๋ฉฐ, ๊ธ๋ก๋ฒ ํ ๋ด ํ์ ์ ์ด์งํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์ด ๊ฐ์ด๋์์ ์ค๋ช ํ ํ๋ ์์ํฌ๋ฅผ ๊ตฌํํจ์ผ๋ก์จ, ์ผ๊ด์ฑ์ ์ฆ์งํ๊ณ ๋ง์ฐฐ์ ์ค์ด๋ฉฐ ํ์ด ๊ณ ํ์ง ์ํํธ์จ์ด๋ฅผ ํจ์จ์ ์ด๊ณ ํจ๊ณผ์ ์ผ๋ก ์ ๊ณตํ ์ ์๋๋ก ํ๋ ํ์คํ๋๊ณ ์๋ํ๋ ์ํฌํ๋ก์ฐ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ํ๊ณผ ํ๋ก์ ํธ์ ํน์ ์๊ตฌ์ ๋ง๊ฒ ์ธํ๋ผ๋ฅผ ์กฐ์ ํ๊ณ , ํผ๋๋ฐฑ๊ณผ ๊ฒฝํ์ ๋ฐํ์ผ๋ก ํ๋ก์ธ์ค๋ฅผ ์ง์์ ์ผ๋ก ๋ฐ๋ณตํ๊ณ ๊ฐ์ ํ๋ ๊ฒ์ ๊ธฐ์ตํ์ธ์. ๊ธ๋ก๋ฒ ํ์ ์ ๋์ ๊ณผ ๊ธฐํ๋ฅผ ๋ฐ์๋ค์ด๊ณ , ์๋ฐ์คํฌ๋ฆฝํธ์ ํ์ ํ์ฉํ์ฌ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ๋๋ฌํ๋ ํ์ ์ ์ด๊ณ ์ํฅ๋ ฅ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ์ธ์.
๋ช ํํ ์ปค๋ฎค๋์ผ์ด์ , ๋ฌธํ์ ๊ฐ์์ฑ, ๊ทธ๋ฆฌ๊ณ ์ ์ ํ ํด๋ง์ ์ง์คํจ์ผ๋ก์จ, ๊ธฐ์ ์ ๊ทธ๋ค์ ๊ธ๋ก๋ฒ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ด ๋ฒ์ฐฝํ๊ณ , ์ ์ธ๊ณ ์ฌ์ฉ์์ ๋ค์ํ ์๊ตฌ๋ฅผ ์ถฉ์กฑ์ํค๋ ์ํฅ๋ ฅ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ณตํ๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค.
์คํ ๊ฐ๋ฅํ ํต์ฐฐ๋ ฅ
- ํ์ฌ ์ธํ๋ผ ํ๊ฐ: ๊ฐ์ ํ ์์ญ์ ์๋ณํ๊ธฐ ์ํด ๊ธฐ์กด ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ ์ธํ๋ผ์ ๋ํ ์ฒ ์ ํ ๊ฒํ ๋ฅผ ์ํํ์ธ์.
- ์๋ํ ์ฐ์ ์์ ์ง์ : ์ฝ๋ ๋ฆฐํ ๋ฐ ํฌ๋งทํ ๋ถํฐ ํ ์คํธ ๋ฐ ๋ฐฐํฌ์ ์ด๋ฅด๊ธฐ๊น์ง ๊ฐ๋ฅํ ํ ๋ง์ ์์ ์ ์๋ํํ์ธ์.
- ๋ช ํํ ํ์ค ์ค์ : ๋ช ํํ ์ฝ๋ฉ ํ์ค, ํ ์คํธ ๊ฐ์ด๋๋ผ์ธ, ๋ฌธ์ํ ๊ดํ์ ์ ์ํ์ธ์.
- ์ปค๋ฎค๋์ผ์ด์ ๋๊ตฌ์ ํฌ์: ํจ๊ณผ์ ์ธ ์ปค๋ฎค๋์ผ์ด์ ๊ณผ ํ์ ์ ์ด์งํ๋ ๋๊ตฌ๋ก ํ์ ๋ฌด์ฅ์ํค์ธ์.
- ์ง์์ ์ธ ๊ฐ์ ๋ฌธํ ์กฐ์ฑ: ์ ๊ธฐ์ ์ผ๋ก ํ์ผ๋ก๋ถํฐ ํผ๋๋ฐฑ์ ๊ตฌํ๊ณ ํจ์จ์ฑ๊ณผ ํจ๊ณผ์ฑ์ ๊ฐ์ ํ๊ธฐ ์ํด ํ๋ก์ธ์ค๋ฅผ ๋ฐ๋ณตํ์ธ์.