# [[Branching Strategies|Branching Strategies]] ## πŸ“Œ Brief μ†ŒSummary Branching Strategies(브랜칭 μ „λž΅)λŠ” μ†Œν”„νŠΈμ›¨μ–΄ 개발 κ³Όμ •μ—μ„œ μ½”λ“œ λ³€κ²½ 사항을 κ΄€λ¦¬ν•˜κ³  νŒ€μ› κ°„μ˜ ν˜‘μ—…μ„ μ‘°μœ¨ν•˜κΈ° μœ„ν•΄ 버전 관리 μ‹œμŠ€ν…œ(Git λ“±)μ—μ„œ 브랜치λ₯Ό 생성, 병합, μœ μ§€λ³΄μˆ˜ν•˜λŠ” κ·œμΉ™κ³Ό μ›Œν¬ν”Œλ‘œμš°λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. νŒ€μ˜ 규λͺ¨μ™€ ν”„λ‘œμ νŠΈ μš”κ΅¬μ‚¬ν•­μ— 따라 Git Flow, GitHub Flow, Trunk-Based Development, Feature Branch Workflow λ“± λ‹€μ–‘ν•œ μ „λž΅μ΄ μ‚¬μš©λ©λ‹ˆλ‹€. λͺ…ν™•ν•œ 브랜칭 μ „λž΅μ˜ λ„μž…μ€ 메인 μ½”λ“œλ² μ΄μŠ€μ˜ μ•ˆμ •μ„±μ„ 보μž₯ν•˜κ³  병합 μΆ©λŒμ„ λ°©μ§€ν•˜λ©° μ½”λ“œ 리뷰와 좔적성을 κ°•ν™”ν•˜λŠ” 핡심 역할을 ν•©λ‹ˆλ‹€ [1-3]. ## πŸ“– Core Content * **μ£Όμš” 브랜칭 μ „λž΅ μœ ν˜•** * **Feature Branch Workflow (κΈ°λŠ₯ 브랜치 μ›Œν¬ν”Œλ‘œμš°):** 2~5λͺ… 규λͺ¨μ˜ μ†Œκ·œλͺ¨ νŒ€μ— κ°€μž₯ 초보자 μΉœν™”μ μ΄κ³  좩돌이 적은 μ›Œν¬ν”Œλ‘œμš°μž…λ‹ˆλ‹€ [4]. `main` λΈŒλžœμΉ˜λŠ” 항상 μ•ˆμ •μ μ΄κ³  배포 κ°€λŠ₯ν•œ μƒνƒœλ₯Ό μœ μ§€ν•˜λ©°, μƒˆλ‘œμš΄ κΈ°λŠ₯μ΄λ‚˜ 버그 μˆ˜μ • μ‹œ `main`μ—μ„œ νŒŒμƒλœ 짧은 수λͺ…μ˜ 브랜치λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€ [5]. 개발 μ™„λ£Œ ν›„ Pull Request(PR)λ₯Ό μ—΄κ³  μ΅œμ†Œ 1λͺ… μ΄μƒμ˜ λ™λ£Œ 리뷰와 ν…ŒμŠ€νŠΈλ₯Ό 거친 ν›„ Squash Merge λ°©μ‹μœΌλ‘œ λ³‘ν•©ν•©λ‹ˆλ‹€ [6, 7]. * **Trunk-Based Development (트렁크 기반 개발):** κ°•λ ₯ν•œ CI(지속적 톡합) ν™˜κ²½μ„ κ°–μΆ˜ μˆ™λ ¨λœ νŒ€μ— μ ν•©ν•œ κ°€λ²Όμš΄ λ°©μ‹μž…λ‹ˆλ‹€ [8, 9]. 수λͺ…이 맀우 짧은 κΈ°λŠ₯ 브랜치λ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ 메인 λΈŒλžœμΉ˜μ— μž‘μ€ λ³€κ²½ 사항을 자주 μ»€λ°‹ν•©λ‹ˆλ‹€. μ˜€λ²„ν—€λ“œκ°€ μ΅œμ†Œν™”λ˜κ³  ν”Όλ“œλ°±μ΄ λΉ λ₯΄λ©° λŒ€κ·œλͺ¨ 병합 μΆ©λŒμ„ ν”Όν•  수 μžˆμŠ΅λ‹ˆλ‹€ [8, 10]. * **Git Flow:** 정기적인 릴리슀 일정을 κ°€μ§„ λŒ€κ·œλͺ¨ ν”„λ‘œμ νŠΈμ— μœ μš©ν•©λ‹ˆλ‹€ [9]. ν•˜μ§€λ§Œ κΈ°λŠ₯ 브랜치 외에도 `develop`, `release` λ“± 관리해야 ν•  λΈŒλžœμΉ˜κ°€ λ§Žμ•„ μ†Œκ·œλͺ¨ νŒ€μ—κ²ŒλŠ” 무겁고 κ³Όλ„ν•œ λ³΅μž‘μ„±μ„ μœ λ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€ [9, 11, 12]. * **GitHub Flow:** `main` 브랜치둜 κΈ°λŠ₯ 브랜치λ₯Ό 직접 λ³‘ν•©ν•˜λŠ” λ‹¨μˆœν™”λœ ꡬ쑰둜, Git Flow보닀 λΉ λ₯΄κ³  지속적인 배포 ν™˜κ²½μ— μ ν•©ν•©λ‹ˆλ‹€ [11, 13]. * **λͺ¨λ“  μ „λž΅μ— μ μš©λ˜λŠ” λͺ¨λ²” 사둀 (Best Practices)** * **ν‹°μΌ“ ID 및 λͺ…λͺ… κ·œμΉ™ μ‚¬μš©:** 브랜치 이름과 컀밋 λ©”μ‹œμ§€μ— μš”κ΅¬μ‚¬ν•­ 좔적을 μœ„ν•œ ν‹°μΌ“ ID(예: `feature/PROJ-123-user-auth`)λ₯Ό 포함해야 ν•©λ‹ˆλ‹€ [14, 15]. 브랜치 이름은 μΌ€λ°₯ μΌ€μ΄μŠ€(kebab-case)λ₯Ό μ‚¬μš©ν•˜κ³  μ§§κ³  λͺ…ν™•ν•˜κ²Œ μž‘μ„±ν•©λ‹ˆλ‹€ [16, 17]. * **μ›μžμ  컀밋 (Atomic Commits):** ν•˜λ‚˜μ˜ μ»€λ°‹μ—λŠ” ν•˜λ‚˜μ˜ 논리적 λ³€κ²½ μ‚¬ν•­λ§Œ ν¬ν•¨ν•˜μ—¬ μ½”λ“œ 리뷰와 νžˆμŠ€ν† λ¦¬ 좔적을 λ‹¨μˆœν™”ν•©λ‹ˆλ‹€ [7, 18]. * **Conventional Commits κ·œμΉ™:** 컀밋 λ©”μ‹œμ§€λŠ” `feat:`, `fix:`, `chore:` λ“±μ˜ ν‘œμ€€ν™”λœ 접두사λ₯Ό μ‚¬μš©ν•˜μ—¬ λ³€κ²½μ˜ λͺ©μ μ„ λͺ…ν™•νžˆ ν•©λ‹ˆλ‹€ [19-21]. * **PR 및 병합 κ·œμΉ™:** μ½”λ“œλ₯Ό μ ˆλŒ€ `main`에 직접 ν‘Έμ‹œν•΄μ„œλŠ” μ•ˆ 되며, λ°˜λ“œμ‹œ PR을 ν†΅ν•œ 리뷰λ₯Ό 거쳐야 ν•©λ‹ˆλ‹€ [6, 22]. 병합 ν›„μ—λŠ” μ‚¬μš©μ΄ λλ‚œ 브랜치λ₯Ό μ¦‰μ‹œ μ‚­μ œν•˜μ—¬ μ €μž₯μ†Œλ₯Ό μ •λ¦¬ν•©λ‹ˆλ‹€ [6, 23]. * **μ „λž΅ κ°„ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 방법** * ν”„λ‘œμ νŠΈκ°€ 변화함에 따라 μ „λž΅λ„ μ§„ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 톡합 속도λ₯Ό 높이렀면 Feature Branchμ—μ„œ Trunk-Based(κΈ°λŠ₯ ν”Œλž˜κ·Έ μ‚¬μš© 및 수λͺ… 단좕)둜 μ „ν™˜ν•˜κ³ , 더 λ§Žμ€ 체계가 ν•„μš”ν•˜λ‹€λ©΄ GitHub Flowμ—μ„œ Git Flow(`develop` 브랜치 및 릴리슀 브랜치 μΆ”κ°€)둜 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [11, 12]. ## βš–οΈ Trade-offs & Caveats * **ꡬ쑰적 μ˜€λ²„ν—€λ“œ vs. μ•ˆμ •μ„±:** Git FlowλŠ” ꡬ쑰가 λͺ…ν™•ν•˜κ³  정기적인 λ¦΄λ¦¬μŠ€μ— 강점이 μžˆμ§€λ§Œ, 브랜치의 μˆ˜κ°€ λ§Žμ•„ μœ μ§€λ³΄μˆ˜ λΉ„μš©(μ˜€λ²„ν—€λ“œ)이 λ†’μŠ΅λ‹ˆλ‹€ [9]. 반면 Feature Branchλ‚˜ Trunk-Based 방식은 ν”„λ‘œμ„ΈμŠ€κ°€ κ°€λ²Όμš΄ λŒ€μ‹  메인 브랜치의 보호(`main` 브랜치 직접 ν‘Έμ‹œ κΈˆμ§€, μ—„κ²©ν•œ μ½”λ“œ 리뷰 λ“±) κ·œμΉ™μ΄ κ°•μ œλ˜μ§€ μ•ŠμœΌλ©΄ μ½”λ“œκ°€ μ‰½κ²Œ 깨질 μœ„ν—˜μ΄ μžˆμŠ΅λ‹ˆλ‹€ [6, 22]. * **κΈ°λŠ₯ 브랜치의 수λͺ…(Long-lived branches) 문제:** κΈ°λŠ₯ λΈŒλžœμΉ˜λ‚˜ GitHub Flowλ₯Ό μ‚¬μš©ν•  λ•Œ, 브랜치의 수λͺ…이 λͺ‡ μ£Ό 이상 κΈΈμ–΄μ§€λ©΄ λ‹€λ₯Έ μž‘μ—…μžμ™€μ˜ μ½”λ“œ λΆ„κΈ°κ°€ 심해져 κ±°λŒ€ν•œ 병합 좩돌(Merge conflicts)이 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€ [17]. λ”°λΌμ„œ 맀일 `main`의 μ΅œμ‹  λ³€κ²½ 사항을 Pull ν•˜κ±°λ‚˜ Rebaseν•˜μ—¬ μΆ©λŒμ„ μ˜ˆλ°©ν•΄μ•Ό ν•©λ‹ˆλ‹€ [7]. * **Trunk-Based 개발의 μ˜μ‘΄μ„±:** λΉ λ₯Έ 병합을 μ§€ν–₯ν•˜λŠ” Trunk-Based DevelopmentλŠ” 지속적이고 μžλ™ν™”λœ ν…ŒμŠ€νŠΈ ν™˜κ²½(CI)κ³Ό λ―Έμ™„μ„± κΈ°λŠ₯을 ν”„λ‘œλ•μ…˜μ—μ„œ 숨기기 μœ„ν•œ κΈ°λŠ₯ ν”Œλž˜κ·Έ(Feature Flags) κ΅¬ν˜„ λ“± 기술적 뒷받침이 ν•„μˆ˜μ μž…λ‹ˆλ‹€ [9, 11]. ## πŸ”— Knowledge Connections ### Related Concepts #### [관계 μœ ν˜• A: μ•„ν‚€ν…μ²˜/기반 방법둠] - Feature Branch Workflow - μ—°κ²° 이유: μ†Œκ·œλͺ¨ 3~5인 개발 νŒ€μ— κ°€μž₯ μΆ”μ²œλ˜λŠ” λ‹¨μˆœν•˜κ³  직관적인 브랜칭 μ „λž΅μ˜ 기반 κ°œλ…μž…λ‹ˆλ‹€. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: 메인 브랜치λ₯Ό μ˜€μ—Όμ‹œν‚€μ§€ μ•Šκ³  μƒˆλ‘œμš΄ κΈ°λŠ₯을 격리된 ν™˜κ²½μ—μ„œ κ°œλ°œν•˜κ³  λ³‘ν•©ν•˜λŠ” 방법둠을 이해할 수 μžˆμŠ΅λ‹ˆλ‹€. - Trunk-Based Development - μ—°κ²° 이유: 무거운 μ›Œν¬ν”Œλ‘œμš°λ₯Ό νƒˆν”Όν•˜μ—¬ 브랜치 생λͺ…μ£ΌκΈ°λ₯Ό κ·Ήν•œμœΌλ‘œ 쀄이고 λΉ λ₯Έ 톡합을 μ€‘μ‹œν•˜λŠ” μ΅œμ‹  νŠΈλ Œλ“œ λͺ¨λΈμž…λ‹ˆλ‹€. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: CI/CD ν™˜κ²½μ—μ„œμ˜ μž¦μ€ μ†Œκ·œλͺ¨ 배포 방식과 좩돌 μ΅œμ†Œν™” μ „λž΅μ„ ν•™μŠ΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€. - Git Flow - μ—°κ²° 이유: 브랜칭 μ „λž΅μ˜ 고전적이고 체계적인 ν˜•νƒœλ‘œμ„œ, λŒ€ν˜• ν”„λ‘œμ νŠΈμ˜ 정기적 버저닝 관리λ₯Ό μœ„ν•΄ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: `develop`, `release`, `hotfix` λ“± 개발 νŒŒμ΄ν”„λΌμΈμ— λ”°λ₯Έ 브랜치의 μ—­ν•  뢄리 기법을 이해할 수 μžˆμŠ΅λ‹ˆλ‹€. #### [관계 μœ ν˜• B: κ΅¬ν˜„/ν™œμš© 도ꡬ 및 κ·œμΉ™] - Pull Request & Code Review - μ—°κ²° 이유: 브랜칭 μ „λž΅μ΄ μ•ˆμ „ν•˜κ²Œ λ™μž‘ν•˜κΈ° μœ„ν•΄ λͺ¨λ“  병합 전에 ν•„μˆ˜μ μœΌλ‘œ 거쳐야 ν•˜λŠ” ν’ˆμ§ˆ 검증 κ΄€λ¬Έμž…λ‹ˆλ‹€. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: νŒ€μ› κ°„μ˜ 비동기적 ν”Όλ“œλ°± 수렴, μ‹œκ°μ  검증, 그리고 CI 톡과λ₯Ό μ „μ œλ‘œ ν•œ μ•ˆμ „ν•œ 병합 과정을 배울 수 μžˆμŠ΅λ‹ˆλ‹€. - Conventional Commits - μ—°κ²° 이유: 브랜치 병합 내역을 μΆ”μ ν•˜κ³  가독성을 높이기 μœ„ν•΄ μ „ μ„Έκ³„μ μœΌλ‘œ ν†΅μš©λ˜λŠ” 컀밋 λ©”μ‹œμ§€ μž‘μ„± ν‘œμ€€μž…λ‹ˆλ‹€. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: `feat(scope): message` 와 같은 ν˜•μ‹μ˜ ꡬ문을 톡해 μ½”λ“œ νžˆμŠ€ν† λ¦¬ νŒŒμ•… 및 λ¬Έμ„œ μžλ™ν™”λ₯Ό μ–΄λ–»κ²Œ 이룰 수 μžˆλŠ”μ§€ 이해할 수 μžˆμŠ΅λ‹ˆλ‹€. ### Deeper Research Questions - Trunk-Based Developmentλ₯Ό μ„±κ³΅μ μœΌλ‘œ μ μš©ν•˜κΈ° μœ„ν•΄ ν•„μˆ˜μ μΈ μžλ™ν™” ν…ŒμŠ€νŠΈ ν™˜κ²½(CI)κ³Ό κΈ°λŠ₯ ν”Œλž˜κ·Έ(Feature flags)의 κ΅¬ν˜„ μ „λž΅μ€ 무엇인가? - μ†Œκ·œλͺ¨ νŒ€μ΄ 단일 `main` 브랜치 μ „λž΅μ„ μ‚¬μš©ν•  λ•Œ, 예기치 μ•Šμ€ 버그가 λ°°ν¬λ˜λŠ” 것을 막기 μœ„ν•œ GitHub μ €μž₯μ†Œμ˜ 브랜치 보호 κ·œμΉ™(Branch Protection Rules) μ΅œμ ν™” 방법은 무엇인가? - μž₯κΈ° 체λ₯˜ 브랜치(Long-lived branch)μ—μ„œ λ°œμƒν•˜λŠ” κ±°λŒ€ν•œ 병합 μΆ©λŒμ„ ν”Όν•˜κΈ° μœ„ν•΄ `main` 브랜치의 μ΅œμ‹  λ‚΄μš©μ„ κ°€μ Έμ˜¬ λ•Œ `merge`와 `rebase` 쀑 μ–΄λ–€ 방식이 이λ ₯ 관리에 더 νš¨κ³Όμ μΈκ°€? - μ›μžμ  컀밋(Atomic Commits)을 κ°•μ œν•˜λŠ” 정책이 Pull Request 리뷰 μ‹œκ°„κ³Ό 버그 좔적성에 μ–΄λ– ν•œ μ •λŸ‰μ /정성적 영ν–₯을 λ―ΈμΉ˜λŠ”κ°€? - Git Flow λ°©μ‹μ—μ„œ GitHub Flow λ°©μ‹μœΌλ‘œ νŒ€μ˜ μ›Œν¬ν”Œλ‘œμš°λ₯Ό λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•  λ•Œ μ˜ˆμƒλ˜λŠ” ν˜Όλž€ μš”μ†Œμ™€ 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ CI/CD νŒŒμ΄ν”„λΌμΈμ˜ μž¬κ΅¬μ„± 방법은 무엇인가? ### Practical Application Contexts - **Implementation:** μƒˆλ‘œμš΄ κΈ°λŠ₯ κ°œλ°œμ„ μ‹œμž‘ν•  λ•Œ, μ΅œμ‹  `main` λΈŒλžœμΉ˜μ—μ„œ `feature/ν‹°μΌ“ID-κ°„λ‹¨ν•œ-μ„€λͺ…` μ΄λ¦„μœΌλ‘œ 브랜치λ₯Ό νŒŒμƒν•˜κ³ , μ›μžμ  λ‹¨μœ„λ‘œ μž‘μ€ 컀밋을 자주 κΈ°λ‘ν•©λ‹ˆλ‹€. - **System Design:** ν”„λ‘ νŠΈμ—”λ“œ λͺ¨λ“ˆ μ•„ν‚€ν…μ²˜ 섀계 μ‹œ, 독립적인 ν”Όμ²˜(Feature) ν΄λ”λ³„λ‘œ 브랜치λ₯Ό λ‚˜λˆ„μ–΄ κ°œλ°œν•¨μœΌλ‘œμ¨ νŠΉμ • μ½”λ“œ μ˜μ—­ λ°–μœΌλ‘œ 병합 좩돌의 폭발 반경(Blast radius)이 퍼지지 μ•Šλ„λ‘ ν•©λ‹ˆλ‹€. - **Operation / Maintenance:** λΈŒλžœμΉ˜κ°€ `main`으둜 λ³‘ν•©λ˜λŠ” μ¦‰μ‹œ GitHub Action λ“± CI μ„œλ²„μ—μ„œ μžλ™μœΌλ‘œ 린트(ESLint), ν…ŒμŠ€νŠΈ(Jest), ν¬λ§·νŒ…μ„ μˆ˜ν–‰ν•˜λ„λ‘ 방어막을 κ΅¬μΆ•ν•˜μ—¬ 메인 브랜치의 배포 κ°€λŠ₯ν•œ μƒνƒœλ₯Ό 영ꡬ적으둜 μœ μ§€ν•©λ‹ˆλ‹€. - **Learning Path:** Git의 기초 λͺ…λ Ήμ–΄λ₯Ό μŠ΅λ“ν•œ ν›„, μ†Œκ·œλͺ¨ νŒ€ λ‹¨μœ„μ˜ Feature Branch Workflowλ₯Ό μ‹€μŠ΅ν•˜κ³ , 이후 CI/CD 도ꡬλ₯Ό μ—°λ™ν•œ Trunk-Based ν™˜κ²½μœΌλ‘œ λ°œμ „ν•˜λŠ” μˆœμ„œλ‘œ ν•™μŠ΅ν•©λ‹ˆλ‹€. - **My Project Relevance:** 3~5인 규λͺ¨μ˜ ν”„λ‘œμ νŠΈμ—μ„œ 무거운 Git Flow의 λ„μž…μ„ μ§€μ–‘ν•˜κ³ , '단기 κΈ°λŠ₯ 브랜치 β†’ PR 및 1인 이상 ν”Όμ–΄ 리뷰 승인 β†’ Squash Merge 및 브랜치 μ¦‰μ‹œ μ‚­μ œ'λΌλŠ” λ‹¨μˆœν™”λœ 룰을 μ μš©ν•˜μ—¬ 개발 속도와 μ½”λ“œ ν’ˆμ§ˆμ„ λ™μ‹œμ— μ±™κΉλ‹ˆλ‹€. ### Adjacent Topics - Continuous Integration / Continuous Deployment (CI/CD) - ν™•μž₯ λ°©ν–₯: 브랜칭 μ „λž΅μ— μ˜ν•΄ 트리거(Trigger)λ˜μ–΄ μ‹€ν–‰λ˜λŠ” λΉŒλ“œ, ν…ŒμŠ€νŠΈ, 배포 νŒŒμ΄ν”„λΌμΈμ˜ μžλ™ν™” ν”„λ‘œμ„ΈμŠ€λ₯Ό 깊이 μ•Œμ•„λ΄…λ‹ˆλ‹€. - [[Feature-Sliced Design (FSD)|Feature-Sliced Design (FSD)]] - ν™•μž₯ λ°©ν–₯: 도메인과 κΈ°λŠ₯ λ‹¨μœ„λ‘œ μ½”λ“œλ₯Ό λΆ„λ¦¬ν•˜λŠ” ν”„λ‘ νŠΈμ—”λ“œ μ•„ν‚€ν…μ²˜ λ°©λ²•λ‘ μœΌλ‘œ, 브랜치λ₯Ό κΈ°λŠ₯λ³„λ‘œ λ‚˜λˆŒ λ•Œ μΆ©λŒμ„ 물리적으둜 μ΅œμ†Œν™”ν•˜λŠ” μ½”λ“œ ꡬ쑰 섀계법을 νƒκ΅¬ν•©λ‹ˆλ‹€. --- *Last updated: 2026-04-30*