Skip to content

Latest commit

ย 

History

History
137 lines (97 loc) ยท 7.13 KB

File metadata and controls

137 lines (97 loc) ยท 7.13 KB
# NPM์„ ์‚ฌ์šฉํ•˜๊ณ  node ๋ฒ„์ „์€ 20.15.0๋กœ ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค.

`nvm`์„ ํ™œ์šฉํ•ด๋ณด์„ธ์š”!

# Branch Convention

ํ•ต์‹ฌ์ด๋˜๋Š” `develop` , `main`, `epic/*` ๋ธŒ๋žœ์น˜ ๋“ฑ์—๋Š” ์ง์ ‘์ ์œผ๋กœ commit, push๋“ฑ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
(local husky, repository branch setting ๋“ฑ ์—์„œ ์œ„ ํ–‰๋™์„ ํ•  ์ˆ˜ ์—†๊ฒŒ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค.)

> `main` , `master`, `develop`, `feat/*`, `hotfix/*`, `epic/*`, `setting/*`, `fix/*`, `refactor/*` ๋ธŒ๋žœ์น˜๋“ค์˜ PR์ด ์˜คํ”ˆ๋˜๋ฉด build ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ๋นŒ๋“œ์‹คํŒจ ์‹œ PR์„ ๋จธ์ง€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

## main / develop
์œ„ ๋ธŒ๋žœ์น˜๋“ค์—๊ฒŒ ๋จธ์ง€๋ฅผ ์ง„ํ–‰ํ• ๋•Œ๋Š” ๊น”๋”ํ•œ Git ์ด๋ ฅ์„ ์œ„ํ•ด ๊ผญ squash merge๊ฐ€ ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
(PR์—์„œ ๋จธ์ง€๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ธฐ ์ „์— ํ•œ๋ฒˆ๋” ํ™•์ธํ•˜๊ธฐ)

## epic
epic ๋ธŒ๋žœ์น˜๋Š” ํฐ ๊ฐˆ๋ž˜์˜ ์—…๋ฌด ํƒœ์Šคํฌ๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค. ex) 00 page ์ž‘์—… / ํ”„๋กœ์ ํŠธ ์ „๋ฐ˜์— ๊ฑธ์นœ ๊ณตํ†ต ์ž‘์—… (๊ณต์šฉ ์ปดํฌ๋„ŒํŠธ, ๊ณต์šฉ api ์ปจํŠธ๋กค๋Ÿฌ ๋“ฑ)

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— epic๋ธŒ๋žœ์น˜์—์„œ ์ง์ ‘์ ์œผ๋กœ ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๊ธฐ๋ณด๋‹ค๋Š” epic๋ธŒ๋žœ์น˜์—์„œ `feat/` feature ๋ธŒ๋žœ์น˜, `refactor/` ๋ฆฌํŒฉํ† ๋ง ๋ธŒ๋žœ์น˜ ๋“ฑ์„ ๋งŒ๋“ค์–ด์„œ ์ž‘์—…์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

**`epic/` ๋ธŒ๋žœ์น˜์—๋Š” ์ง์ ‘์ ์œผ๋กœ commit, push๋“ฑ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.**

## feat
feature ๋ธŒ๋žœ์น˜๋Š” ์ž‘์€ ๊ฐˆ๋ž˜์˜ ์—…๋ฌด ํƒœ์Šคํฌ๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค. ex) 00 page์˜ ํŠน์ • ์ปดํฌ๋„ŒํŠธ ์ž‘์—… / 00 page์˜ ํŠน์ • ๋ชจ๋“ˆ ์ž‘์—… / ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ ์ค‘ 00 ์ปดํฌ๋„ŒํŠธ ์ž‘์—… ๋“ฑ

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— feature๋ธŒ๋žœ์น˜๋Š” ๋ช…ํ™•ํžˆ ๋ธŒ๋žœ์น˜์˜ ๋ชฉ์ ์— ๋งž๋Š” ์ž‘์—…๋งŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ์‚ฌ์ด์ฆˆ๋Š” ์ž‘์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค
(ํŒ€์›๋“ค์ด ๋ถ€๋‹ด์—†์ด ๋ฆฌ๋ทฐํ•  ์ˆ˜ ์žˆ๊ฒŒ)
>๊ถŒ์žฅ๋˜๋Š” ์‚ฌ์ด์ฆˆ๋Š” file changes ๊ธฐ์ค€์œผ๋กœ 10๊ฐœ ๋ฏธ๋งŒ์˜ ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

