# [[Feature-Branch Workflow]] ## πŸ“Œ Brief Summary `Feature-Branch Workflow`λŠ” 메인 브랜치(main/master)λ₯Ό 항상 μ•ˆμ •μ μ΄κ³  배포 κ°€λŠ₯ν•œ μƒνƒœλ‘œ μœ μ§€ν•˜λ©°, μƒˆλ‘œμš΄ κΈ°λŠ₯ 개발 및 버그 μˆ˜μ • λ“±μ˜ λͺ¨λ“  μž‘μ—…μ„ 짧은 수λͺ…을 κ°€μ§„ 독립적인 ν”Όμ²˜ 브랜치(feature branch)μ—μ„œ μˆ˜ν–‰ν•˜λŠ” 버전 관리 ν˜‘μ—… 방식이닀 [1-4]. 개발이 μ™„λ£Œλœ λ³€κ²½ 사항은 ν’€ λ¦¬ν€˜μŠ€νŠΈ(Pull Request)λ₯Ό 톡해 μ½”λ“œ 리뷰와 ν…ŒμŠ€νŠΈλ₯Ό 거친 ν›„ 메인 브랜치둜 λ³‘ν•©λœλ‹€ [5-7]. 이 μ›Œν¬ν”Œλ‘œμš°λŠ” μ†Œκ·œλͺ¨ νŒ€μ— 맀우 μ ν•©ν•˜λ©°, μ½”λ“œ μΆ©λŒμ„ λ°©μ§€ν•˜κ³  ν’ˆμ§ˆμ„ μœ μ§€ν•˜λ©΄μ„œλ„ Git-Flow와 같은 무거운 ν”„λ‘œμ„ΈμŠ€μ˜ μ˜€λ²„ν—€λ“œλ₯Ό ν”Όν•  수 있게 ν•΄μ€€λ‹€ [1, 8, 9]. ## πŸ“– Core Content - **κΈ°λ³Έ ꡬ쑰 및 원칙:** 항상 배포 κ°€λŠ₯ν•œ μƒνƒœμΈ `main` 브랜치λ₯Ό μ€‘μ‹¬μœΌλ‘œ μž‘λ™ν•œλ‹€ [2-4]. κ°œλ°œμžλŠ” μƒˆλ‘œμš΄ μž‘μ—…(κΈ°λŠ₯ μΆ”κ°€, 버그 μˆ˜μ • λ“±)을 μ‹œμž‘ν•  λ•Œλ§ˆλ‹€ `main`μ—μ„œ μƒˆλ‘œμš΄ 브랜치λ₯Ό μƒμ„±ν•˜λ©°, `main` λΈŒλžœμΉ˜μ— 직접 컀밋(Direct push)ν•˜λŠ” 것은 μ—„κ²©νžˆ κΈˆμ§€λœλ‹€ [4, 5, 10]. - **브랜치 λͺ…λͺ… κ·œμΉ™ (Naming Conventions):** 브랜치의 λͺ©μ μ„ λͺ…ν™•νžˆ μ•Œ 수 μžˆλ„λ‘ μ§§κ³  μ„œμˆ μ μΈ 이름을 μ‚¬μš©ν•œλ‹€. ꡬ쑰적 관리λ₯Ό μœ„ν•΄ 접두사(`feature/`, `bugfix/`, `chore/` λ“±)λ₯Ό μ‚¬μš©ν•˜λ©° [6, 11, 12], 좔적성을 높이기 μœ„ν•΄ JIRAλ‚˜ GitHub의 ν‹°μΌ“ IDλ₯Ό ν¬ν•¨ν•˜λŠ” 것이 ꢌμž₯λœλ‹€ (예: `feature/PROJ-123-user-auth`, `bugfix/GH-456-login-fix`) [13, 14]. - **컀밋 및 톡합 (Commits & Merging):** ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ 논리적 λ³€κ²½μ‚¬ν•­λ§Œ μ»€λ°‹ν•˜λŠ” μ›μžμ  컀밋(Atomic Commits)을 μ§€ν–₯ν•˜λ©°, 컀밋을 μž‘κ³  λΉˆλ²ˆν•˜κ²Œ μˆ˜ν–‰ν•œλ‹€ [6, 11, 15]. κΈ°λŠ₯ κ΅¬ν˜„μ΄ μ™„λ£Œλ˜λ©΄ ν’€ λ¦¬ν€˜μŠ€νŠΈ(PR)λ₯Ό μ—΄μ–΄ μ΅œμ†Œ 1λͺ… μ΄μƒμ˜ νŒ€μ›μ—κ²Œ 리뷰λ₯Ό λ°›μ•„μ•Ό ν•˜λ©°, CI ν…ŒμŠ€νŠΈ 톡과 ν›„ λ³‘ν•©ν•œλ‹€ [4-7]. 컀밋 νžˆμŠ€ν† λ¦¬λ₯Ό κΉ”λ”ν•˜κ²Œ μœ μ§€ν•˜κΈ° μœ„ν•΄ 'μŠ€μΏΌμ‹œ 병합(Squash Merge)' 방식을 주둜 μ‚¬μš©ν•˜λ©°, 병합 μ™„λ£Œ ν›„ ν”Όμ²˜ λΈŒλžœμΉ˜λŠ” μ¦‰μ‹œ μ‚­μ œν•œλ‹€ [5, 7, 16]. - **좩돌 λ°©μ§€ (Conflict Prevention):** λŒ€κ·œλͺ¨ 병합 μΆ©λŒμ„ ν”Όν•˜κΈ° μœ„ν•΄ μž‘μ—… 쀑인 ν”Όμ²˜ λΈŒλžœμΉ˜μ— `main` 브랜치의 μ΅œμ‹  λ³€κ²½ 사항을 자주 가져와(pull λ˜λŠ” rebase) λ™κΈ°ν™”ν•˜λ©°, μΆ©λŒμ„ μ μ§„μ μœΌλ‘œ ν•΄κ²°ν•œλ‹€ [7, 8]. - **ν’€ λ¦¬ν€˜μŠ€νŠΈ(PR) 에티켓:** PR은 리뷰가 μš©μ΄ν•˜λ„λ‘ μž‘κ²Œ μœ μ§€ν•΄μ•Ό ν•œλ‹€ (κ°€λŠ₯ν•˜λ©΄ 200쀄 미만). PR λ‚΄μš©μ—λŠ” 무엇이 λ³€κ²½λ˜μ—ˆλŠ”μ§€, μ™œ λ³€κ²½λ˜μ—ˆλŠ”μ§€, 그리고 UI λ³€κ²½ μ‹œ μŠ€ν¬λ¦°μƒ· 등을 ν¬ν•¨ν•˜μ—¬ λ¦¬λ·°μ–΄μ—κ²Œ μΆ©λΆ„ν•œ λ§₯락을 μ œκ³΅ν•΄μ•Ό ν•œλ‹€ [5, 17]. ## βš–οΈ Trade-offs & Caveats - **브랜치 수λͺ… κ΄€λ¦¬μ˜ μ€‘μš”μ„±:** ν”Όμ²˜ λΈŒλžœμΉ˜κ°€ μ˜€λž«λ™μ•ˆ λ³‘ν•©λ˜μ§€ μ•Šκ³  μœ μ§€λ  경우(Long-lived feature branches), 메인 λΈŒλžœμΉ˜μ™€μ˜ μ½”λ“œ 차이가 κΈ°ν•˜κΈ‰μˆ˜μ μœΌλ‘œ 컀져 μ‹¬κ°ν•œ λŒ€κ·œλͺ¨ 병합 좩돌(Merge conflicts)이 λ°œμƒν•  μœ„ν—˜μ΄ μžˆλ‹€ [10, 18]. λ”°λΌμ„œ ν”Όμ²˜ λΈŒλžœμΉ˜λŠ” 단일 논리적 λ³€κ²½μ—λ§Œ μ§‘μ€‘ν•˜μ—¬ 가급적 짧은 수λͺ…(Short-lived)을 μœ μ§€ν•΄μ•Ό ν•œλ‹€ [2, 19, 20]. - **병합 μ „ 절차둜 μΈν•œ 병λͺ© ν˜„μƒ:** 아무리 μž‘κ³  κ°„λ‹¨ν•œ 변경이라도 ν’€ λ¦¬ν€˜μŠ€νŠΈ 생성, λ™λ£Œ 리뷰, CI/CD 체크λ₯Ό 거쳐야 ν•œλ‹€ [10, 11]. μ΄λŠ” μ½”λ“œ ν’ˆμ§ˆμ„ 보μž₯ν•˜μ§€λ§Œ, μ•„μ£Ό μ‚¬μ†Œν•œ μˆ˜μ •μ‘°μ°¨λ„ 즉각적인 적용이 μ§€μ—°λ˜λŠ” 병λͺ©μ΄ 될 수 μžˆλ‹€ (νŒ€μ— 따라 μ‚¬μ†Œν•œ μˆ˜μ •μ€ `main`에 직접 μ»€λ°‹ν•˜λŠ” μ˜ˆμ™Έλ₯Ό 두기도 ν•œλ‹€ [8]). - **λ³΅μž‘ν•œ 릴리슀 κ΄€λ¦¬μ˜ ν•œκ³„:** μ—¬λŸ¬ κΈ°λŠ₯이 ν•˜λ‚˜λ‘œ λ¬Άμ—¬ νŠΉμ • μŠ€μΌ€μ€„μ— 따라 λ°°ν¬λ˜μ–΄μ•Ό ν•˜λŠ” λŒ€κ·œλͺ¨ ν”„λ‘œμ νŠΈμ˜ 경우, `main` 브랜치 ν•˜λ‚˜λ§Œ μš΄μ˜ν•˜λŠ” λ‹¨μˆœ ν”Όμ²˜ 브랜치 μ›Œν¬ν”Œλ‘œμš°λŠ” 관리가 μ–΄λ €μšΈ 수 μžˆλ‹€. 이 경우 Git-Flow 같은 더 무거운 ꡬ쑰가 μš”κ΅¬λœλ‹€ [9]. ## πŸ”— Knowledge Connections ### Related Concepts #### [버전 관리 / 톡합 μ•„ν‚€ν…μ²˜] - [[Pull Request (PR)]] - μ—°κ²° 이유: ν”Όμ²˜ λΈŒλžœμΉ˜μ—μ„œμ˜ μž‘μ—…λ¬Όμ„ 메인 브랜치둜 λ³‘ν•©ν•˜κΈ° μ „, μ½”λ“œ 리뷰와 μžλ™ν™”λœ ν…ŒμŠ€νŠΈλ₯Ό μ§„ν–‰ν•˜λŠ” 핡심 관문이닀 [6, 11]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: νŒ€ λ‚΄ ν”Όλ“œλ°± 루프 μž‘λ™ 방식, μ½”λ“œ ν’ˆμ§ˆ μœ μ§€ λ§€μ»€λ‹ˆμ¦˜, 그리고 μ•ˆμ „ν•œ μ½”λ“œ 톡합 절차. - [[Squash Merge]] - μ—°κ²° 이유: ν”Όμ²˜ λΈŒλžœμΉ˜μ—μ„œ λ°œμƒν•œ μ—¬λŸ¬ 개의 μžμž˜ν•œ 컀밋을 ν•˜λ‚˜μ˜ 의미 μžˆλŠ” μ»€λ°‹μœΌλ‘œ μ••μΆ•ν•˜μ—¬ 메인 λΈŒλžœμΉ˜μ— λ³‘ν•©ν•˜λŠ” μ „λž΅μ΄λ‹€ [5, 7]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: 메인 브랜치의 κΉƒ νžˆμŠ€ν† λ¦¬(Git history)λ₯Ό κΉ”λ”ν•˜κ³  가독성 λ†’κ²Œ μœ μ§€ν•˜λŠ” 원리. - [[Continuous Integration (CI)]] - μ—°κ²° 이유: PR이 μƒμ„±λ˜μ—ˆμ„ λ•Œ 메인 λΈŒλžœμΉ˜μ— λ³‘ν•©λ˜κΈ° μ „ μžλ™ν™”λœ ν…ŒμŠ€νŠΈ(예: λ¦°νŒ…, λΉŒλ“œ 검증)λ₯Ό μˆ˜ν–‰ν•˜μ—¬ μ½”λ“œκ°€ μ•ˆμ „ν•œμ§€ ν™•μΈν•˜λŠ” λ°©μ–΄ μ‹œμŠ€ν…œμ΄λ‹€ [4, 5]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: `main` 브랜치의 μƒνƒœλ₯Ό '항상 배포 κ°€λŠ₯(Always stable)'ν•˜κ²Œ μœ μ§€ν•˜λŠ” 기술적 보μž₯ 방법. #### [개발 방법둠 / κ·œμ•½] - [[Ticket IDs Traceability]] - μ—°κ²° 이유: 브랜치 이름과 컀밋 λ©”μ‹œμ§€μ— JIRAλ‚˜ GitHub Issues와 같은 ν‹°μΌ“ ID(예: PROJ-123)λ₯Ό ν¬ν•¨μ‹œμΌœ μ½”λ“œ λ³€κ²½ 사항을 λΉ„μ¦ˆλ‹ˆμŠ€ μš”κ΅¬μ‚¬ν•­κ³Ό μ§μ ‘μ μœΌλ‘œ μ—°κ²°ν•œλ‹€ [13, 16]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: μ½”λ“œ λ³€κ²½μ˜ λ°°κ²½ νŒŒμ•…, λ¦¬λ·°μ–΄μ˜ λ§₯락 이해 지원, μš”κ΅¬μ‚¬ν•­ κ΅¬ν˜„ 좔적성 확보. - [[Conventional Commits]] - μ—°κ²° 이유: `feat:`, `fix:`, `chore:` λ“± ν‘œμ€€ν™”λœ ν˜•μ‹μ„ μ‚¬μš©ν•˜μ—¬ 컀밋 λ©”μ‹œμ§€λ₯Ό μž‘μ„±ν•˜λŠ” κ·œμΉ™μœΌλ‘œ, ν”Όμ²˜ 브랜치의 λ³€κ²½ 내역을 일관성 있게 μ†Œν†΅ν•œλ‹€ [6, 17, 21]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: 컀밋 νžˆμŠ€ν† λ¦¬μ˜ 가독성 ν–₯상 및 μžλ™ν™”λœ 릴리슀 λ…ΈνŠΈ μƒμ„±μ˜ 기반. ### Deeper Research Questions - λŒ€κ·œλͺ¨ 병합 μΆ©λŒμ„ ν”Όν•˜κΈ° μœ„ν•΄, ν”Όμ²˜ 브랜치 μ›Œν¬ν”Œλ‘œμš° λ‚΄μ—μ„œ 브랜치의 수λͺ…(Lifetime)을 기술적/절차적으둜 짧게 κ°•μ œν•˜λ €λ©΄ μ–΄λ–€ 방법듀을 μ μš©ν•  수 μžˆλŠ”κ°€? - λ‹¨μˆœν•œ ν”Όμ²˜ 브랜치 μ›Œν¬ν”Œλ‘œμš°λ₯Ό μ‚¬μš©ν•˜λ‹€κ°€, νŒ€ 규λͺ¨κ°€ 컀지고 μŠ€μΌ€μ€„λ§λœ μ •κΈ° λ¦΄λ¦¬μŠ€κ°€ ν•„μš”ν•΄μ§ˆ λ•Œ Git-Flow λ“±μœΌλ‘œμ˜ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ μ–΄λ–»κ²Œ μ μ§„μ μœΌλ‘œ μˆ˜ν–‰ν•  수 μžˆλŠ”κ°€? - 둜컬 ν”Όμ²˜ λΈŒλžœμΉ˜μ—μ„œ `main` 브랜치의 μ΅œμ‹  λ³€κ²½ 사항을 동기화할 λ•Œ, `git merge main`κ³Ό `git rebase main`을 μ‚¬μš©ν•˜λŠ” κ²ƒμ˜ μ‹€μ§ˆμ μΈ μž₯단점 및 ꢌμž₯ μ‚¬λ‘€λŠ” 무엇인가? - μ›μžμ  컀밋(Atomic Commits) κ·œμΉ™μ„ 개발 νŒ€ λ‚΄μ—μ„œ 효과적으둜 μ •μ°©μ‹œν‚€κΈ° μœ„ν•΄ μ½”λ“œ 리뷰 κ³Όμ •μ΄λ‚˜ CI λ„κ΅¬μ—μ„œ μ–΄λ–€ 검증 기쀀을 μ„ΈμšΈ 수 μžˆλŠ”κ°€? - κΈ΄κΈ‰ν•˜κ²Œ ν”„λ‘œλ•μ…˜ ν™˜κ²½μ˜ 버그(Hotfix)λ₯Ό μˆ˜μ •ν•΄μ•Ό ν•  경우, ν”Όμ²˜ 브랜치 μ›Œν¬ν”Œλ‘œμš° λ‚΄μ—μ„œ `main`의 μ•ˆμ •μ„±μ„ ν•΄μΉ˜μ§€ μ•ŠμœΌλ©΄μ„œ κ°€μž₯ λΉ λ₯΄κ³  μ•ˆμ „ν•˜κ²Œ λ°°ν¬ν•˜λŠ” 흐름은 무엇인가? ### Practical Application Contexts - **Implementation:** GitHub λ ˆν¬μ§€ν† λ¦¬ μ„€μ •μ—μ„œ `main` λΈŒλžœμΉ˜μ— 직접 컀밋을 λ§‰λŠ” 보호 κΈ°λŠ₯(Branch protection)을 ν™œμ„±ν™”ν•˜κ³ , μ΅œμ†Œ 1λͺ…μ˜ 리뷰와 CI 톡과λ₯Ό ν•„μˆ˜λ‘œ μ„€μ •ν•˜μ—¬ ν”„λ‘œμ„ΈμŠ€λ₯Ό κ°•μ œν•œλ‹€ [5]. 브랜치 이름은 `{type}/{ticket-id}-{description}` ν˜•μ‹μ„ μ‚¬μš©ν•œλ‹€ [14]. - **System Design:** λ³€κ²½λœ UI μ½”λ“œκ°€ μ‹œμŠ€ν…œ λ””μžμΈμ— μ•…μ˜ν–₯을 μ£Όμ§€ μ•Šλ„λ‘, PR 리뷰 λ‹¨κ³„μ—μ„œ Storybook 및 Chromaticκ³Ό 같은 μ‹œκ°μ  νšŒκ·€ ν…ŒμŠ€νŠΈ(Visual regression testing) 도ꡬλ₯Ό μ—°λ™ν•˜μ—¬ 검증을 μžλ™ν™”ν•œλ‹€ [22]. - **Operation / Maintenance:** λ¬Έμ œκ°€ λ°œμƒν–ˆμ„ λ•Œ 문제의 원인이 λ˜λŠ” 컀밋을 λ‘€λ°±(Revert)ν•˜κ±°λ‚˜ μΆ”μ ν•˜κΈ° 쉽도둝, Squash Merge μ˜΅μ…˜λ§Œμ„ ν—ˆμš©ν•˜μ—¬ 컀밋 λ‹¨μœ„λ₯Ό κΈ°λŠ₯λ³„λ‘œ μ •λ¦¬ν•˜κ³  λ³‘ν•©λœ λΈŒλžœμΉ˜λŠ” μžλ™ μ‚­μ œ(Auto-delete) μ˜΅μ…˜μ„ μΌœλ‘”λ‹€ [5, 7, 11]. - **Learning Path:** 2~5인 규λͺ¨μ˜ μ†Œκ·œλͺ¨ 학생 νŒ€μ΄λ‚˜ μŠ€νƒ€νŠΈμ—… ν”„λ‘œμ νŠΈμ—μ„œ 버전 관리λ₯Ό μ‹œμž‘ν•  λ•Œ κ°€μž₯ λ¨Όμ € λ„μž…ν•˜μ—¬ Git ν˜‘μ—…μ˜ 기초(브랜치 생성, 컀밋, PR, 리뷰, λ¨Έμ§€)λ₯Ό ν•™μŠ΅ν•˜λŠ” μš©λ„λ‘œ μ ν•©ν•˜λ‹€ [3, 9]. - **My Project Relevance:** νŒ€μ›λ“€μ΄ κ²ΉμΉ˜λŠ” νŒŒμΌμ„ μˆ˜μ •ν•˜λ‹€ μ½”λ“œκ°€ μœ μ‹€λ˜λŠ” 것을 막고, PR을 ν†΅ν•œ μ½”λ“œ 리뷰 λ¬Έν™” μ •μ°©μœΌλ‘œ 전체적인 μ½”λ“œ ν’ˆμ§ˆκ³Ό νŒ€μ›μ˜ 이해도λ₯Ό 상ν–₯ ν‰μ€€ν™”ν•˜λŠ” κΈ°λ³Έ ν˜‘μ—… λͺ¨λΈλ‘œ λ„μž…ν•  수 μžˆλ‹€. ### Adjacent Topics - [[Trunk-Based Development]] - ν™•μž₯ λ°©ν–₯: ν”Όμ²˜ 브랜치의 수λͺ…을 수 μ‹œκ°„ μ΄λ‚΄λ‘œ κ·Ήλ‹¨μ μœΌλ‘œ 쀄이고, 메인 브랜치(Trunk)둜 μ•„μ£Ό λΉˆλ²ˆν•˜κ²Œ λ³‘ν•©ν•˜λŠ” 방식이닀 [9]. κ°•λ ₯ν•œ CI와 κΈ°λŠ₯ ν† κΈ€(Feature flags)이 λ’·λ°›μΉ¨λ˜λŠ” μ‹œλ‹ˆμ–΄ νŒ€μ„ μœ„ν•œ 심화 ν˜‘μ—… μ›Œν¬ν”Œλ‘œμš°λ‘œ 비ꡐ ν•™μŠ΅ν•  수 μžˆλ‹€ [9, 20]. - [[Git-Flow]] - ν™•μž₯ λ°©ν–₯: `develop`, `release`, `hotfix` λ“± 더 λ³΅μž‘ν•˜κ³  λΆ„λ¦¬λœ 브랜치 계측을 κ°€μ§€λŠ” μ „λž΅μ΄λ‹€ [9]. μ†Œκ·œλͺ¨ νŒ€μ˜ λ‹¨μˆœν•œ ν”Όμ²˜ 브랜치 μ›Œν¬ν”Œλ‘œμš°κ°€ λŒ€κ·œλͺ¨ μ—”ν„°ν”„λΌμ΄μ¦ˆ ν™˜κ²½ 및 μ •κΈ° 배포 ν™˜κ²½μœΌλ‘œ ν™•μž₯될 λ•Œ μ–΄λ–»κ²Œ λ³€λͺ¨ν•˜λŠ”μ§€ ν•™μŠ΅ν•  수 μžˆλ‹€ [9, 23]. --- *Last updated: 2026-04-30*