# [[React Project Git Governance]] ## ๐Ÿ“Œ Brief Summary React ํ”„๋กœ์ ํŠธ Git ๊ฑฐ๋ฒ„๋„Œ์Šค๋Š” ํ˜‘์—… ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๊ณ  ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ •์˜๋œ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ, ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ, ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR) ๊ด€๋ฆฌ ๋“ฑ์˜ ๊ทœ์น™๊ณผ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์†Œ๊ทœ๋ชจ ๋ฐ ๋Œ€๊ทœ๋ชจ ํŒ€์—์„œ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์˜ ์•ˆ์ •์„ฑ์„ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ์ง€์† ์œ ์ง€ํ•˜๋ฉฐ, ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Feature Branch) ์šด์šฉ, ํ‹ฐ์ผ“ ID ์—ฐ๋™, Conventional Commits, ๊ทธ๋ฆฌ๊ณ  ์ž๋™ํ™”๋œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual Regression Testing) ๋“ฑ์„ ํ†ตํ•ฉํ•˜์—ฌ ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„์™€ ๋ช…ํ™•ํ•œ ์ถ”์ ์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. ## ๐Ÿ“– Core Content * **๋ธŒ๋žœ์น˜ ์ „๋žต (Branching Strategies):** ์†Œ๊ทœ๋ชจ ํŒ€(2~5๋ช…)์˜ ๊ฒฝ์šฐ ๋ณต์žกํ•œ Git-Flow ์›Œํฌํ”Œ๋กœ์šฐ๋ณด๋‹ค๋Š” '๋ณดํ˜ธ๋œ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋ฅผ ๊ฐ–์ถ˜ ๋‹จ์ˆœ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ(Feature-branch workflow)' ๋˜๋Š” ๋‹จ๊ธฐ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ํ™œ์šฉํ•˜๋Š” 'ํŠธ๋ ํฌ ๊ธฐ๋ฐ˜(Trunk-based) ์›Œํฌํ”Œ๋กœ์šฐ'๊ฐ€ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. `main` ๋ธŒ๋žœ์น˜๋Š” ํ•ญ์ƒ ์•ˆ์ •์ ์ด๊ณ  ์ฆ‰์‹œ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์—ฌ์•ผ ํ•˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๋Š” ์ ˆ๋Œ€ `main` ๋ธŒ๋žœ์น˜์— ์ง์ ‘ ์ปค๋ฐ‹ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. * **๋ธŒ๋žœ์น˜ ๋ช…๋ช… ๊ทœ์น™ (Branch Naming Conventions):** ์„ค๋ช…์ด ๋ช…ํ™•ํ•œ ์งง์€ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋˜, `feature/`, `bugfix/`, `chore/` ๋“ฑ์˜ ์œ ํ˜• ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด์Šˆ ์ถ”์ ์„ฑ(Traceability)์„ ์œ„ํ•ด JIRA ๋“ฑ์˜ ํ‹ฐ์ผ“ ID๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค(์˜ˆ: `feature/PROJ-123-user-auth`). ๋‹จ์–ด ๊ตฌ๋ถ„์—๋Š” ์–ธ๋”์Šค์ฝ”์–ด(_) ๋Œ€์‹  ํ•˜์ดํ”ˆ(-)์„ ์‚ฌ์šฉํ•˜๊ณ , ์†Œ๋ฌธ์ž๋กœ ํ†ต์ผํ•ฉ๋‹ˆ๋‹ค. * **์ปค๋ฐ‹ ๊ทœ์น™ (Commit Rules):** ํ•˜๋‚˜์˜ ์ปค๋ฐ‹์€ ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๋ณ€๊ฒฝ์‚ฌํ•ญ๋งŒ ํฌํ•จํ•˜๋Š” ์›์ž์  ์ปค๋ฐ‹(Atomic Commit)์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋Š” 'Conventional Commits' ์‚ฌ์–‘(`feat:`, `fix:`, `refactor:` ๋“ฑ)์„ ๋”ฐ๋ผ ์ž‘์„ฑํ•˜์—ฌ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ์Šค์บ”ํ•˜๊ณ  ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ๋ฅผ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ(What)๊ณผ ๊ทธ ์ด์œ (Why)๋ฅผ ๋ช…ํ™•ํžˆ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. * **PR(Pull Request) ๋ฐ ๋ณ‘ํ•ฉ(Merging) ๊ทœ์น™:** ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „ ๋ฐ˜๋“œ์‹œ PR์„ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋ฉฐ, ์ตœ์†Œ 1๋ช… ์ด์ƒ์˜ ๋™๋ฃŒ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์Šน์ธ๊ณผ CI ํ…Œ์ŠคํŠธ ํ†ต๊ณผ๊ฐ€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. PR์€ ๋น ๋ฅด๊ณ  ์ฒ ์ €ํ•œ ๋ฆฌ๋ทฐ๋ฅผ ์œ„ํ•ด ๋‹จ์ผ ์ž‘์—…์— ์ง‘์ค‘๋œ ์ž‘์€ ํฌ๊ธฐ๋กœ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณ‘ํ•ฉ ์‹œ์—๋Š” ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์Šค์ฟผ์‹œ ๋ณ‘ํ•ฉ(Squash Merge)์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋ณ‘ํ•ฉ ํ›„์—๋Š” ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์ž๋™ ์‚ญ์ œํ•˜์—ฌ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. * **์‹œ๊ฐ์  ๋ฆฌ๋ทฐ ๋ฐ ์ž๋™ํ™” (Visual Reviews):** ํ”„๋ก ํŠธ์—”๋“œ/React์˜ ํŠน์„ฑ์— ๋งž์ถฐ Storybook๊ณผ Chromatic ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ PR ๋‹จ๊ณ„์—์„œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual Regression Testing)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์˜๋„์น˜ ์•Š์€ UI ๋ ˆ์ด์•„์›ƒ, ์—ฌ๋ฐฑ, ์ƒ‰์ƒ ๋ณ€๊ฒฝ ๋“ฑ์˜ ์‹œ๊ฐ์  ๊ฒฐํ•จ์ด ํ”„๋กœ๋•์…˜์— ๋ณ‘ํ•ฉ๋˜๋Š” ๊ฒƒ์„ ์„ ์ œ์ ์œผ๋กœ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. ## โš–๏ธ Trade-offs & Caveats * **์—„๊ฒฉํ•œ ๊ทœ์น™ vs ๊ฐœ๋ฐœ ์˜ค๋ฒ„ํ—ค๋“œ:** PR ์ƒ์„ฑ, ํ‹ฐ์ผ“ ID ํ•„์ˆ˜ ํฌํ•จ, ์ตœ์†Œ 1์ธ ๋ฆฌ๋ทฐ ์š”๊ตฌ, CI/CD ๋นŒ๋“œ ๋ฐ ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ๋“ฑ์˜ ์—„๊ฒฉํ•œ ๊ทœ์น™์€ ์ฝ”๋“œ ํ’ˆ์งˆ๊ณผ ์•ˆ์ •์„ฑ์„ ํฌ๊ฒŒ ๋†’์ด์ง€๋งŒ, ์•„์ฃผ ์ž‘๊ณ  ์‚ฌ์†Œํ•œ ์ˆ˜์ •์กฐ์ฐจ ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฑฐ์ณ์•ผ ํ•˜๋ฏ€๋กœ ๊ฐœ๋ฐœ ๋ฐ ๋ฐฐํฌ ์†๋„์— ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. * **์Šค์ฟผ์‹œ ๋ณ‘ํ•ฉ(Squash Merge)์˜ ๋‹จ์ :** ์Šค์ฟผ์‹œ ๋ณ‘ํ•ฉ์€ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์˜ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ํ•œ ์ค„๋กœ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•ด์ฃผ์ง€๋งŒ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐœ๋ณ„ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ๋‚ด์—์„œ ์ž‘์—…ํ•˜๋ฉฐ ๋‚จ๊ฒผ๋˜ ์„ธ์„ธํ•œ ์ปค๋ฐ‹ ๋‹จ์œ„์˜ ๋…ผ๋ฆฌ์  ํ๋ฆ„์ด๋‚˜ ํžˆ์Šคํ† ๋ฆฌ๋Š” ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์—์„œ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค. * **์žฅ๊ธฐ ๋ธŒ๋žœ์น˜(Long-lived Branches)์˜ ์œ„ํ—˜:** ๊ถŒ์žฅ๋˜๋Š” '๋‹จ๊ธฐ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜' ์›์น™์„ ์–ด๊ธฐ๊ณ  ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ๋„ˆ๋ฌด ์˜ค๋ž˜ ์œ ์ง€ํ•  ๊ฒฝ์šฐ, ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์™€์˜ ๋™๊ธฐํ™”๊ฐ€ ํฌ๊ฒŒ ํ‹€์–ด์ ธ ์ถ”ํ›„ ๊ฑฐ๋Œ€ํ•œ ๋ณ‘ํ•ฉ ์ถฉ๋Œ(Merge Conflict)์ด ๋ฐœ์ƒํ•˜๋ฉฐ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋ง‰๋Œ€ํ•œ ์‹œ๊ฐ„์ด ์†Œ๋ชจ๋ฉ๋‹ˆ๋‹ค. * **Trunk-based ๊ฐœ๋ฐœ ์ „ํ™˜ ์‹œ์˜ ์š”๊ตฌ์‚ฌํ•ญ:** ๋น ๋ฅธ ํ†ตํ•ฉ์„ ์œ„ํ•ด Trunk-based ๊ฐœ๋ฐœ๋กœ ์ „ํ™˜ํ•˜๋ ค๋ฉด ํŒ€์› ๊ฐ„์˜ ๊ธด๋ฐ€ํ•œ ์กฐ์œจ๊ณผ ๋†’์€ ์ˆ™๋ จ๋„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋…ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature Flags)๋ฅผ ๋„์ž…ํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ๊ฐ–์ถ”์–ด์•ผ ํ•˜๋Š” ์ถ”๊ฐ€์ ์ธ ๊ด€๋ฆฌ ๋ถ€๋‹ด์ด ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ## ๐Ÿ”— Knowledge Connections ### Related Concepts #### [๊ด€๊ณ„ ์œ ํ˜• A: ์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] - [[Feature-branch workflow]] - ์—ฐ๊ฒฐ ์ด์œ : ์†Œ๊ทœ๋ชจ React ํŒ€์—์„œ ์ฝ”๋“œ ์ถฉ๋Œ์„ ์ค„์ด๊ณ  ๋ฉ”์ธ ๋ธŒ๋žœ์น˜ ์•ˆ์ •์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋Š” ๊ธฐ๋ณธ Git ๋ธŒ๋žœ์น˜ ์ „๋žต์ž…๋‹ˆ๋‹ค. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ๊ฒฉ๋ฆฌํ•˜๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ํ†ตํ•ฉ(Merge)ํ•˜๋Š” ์ „์ฒด ์ˆ˜๋ช… ์ฃผ๊ธฐ ์›๋ฆฌ. - [[Conventional Commits]] - ์—ฐ๊ฒฐ ์ด์œ : ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ํ˜•์‹์„ ํ‘œ์ค€ํ™”ํ•˜์—ฌ ์ž๋™ํ™”๋œ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ ์ž‘์„ฑ๊ณผ ๋ช…ํ™•ํ•œ ์ฝ”๋“œ ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ํ•ต์‹ฌ ๊ฑฐ๋ฒ„๋„Œ์Šค ๊ทœ์น™์ž…๋‹ˆ๋‹ค. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: `feat`, `fix`, `chore` ๋“ฑ ์ปค๋ฐ‹ ํƒ€์ž…์˜ ์ •ํ™•ํ•œ ์˜๋ฏธ์™€ ๊ธฐ๊ณ„๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋Š”(machine-readable) ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•. #### [๊ด€๊ณ„ ์œ ํ˜• B: ๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ ๋ฐ ํ”„๋กœ์„ธ์Šค] - [[Pull Request (PR) Etiquette]] - ์—ฐ๊ฒฐ ์ด์œ : ์ฝ”๋“œ๊ฐ€ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ๋˜๊ธฐ ์ „ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๊ฒ€์ฆํ•˜๋Š” ์ตœ์ข… ๊ด€๋ฌธ์ด์ž, ํŒ€์› ๊ฐ„์˜ ๋น„๋™๊ธฐ์  ์†Œํ†ต๊ณผ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๊ฐ€ ์ด๋ฃจ์–ด์ง€๋Š” ํ”„๋กœ์„ธ์Šค์ž…๋‹ˆ๋‹ค. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: PR ํฌ๊ธฐ๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•˜์—ฌ ๋ฆฌ๋ทฐ ์†๋„์™€ ์ •ํ™•์„ฑ์„ ๋†’์ด๋Š” ํ˜‘์—… ์ตœ์ ํ™” ๋ฐฉ๋ฒ•. - [[Visual Regression Testing]] - ์—ฐ๊ฒฐ ์ด์œ : React UI ์ปดํฌ๋„ŒํŠธ์˜ ์‹œ๊ฐ์  ๋ณ€๊ฒฝ์‚ฌํ•ญ(๋ ˆ์ด์•„์›ƒ, ์ƒ‰์ƒ ๋“ฑ)์„ PR ๋‹จ๊ณ„์—์„œ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ๋ฆฌ๋ทฐํ•˜์—ฌ UI ๊ฒฐํ•จ์„ ๋ฐฉ์ง€ํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํŠนํ™” ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: Storybook๊ณผ Chromatic์„ ์ด์šฉํ•œ ์ž๋™ํ™”๋œ UI ๋ฆฌ๋ทฐ ์›Œํฌํ”Œ๋กœ์šฐ ๋ฐ ์‹œ๊ฐ์  ์ฐจ์ด ๋น„๊ต ์›๋ฆฌ. - [[Squash Merge]] - ์—ฐ๊ฒฐ ์ด์œ : ๋ณ‘ํ•ฉ ์‹œ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜์˜ ์—ฌ๋Ÿฌ ์ปค๋ฐ‹์„ ๋‹จ์ผ ์ปค๋ฐ‹์œผ๋กœ ์••์ถ•ํ•˜์—ฌ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๊ถŒ์žฅ ๋ณ‘ํ•ฉ ์ „๋žต์ž…๋‹ˆ๋‹ค. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋ธŒ๋žœ์น˜ ๋ณ‘ํ•ฉ ์ „๋žต์˜ ์ฐจ์ด์ ๊ณผ ๋ฒ„์ „ ๊ธฐ๋ก ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ. ### Deeper Research Questions - Git-Flow, GitHub Flow, Trunk-Based Development ๊ฐ๊ฐ์˜ ์›Œํฌํ”Œ๋กœ์šฐ๋Š” React ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ, ๋ฐฐํฌ ์ฃผ๊ธฐ, ํŒ€ ์„ฑ์ˆ™๋„์— ๋”ฐ๋ผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๊ฒŒ ์ ์šฉ๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€? - ๋‹จ๊ธฐ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜(Short-lived feature branches)๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ React ์ปดํฌ๋„ŒํŠธ ๋ฐ ๊ธฐ๋Šฅ ๋‹จ์œ„๋ฅผ ์ž‘๊ฒŒ ๋ถ„ํ• (Task breakdown)ํ•˜๋Š” ๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ ๊ธฐ์ค€์€ ๋ฌด์—‡์ธ๊ฐ€? - Conventional Commits ์‚ฌ์–‘์„ ํ”„๋ก ํŠธ์—”๋“œ CI/CD ํŒŒ์ดํ”„๋ผ์ธ(์˜ˆ: ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „ ์ž๋™ ํŽŒํ•‘, ์ฒด์ธ์ง€๋กœ๊ทธ ์ž๋™ ์ƒ์„ฑ)๊ณผ ์—ฐ๋™ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ธฐ์ˆ ์  ์ด์ ๊ณผ ๊ตฌ์„ฑ ์ƒ์˜ ์ œ์•ฝ ์‚ฌํ•ญ์€ ๋ฌด์—‡์ธ๊ฐ€? - React UI ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ PR ๋ฆฌ๋ทฐ ์‹œ, ์ „ํ†ต์ ์ธ ์ฝ”๋“œ ๋ฆฌ๋ทฐ(Code Review)์™€ Chromatic ๋“ฑ์„ ํ†ตํ•œ ์‹œ๊ฐ์  ๋ฆฌ๋ทฐ(Visual Review)๋Š” ํ”„๋กœ์„ธ์Šค ์ƒ์—์„œ ์–ด๋–ป๊ฒŒ ๊ฒฐํ•ฉํ•˜์—ฌ ์‹œ๋„ˆ์ง€๋ฅผ ๋‚ด๋Š”๊ฐ€? - ์ง€์†์ ์ธ ํ†ตํ•ฉ ๋ฐ ๋ฐฐํฌ(CI/CD)๋ฅผ ์œ„ํ•ด Trunk-based ๊ฐœ๋ฐœ์„ ๋„์ž…ํ•  ๋•Œ, React ์•„ํ‚คํ…์ฒ˜ ๋‚ด์—์„œ ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ(Feature Flags)๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•˜๊ณ  ์ ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€? ### Practical Application Contexts - **Implementation:** React ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ์„ธํŒ… ์‹œ, Husky ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ Git ํ”„๋ฆฌ์ปค๋ฐ‹ ํ›…(pre-commit hooks)์„ ์„ค์ •ํ•จ์œผ๋กœ์จ Conventional Commits ํ˜•์‹๊ณผ ๋ธŒ๋žœ์น˜ ๋ช…๋ช… ๊ทœ์น™์„ ํŒ€ ์ „์ฒด์— ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - **System Design:** ์ง€๋ผ(Jira)์™€ ๊ฐ™์€ ํ‹ฐ์ผ“ ๋ฐœํ–‰ ์‹œ์Šคํ…œ๊ณผ GitHub/GitLab์„ ์—ฐ๋™ํ•˜์—ฌ, ์ƒ์„ฑ๋œ ๋ชจ๋“  PR๊ณผ ์ปค๋ฐ‹ ๋‚ด์—ญ์ด ํŠน์ • ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ(ํ‹ฐ์ผ“ ID)๊ณผ 1:1๋กœ ๋งคํ•‘ ๋ฐ ์ถ”์  ๊ฐ€๋Šฅํ•˜๋„๋ก ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค. - **Operation / Maintenance:** ์ €์žฅ์†Œ์˜ `main` ๋ธŒ๋žœ์น˜์— ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ ๊ทœ์น™(Branch Protection Rule)์„ ์ ์šฉํ•˜์—ฌ, ์ง๋ฐฐํฌ๋ฅผ ์›์ฒœ ์ฐจ๋‹จํ•˜๊ณ  ๋ฐ˜๋“œ์‹œ 1์ธ ์ด์ƒ์˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์Šน์ธ๊ณผ CI ๋นŒ๋“œ/ํ…Œ์ŠคํŠธ(์˜ˆ: ESLint, Storybook ํ…Œ์ŠคํŠธ) ํ†ต๊ณผ๋ฅผ ์š”๊ตฌํ•˜๋„๋ก ์šด์˜ํ•ฉ๋‹ˆ๋‹ค. - **Learning Path:** ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์—์„œ๋ถ€ํ„ฐ '์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ -> ์˜๋ฏธ ์žˆ๋Š” ์›์ž์  ์ปค๋ฐ‹ ์ž‘์„ฑ -> PR ์ƒ์„ฑ -> ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ -> ์Šค์ฟผ์‹œ ๋ณ‘ํ•ฉ'์˜ ์ „์ฒด ์‚ฌ์ดํด์„ ์ฒดํ™”ํ•˜๊ณ , ์ ์ฐจ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ๋„๊ตฌ๋ฅผ PR ๋ฆฌ๋ทฐ ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. - **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ์†Œ๊ทœ๋ชจ React ํ”„๋กœ์ ํŠธ์— ๋ณต์žกํ•œ Git-Flow ๋Œ€์‹  ์ œ์•ˆ๋œ '๋ณดํ˜ธ๋œ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋ฅผ ์ง€๋‹Œ ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์›Œํฌํ”Œ๋กœ์šฐ'๋ฅผ ํ”„๋กœ์ ํŠธ ๊ทœ์น™์œผ๋กœ ์ฆ‰๊ฐ ๋„์ž…ํ•˜์—ฌ ๋ธŒ๋žœ์น˜ ๊ด€๋ฆฌ ๋น„์šฉ๊ณผ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ### Adjacent Topics - [[CI/CD Pipelines in Frontend]] - ํ™•์žฅ ๋ฐฉํ–ฅ: Git ๊ฑฐ๋ฒ„๋„Œ์Šค๋ฅผ ํ†ตํ•ด ์—„๊ฒฉํžˆ ๊ด€๋ฆฌ๋˜์–ด ๋ณ‘ํ•ฉ๋œ ์ฝ”๋“œ๊ฐ€ ์ดํ›„ ์–ด๋–ป๊ฒŒ ์ž๋™์œผ๋กœ ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ๋˜๋Š”์ง€ ํ”„๋ก ํŠธ์—”๋“œ ํŒŒ์ดํ”„๋ผ์ธ ์ „์ฒด์˜ ๊ตฌ์ถ• ๋ฐฉ๋ฒ•๋ก ์„ ํƒ๊ตฌํ•ฉ๋‹ˆ๋‹ค. - [[React Component Testing Strategies]] - ํ™•์žฅ ๋ฐฉํ–ฅ: PR์„ ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „ CI์—์„œ ํ•„์ˆ˜์ ์œผ๋กœ ํ†ต๊ณผํ•ด์•ผ ํ•˜๋Š” ํ…Œ์ŠคํŠธ(Unit, Integration, E2E)์˜ ์ข…๋ฅ˜์™€ React ์ƒํƒœ๊ณ„์—์„œ ์ด๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ์ „๋žต์„ ์กฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. --- *Last updated: 2026-04-30*