## merge
์œ„ ๋ธŒ๋žœ์น˜ ์ปจ๋ฒค์…˜์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋ฉด `epic`๋ธŒ๋žœ์น˜๋Š” ์ƒ์„ฑ๋œ ์‹œ์ ์—์„œ๋ถ€ํ„ฐ ๊ฝค๋‚˜ ์˜ค๋žœ์‹œ๊ฐ„๋™์•ˆ ์‚ด์•„์žˆ๋Š” ๋ธŒ๋žœ์น˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
์ด๋Š” `epic`๋ธŒ๋žœ์น˜๋ฅผ `develop`์— ๋จธ์ง€ํ•  ๋•Œ conflict๊ฐ€ ๋‚  ๊ฐ€๋Šฅ์„ฑ๋„ ๊ทธ๋งŒํผ ๋†’๋‹ค๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. 
๋•Œ๋ฌธ์— ๊ทธ๋Ÿฌํ•œ ๋ณ‘ํ•ฉ ์œ„ํ—˜์†์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณ‘ํ•ฉ์„ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด **`merge/*`** ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜๋Š”๊ฑธ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค. 

1. `merge/` ๋ธŒ๋žœ์น˜  ๋Š” `epic/` ๋ธŒ๋žœ์น˜๋กœ ๋ถ€ํ„ฐ ์ƒ์„ฑํ•˜๋ฉฐ ์ƒ์„ฑํ•œ ์ฆ‰์‹œ `develop`์„ pull๋ฐ›์Šต๋‹ˆ๋‹ค.
    > epic/main-page -> merge/main-page ์ƒ์„ฑ

    > merge/main-page ๋ธŒ๋žœ์น˜๋กœ ์ด๋™ํ•˜๊ณ  `develop` ๋ธŒ๋žœ์น˜๋ฅผ pull ๋ฐ›๊ธฐ
2. `develop`์„ pull ๋ฐ›๋Š” ์ˆœ๊ฐ„ `merge/` ๋ธŒ๋žœ์น˜๋Š” `epic/`์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ๊ณผ `develop`์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ํ•จ๊ป˜ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
3. ๋†’์€ ํ™•๋ฅ ๋กœ conflict๊ฐ€ ๋ฐœ์ƒํ• ํƒœ๋‹ˆ ์ž˜ ํ•ด๊ฒฐํ•ด์ฃผ์„ธ์š”
4. conflict๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๋‚˜๋ฉด `merge/` ๋ธŒ๋žœ์น˜๋ฅผ `epic/` ๋ธŒ๋žœ์น˜์— mergeํ•  ์ˆ˜ ์žˆ๊ฒŒ PR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    > merge/main-page -> epic/main-page PR ์ƒ์„ฑ

    > epic/main-page ์—  merge/main-page ๋ณ‘ํ•ฉ
5. PR์„ ๋จธ์ง€ํ•˜๊ณ  ๋‚˜๋ฉด `develop`๋ธŒ๋žœ์น˜์— ๋‹ค๋ฅธ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด push๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” `epic/`๋Š” `develop` ๋ธŒ๋žœ์น˜์— ์•ˆ์ „ํ•˜๊ฒŒ mergeํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
6.  `epic/` ๋ธŒ๋žœ์น˜๋ฅผ `develop/` ๋ธŒ๋žœ์น˜์— mergeํ•  ์ˆ˜ ์žˆ๋Š” PR์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
7. PR์—์„œ conflict๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๊ฒƒ์ด ํ™•์ธ๋˜๋ฉด ํ•ด๋‹น PR์„ ๋จธ์ง€์‹œํ‚ต๋‹ˆ๋‹ค.

