๊ฐ๋
๐ฅ **๋ณด์ผ๋ฌํ๋ ์ดํธ(Boilerplate)**๋?
1. ๊ฐ๋ : ๋ฐ๋ณต์ ์ผ๋ก ์์ฃผ ์ฌ์ฉํ๋ ์ฝ๋ ๊ตฌ์กฐ๋ ํ์ผ.
2. ์ด๋ฆ์ ์ ๋ : ์ ๋ฌธ ์ธ์์์์ ์์ฃผ ์ฐ๋ ๊ธ์ํ์์ ์จ ๋ง๋ก, ์์ฃผ ์ฐ๋ ๋ฌธ๊ตฌ๋ฅผ ๊ธ์ํ์ผ๋ก ์ฐ์ด๋๊ณ ๋ณต์ฌ ๋ถ์ฌ๋ฃ๊ธฐ ํ๋ฏ ์ฌ์ฉํ๋ ๊ฒ์์ ์ ๋๋๋ค. ์ํํธ์จ์ด์์ ๋ฐ๋ณต์ ์ผ๋ก ์ฐ๋ ์ฝ๋๋ผ๋ ์๋ฏธ
3. ๊ฐ๋ฐ์์์ ์๋ฏธ
- ๋งค ํ๋ก์ ํธ๋ง๋ค ๊ฑฐ์ ๋น์ทํ๊ฒ ์๊ธฐ๋ ๊ธฐ๋ณธ ๋ผ๋ ์ฝ๋
- ์ฒ์๋ถํฐ ์ง์ ํ๋ํ๋ ๋ค ์์ฑํ์ง ์์๋ ๋๋๋ก, ์ด๊ธฐ ์ธํ ์ ๋ฏธ๋ฆฌ ํด๋ ์ฝ๋ ๋ฌถ์
4. ๋ณด์ผ๋ฌ ํ๋ ์ดํธ์ ์ฅ์
- ์๊ฐ ์ ์ฝ: ๋งค๋ฒ ๋๊ฐ์ ์ค์ ์ ํด๋ ๋จ.
- ์ผ๊ด์ฑ ์ ์ง: ํ์๋ค์ด ๊ฐ์ ๊ตฌ์กฐ์์ ๊ฐ๋ฐ.
- ์์ฐ์ฑ ํฅ์: ์ค์ํ ๋ก์ง์๋ง ์ง์ค ๊ฐ๋ฅ.
๋ชฉ์
์คํ ๋ฆฌ๋ถ์ด๋, ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ์ ๊ณต๋ถํ๊ฑฐ๋ ํ ์คํธํ๊ณ ์ถ์๋,
๋งค๋ฒ ์ค์ ์ ์๋กํ๊ธฐ ๊ท์ฐฎ์ต๋๋ค.
๊ทธ๋ด๋, ๋ณด์ผ๋ฌ ํ๋ ์ดํธ๋ฅผ ์์ฑํด ํ๊ณ ์ถ์ ์์ ๋๋ง๋ค ์ค์ ์ ๋ณต์ฌํ๋ ค๊ณ ํฉ๋๋ค.
๋ํ ์ผ๊ด์ฑ์ ์ํด commit ํ ํ๋ฆฟ๊ณผ PRํ ํ๋ฆฟ์ ๋ง๋ค๊ฒ ์ต๋๋ค.
1. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
- Next.js
- TailwindCss
- eslint
- prettier
- typescript
- svgr
eslint.config.mjs
import { dirname } from "path";
import { fileURLToPath } from "url";
import { FlatCompat } from "@eslint/eslintrc";
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const compat = new FlatCompat({
baseDirectory: __dirname,
});
const eslintConfig = [
...compat.extends("next/core-web-vitals", "next/typescript"),
{
rules: {
"@typescript-eslint/no-explicit-any": "warn",
"import/no-unresolved": "error",
},
},
];
export default eslintConfig;
.prettierrc
{
"plugins": ["prettier-plugin-tailwindcss"],
"semi": true,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "all",
"printWidth": 100,
"bracketSpacing": true,
"arrowParens": "always"
}
2. commit Message ์ค์
- ๋ฃจํธํด๋์ ์๋์ ๊ฐ์ ํ์ผ์ ์ถ๊ฐํฉ๋๋ค.
[ํ์
]: ๊ฐ๋ตํ ์ ๋ชฉ (์ต๋ 50์)
์์ธ ๋ด์ฉ (ํ์ ์ ์์ฑ, ์ต๋ 72์ ๊ถ์ฅ)
# ํ์
์์
# feat : ๊ธฐ๋ฅ ์ถ๊ฐ
# fix : ๋ฒ๊ทธ ์์
# docs : ๋ฌธ์ ์
๋ฐ์ดํธ
# refactor : ์ฝ๋ ๋ฆฌํฉํ ๋ง
# chore : ๊ธฐํ ๋ณ๊ฒฝ์ฌํญ
# style : ์ฝ๋ ์คํ์ผ ๋ณ๊ฒฝ
# test : ํ
์คํธ ์ฝ๋ ์์ฑ ๋ฐ ์์
# perf : ์ฑ๋ฅ ๊ฐ์
# setting : ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ ๋ฐ ์ค์ ์ถ๊ฐ
- commit ํ ํ๋ฆฟ ์ค์ (ํ๋ฒ๋ง ์ค์ ํ์)
git config --local commit.template .gitmessage.txt
- ๋ชจ๋ ๋ ํฌ์งํ ๋ฆฌ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ๋ ค๋ฉด
git config --global commit.template ~/.gitmessage.txt
3. PRํ ํ๋ฆฟ ์ค์
- ๋ฃจํธํด๋์์ ์๋๊ฒฝ๋ก๋ก ํ์ผ์ ์์ฑํฉ๋๋ค
.github/pull_request_template.md
## ๐ ์์
๋ด์ฉ
- [ ] ๊ธฐ๋ฅ ์ถ๊ฐ
- [ ] ๋ฒ๊ทธ ์์
- [ ] ์ฝ๋ ๋ฆฌํฉํฐ๋ง
- [ ] ์คํ์ผ ์์
- [ ] ๋ฌธ์ ์
๋ฐ์ดํธ
- [ ] ๊ธฐํ (์ค๋ช
):
## ๐ ๋ณ๊ฒฝ ์ฌํญ ๋ฐ ์ด์
- ๋ณ๊ฒฝ์ฌํญ๊ณผ ์ด์ ๋ฅผ ๊ฐ๋ตํ ์ค๋ช
ํด์ฃผ์ธ์.
## ๐ท ์คํฌ๋ฆฐ์ท (์ต์
)
| Before | After |
|--------|-------|
| | |
## โ
์ฒดํฌ๋ฆฌ์คํธ
- [ ] ์ฝ๋๋ ๊ท์น์ ์ค์ํฉ๋๋ค.
- [ ] ํ
์คํธ๋ฅผ ํต๊ณผํ์ต๋๋ค.
- [ ] ๋ฌธ์๋ฅผ ์
๋ฐ์ดํธํ์ต๋๋ค. (ํ์ํ ๊ฒฝ์ฐ)
- ์ด๋ฐ์์ผ๋ก PRํ ํ๋ฆฟ์ ์ค์ ํฉ๋๋ค. PRํ ํ๋ฆฟ์ github์์ ์๋์ผ๋ก ๋ถ๋ฌ์ค๊ธฐ๋๋ฌธ์ ๋ฐ๋ก ๋ช ๋ น์ด๋ก ์ค์ ํด์ค ํ์๋ ์์ต๋๋ค.
4. ISSUE ํ ํ๋ฆฟ ์ค์
5. ReadMe ์ค์
ํ๋ก์ ํธ ์ด๋ฆ
ํ๋ก์ ํธ์ ๋ํ ๊ฐ๋จํ ์ค๋ช
์ ์์ฑํฉ๋๋ค.
์: ์ด ํ๋ก์ ํธ๋ ___ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์
์
๋๋ค.
๐ ์์ํ๊ธฐ
1. ๋ ํฌ์งํ ๋ฆฌ ํด๋ก
git clone https://github.com/bananana0118/repo-name.git
cd repo-name
2. ํจํค์ง ์ค์น
npm install
3. ๊ฐ๋ฐ ์๋ฒ ์คํ
npm run dev
๐ ํด๋ ๊ตฌ์กฐ
/src
โโโ app # ํ์ด์ง ์ปดํฌ๋ํธ (Next.js app ๋ผ์ฐํ
)
โโโ components # ๊ณตํต UI ์ปดํฌ๋ํธ
โโโ hooks # ์ปค์คํ
ํ
โโโ utils # ์ ํธ๋ฆฌํฐ ํจ์
โโโ styles # ์ ์ญ ์คํ์ผ ์ ์
โโโ store # ์ ์ญ ์ํ ๊ด๋ฆฌ
๐ ์ฌ์ฉ ๊ธฐ์ ์คํ
- Next.js
- TypeScript
- Tailwind CSS
- ESLint / Prettier
๐ ์ปค๋ฐ ์ปจ๋ฒค์
- feat: ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ
- fix: ๋ฒ๊ทธ ์์
- docs: ๋ฌธ์ ๋ณ๊ฒฝ
- style: ์ฝ๋ ์คํ์ผ ๋ณ๊ฒฝ (ํฌ๋งทํ ๋ฑ)
- refactor: ์ฝ๋ ๋ฆฌํฉํฐ๋ง
- test: ํ ์คํธ ์ฝ๋ ์ถ๊ฐ/์์
- chore: ๊ธฐํ ๋ณ๊ฒฝ์ฌํญ
- setting : ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ ๋ฐ ์ค์ ์ถ๊ฐ
# ์์ ์ปค๋ฐ ๋ฉ์์ง
[feat]: ๋ก๊ทธ์ธ ๋ฒํผ UI ๊ตฌํ
- ๋ก๊ทธ์ธ ๋ฒํผ UI๋ฅผ ์ธ๋ถ๊ตฌํ ํ์ต๋๋ค. (์ต์
)
๐ ๋ธ๋์น ์ ๋ต
- main: ๋ฐฐํฌ ๋ธ๋์น
- dev: ๊ฐ๋ฐ ๋ธ๋์น (๊ธฐ๋ฅ ๋ณํฉ ์ ์ฉ)
- feature/์ด๋ฆ: ๊ฐ๋ณ ๊ธฐ๋ฅ ๊ฐ๋ฐ ๋ธ๋์น
PR ๊ท์น
- PR ์ ๋ชฉ: [Feat] ๊ธฐ๋ฅ ์ด๋ฆ, [Fix] ๋ฒ๊ทธ ์ค๋ช ๋ฑ
- PR ์์ฑ ์ ํ ํ๋ฆฟ์ ํ์ฉํด ์์ ๋ด์ฉ ๋ช ํํ ์์ฑ
- ๋ฆฌ๋ทฐ์ด ์ง์ ํ์
- ๋ณธ์ธ PR์ ์ต์ 1๋ช ์ด์ ๋ฆฌ๋ทฐ ํ ๋ณํฉ
๐ ๋ผ์ด์ ์ค
์ด ํ๋ก์ ํธ๋ MIT ๋ผ์ด์ ์ค๋ฅผ ๋ฐ๋ฆ ๋๋ค.
6. husky ์ธํ
- ์ปค๋ฐ๋ฉ์์ง ํ ํ๋ฆฟ์ ์ค์ ํ๋ค์ง๋ง, ์ผ๊ด์ฑ ์์ด ์คํ๊ฐ ๋๊ฑฐ๋ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ปค๋ฐ ๋ฉ์ธ์ง๊ฐ ํ์์ ๋ง๋์ง ๊ฒ์ฌํ๊ณ ์ถ์๋ค.
๐ถ 1) Husky๋ ?
ํ์คํค๋ Git์ ํน์ ์ด๋ฒคํธ(์ปค๋ฐ, ํธ์ ๋ฑ)๊ฐ ์ผ์ด๋ ๋๋ง๋ค ํน์ ์คํฌ๋ฆฝํธ๋ฅผ ์๋์ผ๋ก ์คํํ๋๋ก ๋๊ตฌ์ด๋ค.
- ์ปค๋ฐ ์ ์ (pre-commit) ESLint๋ก ์ฝ๋ ๊ฒ์ฌ
- ์ปค๋ฐ ๋ฉ์์ง๋ฅผ ์์ฑํ ๋ (commit-msg) Commitlint๋ก ์ปค๋ฐ ๋ฉ์์ง ํ์ ๊ฒ์ฌ
- ํธ์ ์ ์ (pre-push) ์๋์ผ๋ก ํ ์คํธ ์คํ
๐ถ 2) ์ฅ์
1. ์ฝ๋ ํ์ง ์ ์ง
- ๋งค๋ฒ ์ปค๋ฐํ ๋๋ง๋ค ์ฝ๋ ํฌ๋งคํ ์ด๋ ๋ฆฐํ ์ ์๋ํํ์ฌ ์ผ๊ด์ฑ ์ ์ง
2. ํด๋จผ ์๋ฌ ๊ฐ์
- ์๋ชป๋ ์ปค๋ฐ ๋ฉ์์ง๋ ์ฝ๋๊ฐ Git ์ ์ฅ์์ ๋ค์ด๊ฐ๋ ๊ฒ์ ์ฌ์ ๋ฐฉ์ง
3. ํ์ ์ ์ฝ๋ ์ปจ๋ฒค์ ํต์ผ
- ๋ชจ๋ ํ์์ด ๋์ผํ ๊ท์น๊ณผ ํ์ง ๊ธฐ์ค์ ์งํค๋๋ก ์๋ํ ๊ฐ๋ฅ
4. ์์ฐ์ฑ ํฅ์
- ๊ฐ๋ฐ์๋ ์ฝ๋ ๋ฆฌ๋ทฐ๋ CI ๊ณผ์ ์์ ์๊ธธ ๋ฌธ์ ๋ฅผ ๋ฏธ๋ฆฌ ๋ฐฉ์งํ๊ณ , ๋ ์ค์ํ ์์ ์ ์ง์ค ๊ฐ๋ฅ
๐ถ3) ์ปค๋ฐ๋ฉ์ธ์ง ํ์ ๊ฐ์ ์ง์ ํ๊ธฐ
#!/bin/sh
npx --no -- commitlint --edit ${1}
$1 : husky์ commit-msg ํ ์์ ์ฌ์ฉ๋๋ git์์ ์ ๊ณต๋๋ ์ธ์์ด๋ค. ์ปค๋ฐ ๋ฉ์์ง๊ฐ ์ ์ฅ๋ ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์๋ฏธํ๋ค.
์ฆ ์ปค๋ฐ์ ์์ฑํ ๋ ์ ๋ ฅํ ๋ฉ์์ง๊ฐ ์ ์ฅ๋ ์์ ํ์ผ์ ๊ฒฝ๋ก๋ค.
๐ถ4) ์ปค๋ฐ๋ฉ์ธ์ง ํ์ ์ปค์คํ ํ๊ธฐ
import type { UserConfig } from "@commitlint/types";
import { RuleConfigSeverity } from "@commitlint/types";
const Configuration: UserConfig = {
extends: ["@commitlint/config-conventional"],
parserPreset:{
parserOpts:{
headerPattern: "^\\[([a-z]+)\\]: (.+)$",
headerCorrespondence: ["type", "subject"],
},
},
formatter: "@commitlint/format",
rules: {
"type-enum": [
RuleConfigSeverity.Error,
"always",
[
"feat", // ๊ธฐ๋ฅ ์ถ๊ฐ
"fix", // ๋ฒ๊ทธ ์์
"docs", // ๋ฌธ์ ์
๋ฐ์ดํธ
"refactor", // ์ฝ๋ ๋ฆฌํฉํ ๋ง
"chore", // ๊ธฐํ ๋ณ๊ฒฝ์ฌํญ
"style", // ์ฝ๋ ์คํ์ผ ๋ณ๊ฒฝ
"test", // ํ
์คํธ ์ฝ๋ ์์ฑ ๋ฐ ์์
"perf", // ์ฑ๋ฅ ๊ฐ์
"setting", // ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ ๋ฐ ์ค์ ์ถ๊ฐ
"ci", // CI/CD ๊ด๋ จ ์์
"build", // ๋น๋ ์์คํ
๋ฐ ์์กด์ฑ ๋ณ๊ฒฝ
"revert", // ์ด์ ์ปค๋ฐ์ผ๋ก ๋๋๋ฆผ
"merge", // ๋ณํฉ ๊ด๋ จ ์์
"hotfix", // ๊ธด๊ธ ์์ ์ฌํญ
"improve", // ์ฝ๋ ๊ฐ์ ๋ฐ ์ต์ ํ
],
],
"subject-max-length": [RuleConfigSeverity.Error, "always", 50],
"header-max-length": [RuleConfigSeverity.Error, "always", 72],
"body-max-line-length": [RuleConfigSeverity.Warning, "always", 72],
"scope-case": [RuleConfigSeverity.Warning, "always", "lower-case"],
"type-case": [RuleConfigSeverity.Error, "always", "lower-case"],
"type-empty": [RuleConfigSeverity.Error, "never"],
"subject-empty": [RuleConfigSeverity.Error, "never"],
},
};
export default Configuration;
- ์ฐ์ ์ธํ ์ ๋ค์ด๊ฐ type๊ฐ์ ๋ ์ถ๊ฐ๋ ์ ์์๊ฒ ๊ฐ์์ ์ถ๊ฐํด๋จ๋ค.
ex) ์ปค๋ฐ๋ฉ์์ง : [feat]: ๋ฒํผ ui ์์
๋ ์ด๋ฐ์์ผ๋ก ํ๊ณ ์ถ์๊ธฐ ๋๋ฌธ์ headerPattern์ ์ ๊ท์์ ์ถ๊ฐํ์ฌ ํ์์ ๋ง์ถฐ์ฃผ์๋ค.
headerPattern์ ์ค์ ํ๋ฉด ๊ผญ headerCorrespondence๋ฅผ ์ค์ ํด์ฃผ์ด์ผ ํ๋๋ฐ, ๊ฐ๊ฐ ๋ค์ด๊ฐ์ผ ํ๋ ๋ณ์์ด๋ฆ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
- ํ๋กฌํํธ๋ฅผ ์ด์ฉํ์ฌ ํด๋จผ์๋ฌ๋ฅผ ์ต์ํ ํ๋ ๋ฐฉ๋ฒ์ด ์์ง๋ง ์ปค๋ฐํ ๋๋ง๋ค ํ๋กฌํํธ ์ํฐ์น๋ฉด์ ํ๋ฉด ๊ท์ฐฎ์ ๊ฒ ๊ฐ์์ ๊ทธ๋ฅ ํจ์คํ๋ค.
ํ
ํ๋ฆฟ์ ์ค์ ํด๋๋ฉด ์ถํ์ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค ๋ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์๊ณ ๊ท์ฐฎ์ ์ค์ ์ ํ ํ์๊ฐ ์๋ค.
๊ทธ๋ ๊ทธ๋ ํ์ํ๊ฒ๋ค์ ์ปค์คํ
ํ ์ ์๋๋ก ์ต๋ํ ๋ฌํํ๊ฒ ํ
ํ๋ฆฟ์ ๋ง๋ค์๋ค.
ํ์คํค๋ก commit lint๋ ์ถ๊ฐํ ์๊ฐ์ด๋ค.
Reference :