# [[Agile Software Development in Small Teams]] ## ๐Ÿ“Œ Brief Summary ์†Œ๊ทœ๋ชจ ํŒ€(์˜ˆ: 2~5์ธ)์—์„œ์˜ ์• ์ž์ผ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์€ ํ”„๋กœ์„ธ์Šค ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ํ•ต์‹ฌ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค [1, 2]. ๋ณต์žกํ•œ ์›Œํฌํ”Œ๋กœ์šฐ(์˜ˆ: Git-Flow) ๋Œ€์‹  ๊ฐ€๋ฒผ์šด ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Feature-Branch)๋‚˜ ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜(Trunk-Based) ๊ฐœ๋ฐœ์„ ์ฑ„ํƒํ•˜์—ฌ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค [3, 4]. ๋˜ํ•œ, YAGNI(You Aren't Gonna Need It) ์›์น™๊ณผ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜์˜ ๊ตฌ์กฐ(Feature-Based Structure)๋ฅผ ์ ์šฉํ•˜์—ฌ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง์„ ํ”ผํ•˜๊ณ  ์ฝ”๋“œ์˜ ํ™•์žฅ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค [5, 6]. ## ๐Ÿ“– Core Content * **๊ฐ€๋ฒผ์šด ๋ธŒ๋žœ์นญ ์›Œํฌํ”Œ๋กœ์šฐ (Lightweight Branching Workflows)** * ์†Œ๊ทœ๋ชจ ํŒ€์˜ ๊ฒฝ์šฐ, ๋ฌด๊ฒ๊ณ  ๋ณต์žกํ•œ Git-Flow๋ณด๋‹ค๋Š” '๋‹จ์ˆœ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ(Simple Feature-Branch Workflow)'๋‚˜ '์งง์€ ์ˆ˜๋ช…์˜ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ํ™œ์šฉํ•œ ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ(Trunk-Based Development)'์ด ๊ฐ€์žฅ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค [1-3]. * ์ด๋ฅผ ํ†ตํ•ด ๊ณผ๋„ํ•œ ํ”„๋กœ์„ธ์Šค ๋ถ€๋‹ด ์—†์ด ์ฝ”๋“œ ์•ˆ์ •์„ฑ์„ ์ง€ํ‚ค๊ณ , ๊ธด ๋ธŒ๋žœ์น˜ ์œ ์ง€๋กœ ์ธํ•œ ๋Œ€๊ทœ๋ชจ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 7, 8]. * **์†Œ๊ทœ๋ชจ ์• ์ž์ผ ํŒ€์„ ์œ„ํ•œ ํ•ต์‹ฌ ๊ทœ์น™ (Key Rules for Collaboration)** * **์•ˆ์ •์ ์ธ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜ ์œ ์ง€:** `main` (๋˜๋Š” `master`) ๋ธŒ๋žœ์น˜๋Š” ํ•ญ์ƒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•˜๊ณ  ์•ˆ์ •์ ์ธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜๋ฉฐ, ์ง์ ‘ ํ‘ธ์‹œ(Direct push)๋ฅผ ๊ธˆ์ง€ํ•˜๋Š” ๋ณดํ˜ธ ์ •์ฑ…(Branch protection)์„ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1-3, 9]. * **๋‹จ์ผ ์ž‘์—… ๋ธŒ๋žœ์น˜์™€ ์›์ž์  ์ปค๋ฐ‹:** ๋ชจ๋“  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด๋‚˜ ๋ฒ„๊ทธ ์ˆ˜์ •์€ `main`์—์„œ ๋ถ„๊ธฐ๋œ ์งง์€ ์ˆ˜๋ช…์˜ ๋ธŒ๋žœ์น˜์—์„œ ์ง„ํ–‰ํ•˜๋ฉฐ(์˜ˆ: `feature/login-page`), ํ•˜๋‚˜์˜ ์ปค๋ฐ‹์—๋Š” ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๋ณ€๊ฒฝ(Atomic Commits)๋งŒ ๋‹ด์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค [2, 3, 10, 11]. * **์ฝ”๋“œ ๋ฆฌ๋ทฐ์™€ ๋ณ‘ํ•ฉ (PR & Merge):** ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด Pull Request(PR)๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ๋™๋ฃŒ ๋ฆฌ๋ทฐ์™€ CI ํ…Œ์ŠคํŠธ ํ†ต๊ณผ๋ฅผ ๊ฑฐ์ณ์•ผ๋งŒ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [9-12]. ๋ณ‘ํ•ฉ ์‹œ์—๋Š” ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Squash Merge๋ฅผ ๊ถŒ์žฅํ•˜๋ฉฐ, ๋ณ‘ํ•ฉ๋œ ๋ธŒ๋žœ์น˜๋Š” ์ž๋™์œผ๋กœ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค [9, 10, 12, 13]. * **์• ์ž์ผ ํ™˜๊ฒฝ์˜ ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ์›์น™๊ณผ ๊ตฌ์กฐ** * **YAGNI ์›์น™:** ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ๋Š” "You Aren't Gonna Need It(๋‹น์žฅ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ์€ ๋งŒ๋“ค์ง€ ๋ง๋ผ)" ์›์น™์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ์‹คํ˜„๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ๋ฏธ๋ž˜์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์œ„ํ•ด ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ ๋ฏธ๋ฆฌ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์„ ์ง€์–‘ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ์™€ ์œ ์ง€๋ณด์ˆ˜ ๋ถ€๋‹ด์„ ์ค„์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค [5, 14]. * **๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ (Feature-Based Structure):** ๊ธฐ์ˆ ์ ์ธ ํŒŒ์ผ ์œ ํ˜•์ด ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ(Feature)์„ ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ํด๋”ํ™”ํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์€ ์• ์ž์ผ ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก ๊ณผ ๋งค์šฐ ์ž˜ ๋งž์Šต๋‹ˆ๋‹ค [6, 15]. ๊ธฐ๋Šฅ๋“ค์ด ๋…๋ฆฝ์ ์œผ๋กœ ์ƒ์„ฑ ๋ฐ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์–ด ํŒ€์ด ์ฝ”๋“œ๋ฅผ ํ™•์žฅํ•  ๋•Œ ๋งˆ์ฐฐ์ด ์ ์Šต๋‹ˆ๋‹ค [6]. ## โš–๏ธ Trade-offs & Caveats * **๋‹จ์ˆœ์„ฑ vs. ๊ตฌ์กฐ์  ํ•œ๊ณ„:** ๊ฐ€๋ฒผ์šด ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์ „๋žต์ด๋‚˜ ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ์€ ์†Œ๊ทœ๋ชจ ํŒ€(2~5๋ช…)์—๊ฒŒ ๋ฐฐ์šฐ๊ธฐ ์‰ฝ๊ณ  ํ”„๋กœ์„ธ์Šค ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ ๋‹ค๋Š” ๊ฐ•๋ ฅํ•œ ์žฅ์ ์ด ์žˆ์ง€๋งŒ [4, 8], ํŒ€ ๊ทœ๋ชจ๊ฐ€ ํฌ๊ฒŒ ์„ฑ์žฅํ•˜๊ฑฐ๋‚˜ ์—„๊ฒฉํžˆ ์˜ˆ์ •๋œ ๋ฆด๋ฆฌ์Šค ์ผ์ •์„ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ฌด๊ฒ๋”๋ผ๋„ Git-Flow์™€ ๊ฐ™์€ ๋ฆด๋ฆฌ์Šค/๊ฐœ๋ฐœ ๋ธŒ๋žœ์น˜๊ฐ€ ๋ถ„๋ฆฌ๋œ ์ „๋žต์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 16]. * **Trunk-Based Development์˜ ๋†’์€ ์š”๊ตฌ์‚ฌํ•ญ:** ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ์€ ๋น ๋ฅธ ํ†ตํ•ฉ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์ง€๋งŒ, ํŒ€์› ๊ฐ„์˜ ๊ธด๋ฐ€ํ•œ ์กฐ์œจ๊ณผ ๊ฐ•๋ ฅํ•œ ์ง€์†์  ํ†ตํ•ฉ(CI) ํ™˜๊ฒฝ ๊ตฌ์ถ•์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [4, 8]. ๊ฐ•๋ ฅํ•œ CI ํŒŒ์ดํ”„๋ผ์ธ ์—†์ด ๋นˆ๋ฒˆํ•œ ๋ณ‘ํ•ฉ๋งŒ ์‹œ๋„ํ•  ๊ฒฝ์šฐ, ์˜คํžˆ๋ ค `main` ๋ธŒ๋žœ์น˜์˜ ์•ˆ์ •์„ฑ์ด ์œ„ํ˜‘๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. * **YAGNI์˜ ๋ถ€์ž‘์šฉ:** YAGNI ์›์น™์€ ๋‚ญ๋น„๋˜๋Š” ๋…ธ๋ ฅ์„ ์ค„์—ฌ์ฃผ์ง€๋งŒ, ์‹œ์Šคํ…œ์˜ ์ „๋ฐ˜์ ์ธ ๋ฐ‘๊ทธ๋ฆผ์ด๋‚˜ ๋ฏธ๋ž˜์˜ ํ™•์žฅ์„ฑ์„ ๋„ˆ๋ฌด ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ๊ฐœ๋ฐœํ•  ๊ฒฝ์šฐ(Oversimplify) ๋‚˜์ค‘์— ๋Œ€๋Œ€์ ์ธ ์•„ํ‚คํ…์ฒ˜ ์ˆ˜์ •์ด ํ•„์š”ํ•ด์งˆ ์œ„ํ—˜(Trade-off)๋„ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค [17]. ## ๐Ÿ”— Knowledge Connections ### Related Concepts #### [Workflow & Version Control (๋ฒ„์ „ ๊ด€๋ฆฌ ๋ฐ ํ˜‘์—… ๋ฐฉ์‹)] - [[Feature-Branch Workflow]] - ์—ฐ๊ฒฐ ์ด์œ : 2~5์ธ ๊ทœ๋ชจ์˜ ์†Œ๊ทœ๋ชจ ํŒ€์—์„œ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๊ฐ€๋ฒผ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ๋„๋ฆฌ ๊ถŒ์žฅ๋˜๋Š” ํ•ต์‹ฌ Git ๋ธŒ๋žœ์น˜ ์ „๋žต์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [2, 3]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์งง์€ ์ˆ˜๋ช…์˜ ๋ธŒ๋žœ์น˜ ๊ด€๋ฆฌ์™€ Pull Request๋ฅผ ํ†ตํ•œ ๋น„๋™๊ธฐ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๊ฐ€ ํŒ€์˜ ๋ฏผ์ฒฉ์„ฑ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ. - [[Trunk-Based Development]] - ์—ฐ๊ฒฐ ์ด์œ : ์ˆ™๋ จ๋œ ์†Œ๊ทœ๋ชจ ํŒ€์ด ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ๊ณผ CI/CD์˜ ํšจ์œจ์„ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€์•ˆ์  ์• ์ž์ผ ์›Œํฌํ”Œ๋กœ์šฐ์ž…๋‹ˆ๋‹ค [1, 4]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋žœ์น˜ ๋ถ„๋ฆฌ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์ด ํ†ตํ•ฉ ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ์˜ˆ๋ฐฉํ•˜๋Š”์ง€. #### [Software Engineering Principles (์†Œํ”„ํŠธ์›จ์–ด ๊ณตํ•™ ์›์น™)] - [[YAGNI (You Aren't Gonna Need It)]] - ์—ฐ๊ฒฐ ์ด์œ : ์• ์ž์ผ ํ™˜๊ฒฝ์—์„œ ๋‚ญ๋น„๋ฅผ ์ค„์ด๊ณ  ํ˜„์žฌ์˜ ์š”๊ตฌ์‚ฌํ•ญ์—๋งŒ ์ง‘์ค‘ํ•˜๊ฒŒ ํ•จ์œผ๋กœ์จ, ๋น ๋ฅด๊ณ  ๊ฐ€๋ฒผ์šด ๊ฐœ๋ฐœ ์ฃผ๊ธฐ๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ๋•๋Š” ํ•ต์‹ฌ ์„ค๊ณ„ ์›์น™์ž…๋‹ˆ๋‹ค [5, 17]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ณผ๋„ํ•œ ์‚ฌ์ „ ์„ค๊ณ„(Over-engineering)๋ฅผ ๋ฐฉ์ง€ํ•˜์—ฌ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋†’์ด๋Š” ์ฒ ํ•™์  ๋ฐฐ๊ฒฝ. - [[Feature-Based Structure]] - ์—ฐ๊ฒฐ ์ด์œ : ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ธฐ์ˆ ์  ์—ญํ• ์ด ์•„๋‹Œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ(Feature) ๋‹จ์œ„๋กœ ๋ฌถ์–ด ๋…๋ฆฝ์„ฑ์„ ๋ถ€์—ฌํ•˜๋Š” ๊ตฌ์กฐ๋กœ, ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ๊ฐœ๋ฐœ๊ณผ ๋ฐฐํฌ๋ฅผ ๋ฐ˜๋ณตํ•˜๋Š” ์• ์ž์ผ ๋ฐฉ๋ฒ•๋ก ๊ณผ ์ง๊ฒฐ๋ฉ๋‹ˆ๋‹ค [6, 15]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์‘์ง‘๋„(Cohesion)๋ฅผ ๋†’์ด๊ณ  ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ ํ™•์žฅ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํด๋” ๊ตฌ์กฐ ์„ค๊ณ„๋ฒ•. ### Deeper Research Questions - ์†Œ๊ทœ๋ชจ ์• ์ž์ผ ํŒ€์ด ์„ฑ์žฅํ•˜์—ฌ ๋Œ€ํ˜• ํŒ€(์˜ˆ: 10๋ช… ์ด์ƒ)์ด ๋  ๋•Œ, ๊ฒฝ๋Ÿ‰ํ™”๋œ Feature-Branch ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ Git-Flow์™€ ๊ฐ™์€ ๋ณต์žกํ•œ ์›Œํฌํ”Œ๋กœ์šฐ๋กœ ์ „ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์ž„๊ณ„์ ๊ณผ ์ง•ํ›„๋Š” ๋ฌด์—‡์ธ๊ฐ€? - ์†Œ๊ทœ๋ชจ ํŒ€์ด Trunk-Based Development๋ฅผ ๋„์ž…ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ๊ฐ–์ถฐ์•ผ ํ•˜๋Š” CI/CD ํŒŒ์ดํ”„๋ผ์ธ์˜ ์„ฑ์ˆ™๋„์™€ ์ž๋™ํ™” ํ…Œ์ŠคํŠธ์˜ ์ปค๋ฒ„๋ฆฌ์ง€ ์ˆ˜์ค€์€ ์–ด๋А ์ •๋„์ธ๊ฐ€? - ํ”„๋ก ํŠธ์—”๋“œ ํ™˜๊ฒฝ์—์„œ Feature-Based Structure(ํ˜น์€ Feature-Sliced Design)๋ฅผ ๋„์ž…ํ•  ๋•Œ, ๊ณตํ†ต ๋กœ์ง(Shared concerns)์˜ ๊ฒฝ๊ณ„๋ฅผ ์–ด๋–ป๊ฒŒ ์ •์˜ํ•ด์•ผ ์• ์ž์ผ ํŒ€์˜ ๊ฐœ๋ฐœ ์†๋„ ์ €ํ•˜๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋Š”๊ฐ€? - YAGNI ์›์น™์„ ์—„๊ฒฉํ•˜๊ฒŒ ์ ์šฉํ•˜๋ฉด์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ธฐ์ˆ  ๋ถ€์ฑ„(Technical Debt)๋ฅผ ์• ์ž์ผ ์Šคํ”„๋ฆฐํŠธ ๋‚ด์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ  ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ์ฒด๊ณ„์ ์ธ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? - Pull Request ๊ธฐ๋ฐ˜์˜ ํ˜‘์—…์—์„œ, ๋ณ‘ํ•ฉ ์ง€์—ฐ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ์„ ์œ ๋„ํ•˜๊ธฐ ์œ„ํ•œ ์ด์ƒ์ ์ธ PR ํฌ๊ธฐ ์ œํ•œ(์˜ˆ: ์ฝ”๋“œ ๋ผ์ธ ์ˆ˜)๊ณผ Atomic Commit ๊ฐ•์ œ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? ### Practical Application Contexts - **Implementation:** ๊ฐœ๋ฐœ์ž๋Š” ์ž‘์—…์„ ์‹œ์ž‘ํ•  ๋•Œ `main` ๋ธŒ๋žœ์น˜์—์„œ ์งง์€ ์ˆ˜๋ช…์˜ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ๋’ค ์ž‘๊ณ  ๋…ผ๋ฆฌ์ ์ธ ๋‹จ์œ„(Atomic Commits)๋กœ ์ชผ๊ฐœ์–ด ์ž์ฃผ ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค [10, 13]. - **System Design:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํด๋” ๊ตฌ์กฐ๋ฅผ ๋„๋ฉ”์ธ์ด๋‚˜ ๊ธฐ๋Šฅ(Feature) ๊ธฐ์ค€์œผ๋กœ ์„ค๊ณ„ํ•˜์—ฌ, ์†Œ๊ทœ๋ชจ ํŒ€์›์ด ๊ฐ์ž ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ๋™์‹œ์— ๊ฐœ๋ฐœํ•˜๋”๋ผ๋„ ์„œ๋กœ์˜ ์ฝ”๋“œ ์˜์—ญ์„ ์นจ๋ฒ”ํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค [6]. - **Operation / Maintenance:** GitHub ๋“ฑ ์ €์žฅ์†Œ ์„ค์ •์—์„œ `main` ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ(Branch Protection) ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•˜๊ณ , ์ตœ์†Œ 1๋ช…์˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์Šน์ธ๊ณผ ์ž๋™ํ™” ํ…Œ์ŠคํŠธ(CI) ํ†ต๊ณผ๋ฅผ ํ•„์ˆ˜ ๋ณ‘ํ•ฉ ์กฐ๊ฑด์œผ๋กœ ๊ฐ•์ œํ•˜์—ฌ ํ”„๋กœ๋•์…˜ ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค [9]. - **Learning Path:** ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ ํŒ€์„ ๊ตฌ์„ฑํ•  ๋•Œ, ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฌด๊ฑฐ์šด ๋ฃฐ์„ ๊ฐ•์š”ํ•˜๊ธฐ๋ณด๋‹ค ๋‹จ์ผ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ, Pull Request๋ฅผ ํ†ตํ•œ ๋ฆฌ๋ทฐ, Squash Merge๋ฅผ ์ด์šฉํ•œ ๊น”๋”ํ•œ ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ ๋“ฑ ํ•ต์‹ฌ ์›Œํฌํ”Œ๋กœ์šฐ๋ถ€ํ„ฐ ํ•™์Šต์‹œํ‚ต๋‹ˆ๋‹ค [1, 13, 18]. - **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ 2-5์ธ ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ๋ถˆํ•„์š”ํ•œ ๋ฏธ๋ž˜ ํ™•์žฅ์„ ๋Œ€๋น„ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š” YAGNI ์›์น™๊ณผ, `feat/*`, `fix/*` ํ˜•ํƒœ์˜ ๋‹จ์ˆœํ•œ ๋ธŒ๋žœ์น˜ ์ „๋žต์„ ๋„์ž…ํ•˜๋ฉด ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ์ค„์ด๊ณ  ๋น ๋ฅด๊ฒŒ ๊ฒฐ๊ณผ๋ฌผ์„ ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 4, 16]. ### Adjacent Topics - [[Continuous Integration (CI)]] - ํ™•์žฅ ๋ฐฉํ–ฅ: ์†Œ๊ทœ๋ชจ ํŒ€์ด ์งง์€ ์ฃผ๊ธฐ์˜ ์ฝ”๋“œ ๋ณ‘ํ•ฉ(Merge)์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋’ท๋ฐ›์นจํ•˜๋Š” ์ž๋™ํ™”๋œ ๋นŒ๋“œ ๋ฐ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๊ตฌ์ถ• ๊ฐ€์ด๋“œ๋กœ ํ™•์žฅ. - [[Conventional Commits]] - ํ™•์žฅ ๋ฐฉํ–ฅ: ํŒ€์› ๊ฐ„์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜์„ ์ผ๊ด€๋˜๊ฒŒ ๋งŒ๋“ค๊ณ  (`feat:`, `fix:` ๋“ฑ), ํ–ฅํ›„ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ์ปค๋ฐ‹ ์ž‘์„ฑ ํ‘œ์ค€ ๊ทœ์น™ ํƒ๊ตฌ. --- *Last updated: 2026-04-30*