## ์ฃผ์˜์‚ฌํ•ญ
์œ„์—์„œ ์ •์˜ํ•œ `main` , `master`, `develop`, `feat/*`, `hotfix/*`, `epic/*`, `setting/*`, `fix/*`, `refactor/` ๋ธŒ๋žœ์น˜ ์™ธ์— ๋‹ค๋ฅธ ํ˜•์‹์˜ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ์„ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค.


# PR
๋ชจ๋“  ๋ธŒ๋žœ์น˜์˜ ๋ณ‘ํ•ฉ๊ณผ์ •์—์„  PR์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
PR๋ฅผ ๋ณ‘ํ•ฉํ•˜๋Š”๋ฐ์—๋Š” ๋ช‡๊ฐ€์ง€ ๊ทœ์น™์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
1. PR์ด ์˜ฌ๋ผ์˜ฌ ์‹œ build test๋ฅผ ์ง„ํ–‰ํ•จ. `build`๊ฐ€ ์‹คํŒจํ•œ๋‹ค๋ฉด PR์„ ๋จธ์ง€ ํ•  ์ˆ˜ ์—†์Œ
2. PR์€ ๋ฌด์กฐ๊ฑด 1๋ช… ์ด์ƒ์˜ reviwer์—๊ฒŒ `approve`๋ฅผ ๋ฐ›์•„์•ผํ•จ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด PR์„ ๋จธ์ง€ ํ•  ์ˆ˜ ์—†์Œ
3. PR์—๋Š” ๊ผญ label์„ ๋ถ™ํ˜€์•ผ ํ•จ
4. PR์€ Assignee ๋ฐ Reviewer ์ง€์ •์ด ํ•„์ˆ˜์ž„
5. PR์˜ ์ œ๋ชฉ์€ `[Epic] OO` ์—ํ”ฝ, `[Feat] OO` ํ”ผ์ณ, `[Fix] OO` ๋ฒ„๊ทธ ์ˆ˜์ •, `[Refactor] OO` ๊ฐœ์„  ์™€ ๊ฐ™์€ convention์„ ๊ผญ ์ง€์ผœ์•ผ ํ•จ


## Label
ํ˜„์žฌ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  `label`์„ ์‚ญ์ œํ•˜๊ณ  
์•„๋ž˜์˜ Label๋กœ ์„ธํŒ…ํ•˜๋Š”๊ฑธ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. 

