# 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" }
먼저 Priority
라벨은 필수적으로 설정해야합니다.
또한 팀원들은 Priority: High 🔥
PR이 올라왔다는 알림을 받으면 하던 작업을 최대한 빠르게 끝마치고, 해당 PR에 대한 리뷰를 진행해야합니다.
브랜치에 따라 Feature
Improve UX
Refactor
Merge
Epic
Bug
등의 타입을 꼭 지정해주세요
husky는 local git hook 사용을 도와주는 라이브러리입니다. 현재 프로젝트에는 크게 2가지 규직이 존재합니다.
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.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
등이 설치되어 있습니다.
사용하지 않으셔도 좋지만 대부분 현업에서 굉장히 많이, 표준적으로 사용하는 셋업들이니 사용하시는 방향을 좀 더 추천드립니다.