# [[CI/CD Pipeline Integration]] ## πŸ“Œ Brief 파Summary CI/CD νŒŒμ΄ν”„λΌμΈ 톡합은 ν”„λ‘ νŠΈμ—”λ“œ 개발 ν™˜κ²½μ—μ„œ μ½”λ“œ ν’ˆμ§ˆμ„ μΌκ΄€λ˜κ²Œ μœ μ§€ν•˜κ³  배포 ν”„λ‘œμ„ΈμŠ€λ₯Ό μžλ™ν™”ν•˜κΈ° μœ„ν•œ 핡심 μΈν”„λΌμž…λ‹ˆλ‹€ [1, 2]. κ°œλ°œμžκ°€ κΈ°λŠ₯ λΈŒλžœμΉ˜μ—μ„œ μž‘μ„±ν•œ μ½”λ“œκ°€ 메인 브랜치둜 병합(Merge)되기 전에 λ¦°νŒ…, ν¬λ§·νŒ…, νƒ€μž… 검사 및 μžλ™ν™”λœ UI νšŒκ·€ ν…ŒμŠ€νŠΈ λ“±μ˜ 검사λ₯Ό 의무적으둜 ν†΅κ³Όν•˜λ„λ‘ κ°•μ œν•©λ‹ˆλ‹€ [2, 3]. 이λ₯Ό 톡해 운영체제 κ°„ 파일λͺ… λŒ€μ†Œλ¬Έμž ꡬ뢄 문제둜 μΈν•œ λΉŒλ“œ μ‹€νŒ¨λ‚˜ μ˜λ„μΉ˜ μ•Šμ€ UI 결함이 ν”„λ‘œλ•μ…˜μ— λ°°ν¬λ˜λŠ” 것을 사전에 μ°¨λ‹¨ν•©λ‹ˆλ‹€ [4, 5]. ## πŸ“– Core Content - **λΉŒλ“œ μ•ˆμ •μ„± 보μž₯ 및 μ—λŸ¬ 예방:** ν”„λ‘ νŠΈμ—”λ“œ ν”„λ‘œμ νŠΈμ—μ„œ 파일λͺ… κ·œμΉ™(예: 파일λͺ…은 kebab-case, μ»΄ν¬λ„ŒνŠΈλŠ” PascalCase)을 μ—„κ²©νžˆ μ§€ν‚€μ§€ μ•ŠμœΌλ©΄, λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜μ§€ μ•ŠλŠ” 둜컬 운영체제(Windows, macOS)μ—μ„œλŠ” 정상 μž‘λ™ν•˜λ”λΌλ„ λŒ€μ†Œλ¬Έμžλ₯Ό μ—„κ²©νžˆ κ΅¬λΆ„ν•˜λŠ” CI/CD νŒŒμ΄ν”„λΌμΈ(주둜 Linux ν™˜κ²½)μ—μ„œλŠ” λΉŒλ“œ μ‹€νŒ¨λ₯Ό μœ λ°œν•©λ‹ˆλ‹€ [3, 4]. νŒŒμ΄ν”„λΌμΈμ€ μ΄λŸ¬ν•œ ν™˜κ²½ 뢈일치 였λ₯˜λ₯Ό λ°©μ§€ν•˜λŠ” 1μ°¨ λ°©μ–΄μ„  역할을 ν•©λ‹ˆλ‹€. - **Pull Request (PR) μžλ™ν™” 검사:** GitHub Flow와 같은 λͺ¨λ˜ 브랜치 μ›Œν¬ν”Œλ‘œμš°μ—μ„œ CI/CD νŒŒμ΄ν”„λΌμΈμ€ PR의 μ΅œμ’… ν’ˆμ§ˆ ν†΅μ œ κ΄€λ¬Έ(Gate) 역할을 ν•©λ‹ˆλ‹€ [6]. PR이 열리면 CI νŒŒμ΄ν”„λΌμΈμ΄ μžλ™μœΌλ‘œ ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•˜λ©°, λͺ¨λ“  검사(Checks)λ₯Ό ν†΅κ³Όν•˜κ³  λ™λ£Œμ˜ 리뷰λ₯Ό 마친 ν›„μ—λ§Œ 메인 브랜치 병합을 ν—ˆμš©ν•©λ‹ˆλ‹€ [2, 7, 8]. - **μ‹œκ°μ  νšŒκ·€ 및 μ ‘κ·Όμ„± ν…ŒμŠ€νŠΈ 톡합:** CI μ›Œν¬ν”Œλ‘œμš°(예: GitHub Actions, GitLab Pipelines λ“±)에 Chromaticμ΄λ‚˜ Happo와 같은 도ꡬλ₯Ό ν†΅ν•©ν•˜μ—¬ μžλ™ν™”λœ μ‹œκ°μ  ν…ŒμŠ€νŠΈ(Visual Regression Testing)와 μ ‘κ·Όμ„± ν…ŒμŠ€νŠΈ(Accessibility Testing)λ₯Ό μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [5, 9, 10]. μ½”λ“œκ°€ λ³€κ²½λ˜λ©΄ νŒŒμ΄ν”„λΌμΈ λ‚΄μ—μ„œ μ‹€μ œ λΈŒλΌμš°μ € ν™˜κ²½μ„ λͺ¨λ°©ν•˜μ—¬ UI μ»΄ν¬λ„ŒνŠΈμ˜ μŠ€ν¬λ¦°μƒ·μ„ μΊ‘μ²˜ν•˜κ³ , 이λ₯Ό κΈ°μ‘΄ 기쀀점(Baseline)κ³Ό ν”½μ…€ λ‹¨μœ„λ‘œ λΉ„κ΅ν•©λ‹ˆλ‹€ [11, 12]. λ ˆμ΄μ•„μ›ƒμ΄λ‚˜ 색상에 μ˜λ„μΉ˜ μ•Šμ€ 변경이 λ°œμƒν•˜λ©΄ PR에 μ‹€νŒ¨ λ°°μ§€(Badge)λ₯Ό 달아 μˆ˜λ™ 리뷰λ₯Ό κ°•μ œν•©λ‹ˆλ‹€ [5, 10]. - **μ›Œν¬ν”Œλ‘œμš° 연계 및 릴리슀 배포:** λ‹¨μˆœν•œ 브랜칭 μ›Œν¬ν”Œλ‘œμš°λ₯Ό μ‚¬μš©ν•  경우, 메인 λΈŒλžœμΉ˜λŠ” 항상 μ•ˆμ •μ μ΄κ³  배포 κ°€λŠ₯ν•œ μƒνƒœλ₯Ό μœ μ§€ν•΄μ•Ό ν•©λ‹ˆλ‹€ [13]. CI/CDλŠ” 메인 λΈŒλžœμΉ˜μ— μ½”λ“œκ°€ 병합됨과 λ™μ‹œμ— μžλ™μœΌλ‘œ ν”„λ‘œλ•μ…˜μ— 배포(Deploy from main)ν•˜λ„λ‘ μ„€μ •λ˜λ©°, 컀밋 λ©”μ‹œμ§€ κ·œμΉ™(Conventional Commits)을 기반으둜 릴리슀 λ…ΈνŠΈλ₯Ό μžλ™ν™”ν•˜λŠ” 데에도 ν™œμš©λ©λ‹ˆλ‹€ [6, 14]. ## βš–οΈ Trade-offs & Caveats **μ†ŒμŠ€μ— κ΄€λ ¨ 정보가 λΆ€μ‘±ν•©λ‹ˆλ‹€.** (제곡된 μ†ŒμŠ€μ—λŠ” CI/CD νŒŒμ΄ν”„λΌμΈ 자체의 μ•„ν‚€ν…μ²˜μ  λ‹¨μ μ΄λ‚˜ ꡬ좕 λΉ„μš© 등에 λŒ€ν•œ 심측적인 λ…Όμ˜κ°€ ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.) λ‹€λ§Œ, νŒŒμ΄ν”„λΌμΈμ— ν†΅ν•©λœ μ‹œκ°μ  ν…ŒμŠ€νŠΈ(Visual Testing) κΈ°λŠ₯κ³Ό κ΄€λ ¨ν•˜μ—¬ λ‹€μŒκ³Ό 같은 기술적 μ œμ•½ 및 관리 μš”μ†Œκ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€: - **Flaky Tests 및 μ˜€νƒ(False Positives):** UI ν…ŒμŠ€νŠΈ νŠΉμ„±μƒ μ• λ‹ˆλ©”μ΄μ…˜, 비동기 에셋 λ‘œλ”© λ“±μœΌλ‘œ 인해 λΆˆμ•ˆμ •ν•œ ν…ŒμŠ€νŠΈ κ²°κ³Όκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€ [9, 15]. - **λ…Έμ΄μ¦ˆ 관리 ν•„μš”:** 이미지 μ••μΆ• λ…Έμ΄μ¦ˆλ‚˜ λΈŒλΌμš°μ € μ•ˆν‹°μ•¨λ¦¬μ–΄μ‹± 차이 λ“± μ˜λ„μΉ˜ μ•Šμ€ λ―Έμ„Έν•œ 차이둜 인해 CIκ°€ μ‹€νŒ¨ν•˜λŠ” 것을 막기 μœ„ν•΄, 색상 ν—ˆμš© 였차(color-delta tolerance)λ₯Ό 적절히 μ„€μ •ν•΄μ•Όλ§Œ νŒŒμ΄ν”„λΌμΈμ΄ μ€‘λ‹¨λ˜λŠ” 것을 λ°©μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [9, 16]. ## πŸ”— Knowledge Connections ### Related Concepts #### [관계 μœ ν˜• A: 개발 μ›Œν¬ν”Œλ‘œμš° 및 ν˜•μƒ 관리] - [[Git Branching Strategies]] - μ—°κ²° 이유: CI/CD 톡합은 νŒ€μ˜ 브랜칭 μ „λž΅(특히 Trunk-based λ˜λŠ” GitHub Flow)κ³Ό 맞물렀 μž‘λ™ν•˜λ©°, 짧은 주기의 λΈŒλžœμΉ˜κ°€ μƒμ„±λ˜κ³  병합될 λ•Œλ§ˆλ‹€ μ½”λ“œλ₯Ό κ²€μ¦ν•˜λŠ” 기반이 λ©λ‹ˆλ‹€ [13, 14]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: CI/CD νŒŒμ΄ν”„λΌμΈμ΄ 메인 브랜치 보호(Branch protection) 및 배포 μžλ™ν™”μ— μ–΄λ–»κ²Œ κΈ°μ—¬ν•˜λŠ”μ§€ μ›Œν¬ν”Œλ‘œμš° κ΄€μ μ—μ„œ 이해할 수 μžˆμŠ΅λ‹ˆλ‹€ [2, 17]. #### [관계 μœ ν˜• B: ν’ˆμ§ˆ 보증 및 μžλ™ν™” 도ꡬ] - [[Visual Regression Testing]] - μ—°κ²° 이유: CI/CD νŒŒμ΄ν”„λΌμΈ λ‚΄λΆ€μ—μ„œ UI 버그가 ν”„λ‘œλ•μ…˜μ— λ„λ‹¬ν•˜λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ μŠ€ν† λ¦¬λΆ(Storybook)κ³Ό ν•¨κ»˜ μžλ™μœΌλ‘œ μ‹€ν–‰λ˜λŠ” 핡심 ν…ŒμŠ€νŠΈ ν”„λ‘œμ„ΈμŠ€μž…λ‹ˆλ‹€ [5, 18]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: νŒŒμ΄ν”„λΌμΈμ΄ λ‹¨μˆœνžˆ μ½”λ“œ μ—λŸ¬λ§Œ μž‘λŠ” 것을 λ„˜μ–΄ ν”½μ…€ λ‹¨μœ„μ˜ UI λ ˆμ΄μ•„μ›ƒ, λ°˜μ‘ν˜• λ””μžμΈ, μ ‘κ·Όμ„±(A11y)κΉŒμ§€ μ–΄λ–»κ²Œ κ²€μ¦ν•˜λŠ”μ§€ νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [11, 18]. #### [관계 μœ ν˜• C: μ½”λ“œ μ»¨λ²€μ…˜ 및 정적 뢄석] - [[Linting and Governance]] - μ—°κ²° 이유: CI/CD ν™˜κ²½μ΄λ‚˜ κ·Έ 이전(Git Hook 단계)에 Husky, ESLint, Prettier 등을 톡해 μ•„ν‚€ν…μ²˜ κ·œμΉ™(예: Feature κ°„ 잘λͺ»λœ μž„ν¬νŠΈ)κ³Ό λͺ…λͺ… κ·œμΉ™μ„ κ°•μ œλ‘œ κ²€μ¦ν•©λ‹ˆλ‹€ [3, 19]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: μžλ™ν™”λœ νŒŒμ΄ν”„λΌμΈμ΄ 개발자의 μˆ˜λ™ 리뷰 뢀담을 쀄이고 ν”„λ‘œμ νŠΈμ˜ κ±°λ²„λ„ŒμŠ€λ₯Ό μ‹œμŠ€ν…œμ μœΌλ‘œ μ–΄λ–»κ²Œ μœ μ§€ν•˜λŠ”μ§€ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€ [3]. ### Deeper Research Questions - λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜μ§€ μ•ŠλŠ” 개발자의 둜컬 OS ν™˜κ²½κ³Ό μ—„κ²©ν•˜κ²Œ κ΅¬λΆ„ν•˜λŠ” CI/CD λ¦¬λˆ…μŠ€ μ„œλ²„ ν™˜κ²½ κ°„μ˜ λΉŒλ“œ μ‹€νŒ¨(Build Failure) 격차λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ νŒŒμ΄ν”„λΌμΈ μ„€μ • 기법은 무엇인가? - CI/CD ν™˜κ²½μ—μ„œ Chromaticμ΄λ‚˜ Happoλ₯Ό ν™œμš©ν•œ μ‹œκ°μ  νšŒκ·€ ν…ŒμŠ€νŠΈ μˆ˜ν–‰ μ‹œ λ°œμƒν•˜λŠ” 속도 μ €ν•˜λ₯Ό μ΅œμ†Œν™”ν•˜κ³ , 닀쀑 λΈŒλΌμš°μ € 병렬 ν…ŒμŠ€νŠΈλ₯Ό 효율적으둜 κ΅¬μ„±ν•˜λŠ” μ•„ν‚€ν…μ²˜λŠ” 무엇인가? - λŒ€κ·œλͺ¨ React ν”„λ‘œμ νŠΈμ—μ„œ Feature-Sliced Design(FSD) 원칙을 λ„μž…ν–ˆμ„ λ•Œ, CI νŒŒμ΄ν”„λΌμΈμ˜ ESLint λ£°(Rule) 섀정을 톡해 μ»΄ν¬λ„ŒνŠΈ κ°„μ˜ 잘λͺ»λœ μ˜μ‘΄μ„±(Coupling)을 μ–΄λ–»κ²Œ μžλ™ 차단할 수 μžˆλŠ”κ°€? - 컀밋 λ©”μ‹œμ§€ κ·œμ•½(Conventional Commits)을 톡해 CI/CD νŒŒμ΄ν”„λΌμΈμ—μ„œ μ‹œλ§¨ν‹± 버저닝(Semantic Versioning)κ³Ό 릴리슀 λ…ΈνŠΈλ₯Ό μ™„μ „νžˆ μžλ™ν™”ν•˜λŠ” ꡬ체적인 μ›Œν¬ν”Œλ‘œμš° ꡬ성 방법은 무엇인가? ### Practical Application Contexts - **Implementation:** GitHub Actions, GitLab Pipelines, CircleCI λ“±μ˜ CI 제곡 ν™˜κ²½μ— Happo λ˜λŠ” Chromatic을 μ—°λ™ν•˜λŠ” μŠ€ν…μ„ μΆ”κ°€ν•˜κ³  인증을 μœ„ν•œ ν™˜κ²½ λ³€μˆ˜(Project Token)λ₯Ό κ΅¬μ„±ν•˜μ—¬ μ‹œκ°μ  검증을 μžλ™ν™”ν•©λ‹ˆλ‹€ [10]. - **System Design:** μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ `main` 브랜치λ₯Ό 보호(Protected Branch) μƒνƒœλ‘œ μ„€μ •ν•˜κ³ , 1λͺ… μ΄μƒμ˜ λ™λ£Œ 리뷰와 CI ν…ŒμŠ€νŠΈ(λ¦°νŒ…, λ‹¨μœ„ ν…ŒμŠ€νŠΈ, μ‹œκ°μ  ν…ŒμŠ€νŠΈ)λ₯Ό ν†΅κ³Όν•΄μ•Όλ§Œ 병합(Merge)이 κ°€λŠ₯ν•œ κ°•μ œμ  μ‹œμŠ€ν…œ(Gate)을 μ„€κ³„ν•©λ‹ˆλ‹€ [2, 17]. - **Operation / Maintenance:** CI κ³Όμ •μ—μ„œ UI λ³€κ²½ 사항이 κ°μ§€λ˜λ©΄ 리뷰어가 λ³€κ²½ λ‚΄μš©μ„ ν™•μΈν•˜κ³ , μ˜λ„λœ 변경일 경우 λ‘œμ»¬μ΄λ‚˜ CI λŒ€μ‹œλ³΄λ“œμ—μ„œ μƒˆλ‘œμš΄ 베이슀라인(Baseline)으둜 승인(Accept)ν•˜μ—¬ ν…ŒμŠ€νŠΈ 기쀀을 κ°±μ‹ ν•©λ‹ˆλ‹€ [20, 21]. - **Learning Path:** React μ»΄ν¬λ„ŒνŠΈ 및 둜컬 μƒνƒœ 개발 βž” 정적 뢄석 도ꡬ(ESLint) 및 Git Hooks(Husky) 적용 βž” 브랜치 관리 μ „λž΅ λ„μž… βž” **CI/CD νŒŒμ΄ν”„λΌμΈ ꡬ좕 및 Storybook UI ν…ŒμŠ€νŠΈ 연동** βž” ν”„λ‘œλ•μ…˜ μžλ™ 배포. - **My Project Relevance:** νŒ€ λ‹¨μœ„ ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•  λ•Œ 각자의 ν™˜κ²½ 차이둜 μΈν•œ λΉŒλ“œ μ—λŸ¬λ₯Ό 막고, λ³΅μž‘ν•œ 둜직 및 UIκ°€ ν¬ν•¨λœ μ½”λ“œκ°€ μˆ˜λ™ ν™•μΈμ˜ ν•œκ³„λ‘œ 인해 버그λ₯Ό λ°œμƒμ‹œν‚€λŠ” 것을 미연에 λ°©μ§€ν•˜κΈ° μœ„ν•΄ μ¦‰μ‹œ μ„€μ •ν•΄μ•Ό ν•  핡심 개발 μΈν”„λΌμž…λ‹ˆλ‹€. ### Adjacent Topics - [[Storybook]] - ν™•μž₯ λ°©ν–₯: CI νŒŒμ΄ν”„λΌμΈμ—μ„œ λ Œλ”λ§ν•˜κ³  ν…ŒμŠ€νŠΈν•  UI μ»΄ν¬λ„ŒνŠΈλ“€μ„ 격리된 ν™˜κ²½μ—μ„œ λ¬Έμ„œν™”ν•˜κ³  μΈν„°λž™μ…˜μ„ μ •μ˜ν•˜λŠ” 기반 λ„κ΅¬λ‘œμ„œμ˜ ν™œμš©λ²• 탐ꡬ [12, 22]. - [[Husky & Git Hooks]] - ν™•μž₯ λ°©ν–₯: 원격 CI νŒŒμ΄ν”„λΌμΈμ— μ½”λ“œκ°€ λ„λ‹¬ν•˜κΈ° μ „, 개발자의 둜컬 ν™˜κ²½μ—μ„œ 컀밋을 μ‹œλ„ν•˜λŠ” μ‹œμ μ— 미리 μ½”λ“œ ν’ˆμ§ˆ 검증(Linting/Formatting)을 κ°•μ œν•˜λŠ” 방법 탐ꡬ [3]. --- *Last updated: 2026-04-30*