### Label ๋ชฉ๋ก
```tsx
{ name: "Priority: High ๐Ÿ”ฅ", description: '์šฐ์„ ์ˆœ์œ„ ๋†’์Œ', color: "F9D0C4" },
{ name: "Priority: Low ๐Ÿข", description: '์šฐ์„ ์ˆœ์œ„ ๋‚ฎ์Œ', color: "C2E0C6" },
{ name: "Priority: Medium :bookmark:", description: '์šฐ์„ ์ˆœ์œ„ ๋ณดํ†ต', color: "FEF2C0" },
{ name: "Type: Doc :memo:", description: '๋ฌธ์„œ ์ถ”๊ฐ€ / ์ˆ˜์ •', color: "0075ca" },
{ name: "Type: Bug :bug:", description: '๋ฒ„๊ทธ', color: "d73a4a" },
{ name: "Type: Epic :rocket:", description: 'ํฐ ๋‹จ์œ„์˜ ๋ธŒ๋žœ์น˜', color: "051C35" },
{ name: "Type: Feature :sparkles:", description: '์‹ ๊ทœ ๊ธฐ๋Šฅ', color: "AB5D19" },
{ name: "Type: Improve UX :arrow_up:", description: 'UX ๊ฐœ์„ ', color: "2CE151" },
{ name: "Type: Merge :truck:", description: '๋จธ์ง€', color: "4A7A8F" },
{ name: "Type: Refactor :recycle:", description: '๋ฆฌํŒฉํ† ๋ง', color: "027B6B" }

Label ์‚ฌ์šฉ๋ฒ•

๋จผ์ € Priority ๋ผ๋ฒจ์€ ํ•„์ˆ˜์ ์œผ๋กœ ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํŒ€์›๋“ค์€ Priority: High ๐Ÿ”ฅ PR์ด ์˜ฌ๋ผ์™”๋‹ค๋Š” ์•Œ๋ฆผ์„ ๋ฐ›์œผ๋ฉด ํ•˜๋˜ ์ž‘์—…์„ ์ตœ๋Œ€ํ•œ ๋น ๋ฅด๊ฒŒ ๋๋งˆ์น˜๊ณ , ํ•ด๋‹น PR์— ๋Œ€ํ•œ ๋ฆฌ๋ทฐ๋ฅผ ์ง„ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ธŒ๋žœ์น˜์— ๋”ฐ๋ผ Feature Improve UX Refactor Merge Epic Bug๋“ฑ์˜ ํƒ€์ž…์„ ๊ผญ ์ง€์ •ํ•ด์ฃผ์„ธ์š”

Husky

husky๋Š” local git hook ์‚ฌ์šฉ์„ ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—๋Š” ํฌ๊ฒŒ 2๊ฐ€์ง€ ๊ทœ์ง์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

pre-commit

pre-commit.yaml ํŒŒ์ผ์€ commit์„ ๋‚จ๊ธฐ๊ธฐ ์ „ scipt๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” npm run lint ๋ฅผ ํ†ตํ•ด lint๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ณ  ๋งŒ์•ฝ ์‹คํŒจ ์‹œ commit์ด ๋‚จ์ง€ ๋ชปํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ

current_branch=$(git branch --show-current)

restricted_branches="^(main|master|develop|epic/.+)$"

if [[ $current_branch =~ $restricted_branches ]]; then
  echo ":construction: You are on a restricted branch: $current_branch."
  echo "Commits to this branch are not allowed via pre-commit hook."
  exit 1
fi

์„ ํ†ตํ•ด main|master|develop|epic/ ๋ธŒ๋žœ์น˜์—์„œ์˜ commit์„ ํƒ์ง€ํ•˜๊ณ , ํ•ด๋‹น ๋ธŒ๋žœ์น˜์—์„  commit์„ ๋‚จ๊ธธ ์ˆ˜ ์—†๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

pre-push

pre-push.yaml ํŒŒ์ผ์€ pushํ•˜๊ธฐ ์ „ scipt๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

current_branch=$(git branch --show-current)

restricted_branches="^(main|master|develop|epic/.+)$"

if [[ $current_branch =~ $restricted_branches ]]; then
  echo ":construction: You are on a restricted branch: $current_branch."
  echo "Commits to this branch are not allowed via pre-commit hook."
  exit 1
fi

์„ ํ†ตํ•ด main|master|develop|epic/ ๋ธŒ๋žœ์น˜์—์„œ์˜ push๋ฅผ ํƒ์ง€ํ•˜๊ณ , ํ•ด๋‹น ๋ธŒ๋žœ์น˜์—์„  push๋ฅผ ํ•  ์ˆ˜ ์—†๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์„ธํŒ…๋˜์–ด์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค

ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋Š” Next.js page router, Tanstack Query, query-key-factory, axios, qs, react-hook-form, zod, tailwind, typescript ๋“ฑ์ด ์„ค์น˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ์…”๋„ ์ข‹์ง€๋งŒ ๋Œ€๋ถ€๋ถ„ ํ˜„์—…์—์„œ ๊ต‰์žฅํžˆ ๋งŽ์ด, ํ‘œ์ค€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์…‹์—…๋“ค์ด๋‹ˆ ์‚ฌ์šฉํ•˜์‹œ๋Š” ๋ฐฉํ–ฅ์„ ์ข€ ๋” ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.