# [[Code Review]] ## πŸ“Œ Brief Summary μ½”λ“œ 리뷰(Code Review)λŠ” κ°œλ°œμžκ°€ μž‘μ„±ν•œ μ½”λ“œλ₯Ό 메인 λΈŒλžœμΉ˜μ— λ³‘ν•©ν•˜κΈ° 전에 νŒ€μ›(λ™λ£Œ)이 κ²€ν† ν•˜μ—¬ μŠΉμΈν•˜λŠ” ν’ˆμ§ˆ 관리 및 ν˜‘μ—… ν”„λ‘œμ„ΈμŠ€μž…λ‹ˆλ‹€ [1, 2]. 주둜 Pull Request(PR) 단계λ₯Ό 톡해 이루어지며, λ‹¨λ…μœΌλ‘œ 잘λͺ»λœ μ½”λ“œκ°€ λ³‘ν•©λ˜λŠ” 것을 λ°©μ§€ν•˜κ³  νŒ€ λ‚΄ λΉ λ₯Έ ν”Όλ“œλ°± 루프λ₯Ό ν˜•μ„±ν•©λ‹ˆλ‹€ [1]. 졜근 ν”„λ‘ νŠΈμ—”λ“œ ν™˜κ²½μ—μ„œλŠ” λ‹¨μˆœν•œ μ½”λ“œ κ²€ν† λ₯Ό λ„˜μ–΄ Storybookκ³Ό 같은 도ꡬλ₯Ό CI νŒŒμ΄ν”„λΌμΈκ³Ό κ²°ν•©ν•œ 'μ‹œκ°μ  리뷰(Visual Review)'둜 ν™•μž₯λ˜μ–΄ μ˜λ„μΉ˜ μ•Šμ€ UI 변경을 λ°©μ§€ν•˜λŠ” 역할도 μˆ˜ν–‰ν•©λ‹ˆλ‹€ [3]. ## πŸ“– Core μ†ŒμŠ€μ— κΈ°λ°˜ν•œ Core Content - **λ™λ£Œ κ²€ν† (Peer Review)의 μ—­ν•  및 이점**: κ°œλ°œμžλŠ” κΈ°λŠ₯ 브랜치(feature branch)μ—μ„œ μž‘μ—…μ„ 마친 ν›„ 병합을 μœ„ν•œ Pull Request(PR)λ₯Ό μƒμ„±ν•˜λ©°, μ΄λ•Œ μ΅œμ†Œ 1λͺ… μ΄μƒμ˜ νŒ€μ›μ—κ²Œ 검토와 μŠΉμΈμ„ λ°›μ•„μ•Ό ν•©λ‹ˆλ‹€ [1, 4]. λ¦¬λ·°μ–΄λŠ” λ³€κ²½λœ μ½”λ“œμ— λŒ€ν•΄ μ½”λ©˜νŠΈλ₯Ό 남기며, μž‘μ„±μžκ°€ 이λ₯Ό μˆ˜μ •ν•˜κ³  μž¬ν‘Έμ‹œ(push)ν•˜μ—¬ μ΅œμ’… μŠΉμΈμ„ λ°›μœΌλ©΄ 병합이 μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€ [5]. μ΄λŠ” 단일 개발자의 μ‹€μˆ˜λ‘œ μΈν•œ 잘λͺ»λœ 병합을 막고, νŒ€μ› κ°„μ˜ κ±΄μ „ν•œ 리뷰 μŠ΅κ΄€κ³Ό ν˜‘μ—…μ„ μ΄‰μ§„ν•©λ‹ˆλ‹€ [1, 6]. - **효율적인 PR 에티켓**: μ›ν™œν•œ μ½”λ“œ 리뷰λ₯Ό μœ„ν•΄μ„œλŠ” PR을 μž‘κ²Œ μœ μ§€ν•˜κ³  단일 μž‘μ—…(Single task)에 μ§‘μ€‘ν•˜λŠ” 것이 λͺ¨λ²” μ‚¬λ‘€μž…λ‹ˆλ‹€ [2]. 리뷰어가 ν•œ λ²ˆμ— 2,000쀄 μ΄μƒμ˜ λ°©λŒ€ν•œ μ½”λ“œλ₯Ό κ²€μ‚¬ν•˜λ„λ‘ μš”κ΅¬ν•΄μ„œλŠ” μ•ˆ 되며, PR 규λͺ¨κ°€ μž‘μ„μˆ˜λ‘ 더 λΉ λ₯΄κ³  μ² μ €ν•˜κ²Œ 검토될 수 μžˆμŠ΅λ‹ˆλ‹€ [2, 7]. - **μ‹œκ°μ  리뷰(Visual Review)의 λ„μž…**: ν”„λ‘ νŠΈμ—”λ“œ 개발의 PR ν”„λ‘œμ„ΈμŠ€μ—μ„œλŠ” μ½”λ“œμ˜ 논리 κ²€ν† λΏλ§Œ μ•„λ‹ˆλΌ μ‹œκ°μ  νšŒκ·€(Visual Regression) κ²€ν† κ°€ ν•„μˆ˜κ°€ λ˜μ—ˆμŠ΅λ‹ˆλ‹€ [3]. κ°œλ°œμžλŠ” Storybook을 ν™œμš©ν•΄ μ»΄ν¬λ„ŒνŠΈλ₯Ό λΆ„λ¦¬ν•˜μ—¬ κ΅¬μΆ•ν•˜κ³ , Chromaticμ΄λ‚˜ Happo λ“±μ˜ 도ꡬλ₯Ό CI νŒŒμ΄ν”„λΌμΈμ— ν†΅ν•©ν•©λ‹ˆλ‹€ [3, 8]. - **μžλ™ν™”λœ μ‹œκ°μ  νšŒκ·€ 감지**: PR이 열리면 이 도ꡬ듀이 μ—¬λŸ¬ λΈŒλΌμš°μ € 및 뷰포트 ν™˜κ²½μ—μ„œ μžλ™μœΌλ‘œ λͺ¨λ“  UI μƒνƒœμ˜ μŠ€ν¬λ¦°μƒ·μ„ μΊ‘μ²˜ν•˜κ³  이전 κΈ°μ€€μ„ (baseline)κ³Ό λΉ„κ΅ν•©λ‹ˆλ‹€ [9, 10]. λ ˆμ΄μ•„μ›ƒμ΄λ‚˜ 색상 등에 μ˜λ„μΉ˜ μ•Šμ€ λ³€κ²½ 사항이 발견되면 PR에 ν•΄λ‹Ή 사항이 μˆ˜λ™ κ²€ν†  λŒ€μƒμœΌλ‘œ ν‘œμ‹œ(flagged)λ˜μ–΄ 버그가 ν”„λ‘œλ•μ…˜ ν™˜κ²½μœΌλ‘œ λ°°ν¬λ˜λŠ” 것을 μ°¨λ‹¨ν•©λ‹ˆλ‹€ [3]. λ”λΆˆμ–΄, μ‹œκ°μ  κ²€ν†  λ„κ΅¬λŠ” μ‹œκ°μ  λ³€κ²½ 사항과 ν•¨κ»˜ μƒˆλ‘œμš΄ μ ‘κ·Όμ„± μœ„λ°˜(accessibility violations)κΉŒμ§€ 포착할 수 μžˆμŠ΅λ‹ˆλ‹€ [9, 11]. ## βš–οΈ Trade-offs & Caveats - **리뷰 병λͺ© ν˜„μƒ 및 λ³΅μž‘λ„ 증가**: ν•œ λ²ˆμ— 수천 쀄에 λ‹¬ν•˜λŠ” 큰 규λͺ¨μ˜ μ½”λ“œ(PR)λ₯Ό λ¦¬λ·°ν•˜λ„λ‘ μš”μ²­ν•  경우, 리뷰어가 μ½”λ“œλ₯Ό μ² μ €νžˆ 감사(audit)ν•˜κΈ° μ–΄λ €μ›Œ 리뷰 속도와 ν’ˆμ§ˆμ΄ λͺ¨λ‘ μ €ν•˜λ˜λŠ” λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€ [2]. 이λ₯Ό ν”Όν•˜κΈ° μœ„ν•΄μ„œλŠ” PR을 맀우 μž‘κ²Œ λ‚˜λˆ„μ–΄ μ§€μ†μ μœΌλ‘œ 리뷰해야 ν•˜λ―€λ‘œ, κ°œλ°œμžλŠ” μž‘μ—… λ‹¨μœ„λ₯Ό μ„Έλ°€ν•˜κ²Œ μͺΌκ°œμ•Ό ν•˜λŠ” 좔가적인 λ…Έλ ₯이 ν•„μš”ν•©λ‹ˆλ‹€ [2, 7]. - **μ‹œκ°μ  ν…ŒμŠ€νŠΈμ˜ λΆˆμ•ˆμ •μ„±(Flake) 이슈**: μ‹œκ°μ  리뷰λ₯Ό μœ„ν•΄ μŠ€ν¬λ¦°μƒ· 기반 ν…ŒμŠ€νŠΈλ₯Ό λ„μž…ν•  λ•Œ, μ»΄ν¬λ„ŒνŠΈμ˜ κΈ°λŠ₯적 변경이 없더라도 μ••μΆ• λ…Έμ΄μ¦ˆ, μ•ˆν‹°μ•¨λ¦¬μ–΄μ‹±, 비동기 에셋(폰트 λ“±), μ• λ‹ˆλ©”μ΄μ…˜ λ“±μœΌλ‘œ 인해 λ―Έμ„Έν•œ ν”½μ…€ 차이가 λ°œμƒν•˜μ—¬ 였λ₯˜λ‘œ μ²˜λ¦¬λ˜λŠ” κ±°μ§“ μ–‘μ„±(False positive) λ¬Έμ œκ°€ 생길 수 μžˆμŠ΅λ‹ˆλ‹€ [8, 12]. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 색상 였차 ν—ˆμš© λ²”μœ„(color-delta tolerance)λ₯Ό μ„€μ •ν•˜κ±°λ‚˜ μ• λ‹ˆλ©”μ΄μ…˜μ„ μŒμ†Œκ±°ν•˜λŠ” λ“±μ˜ 좔가적인 ꡬ성(Configuration)κ³Ό 관리가 μš”κ΅¬λ©λ‹ˆλ‹€ [8, 12, 13]. ## πŸ”— Knowledge Connections ### Related Concepts #### [ν˜‘μ—… 및 ν˜•μƒ 관리 μ›Œν¬ν”Œλ‘œμš°] - [[Pull Request (PR)]] - μ—°κ²° 이유: μ½”λ“œ 리뷰가 μ‹€μ§ˆμ μœΌλ‘œ μš”μ²­λ˜κ³ , κ²€ν†  ν”Όλ“œλ°±μ΄ μ˜€κ°€λŠ” 핡심 ν”Œλž«νΌμ΄μž λ‹¨μœ„μž…λ‹ˆλ‹€ [1, 2]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: 브랜치 병합 μ „ ν’ˆμ§ˆ 관리 κ²Œμ΄νŠΈλ‘œμ„œμ˜ κΈ°λŠ₯κ³Ό μ§§κ³  λͺ…ν™•ν•œ μž‘μ—… λ‹¨μœ„ λΆ„ν• μ˜ μ€‘μš”μ„±μ„ νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€. - [[Feature Branch Workflow]] - μ—°κ²° 이유: μ½”λ“œ 리뷰 μ‹œμŠ€ν…œμ„ μ‰½κ²Œ λ„μž…ν•˜κΈ° μœ„ν•œ κ°€μž₯ 기본적이고 좩돌이 적은 브랜치 μ „λž΅μž…λ‹ˆλ‹€ [14, 15]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: 메인 브랜치λ₯Ό 항상 μ•ˆμ •μ μœΌλ‘œ μœ μ§€ν•˜λ©΄μ„œ, 각각의 νƒœμŠ€ν¬λ₯Ό λ…λ¦½λœ λΈŒλžœμΉ˜μ—μ„œ μž‘μ—…ν•˜κ³  리뷰λ₯Ό 톡해 κ²€μ¦ν•˜λŠ” 전체 흐름을 이해할 수 μžˆμŠ΅λ‹ˆλ‹€. #### [μžλ™ν™” 및 ν’ˆμ§ˆ 검증 도ꡬ] - [[Visual Regression Testing]] - μ—°κ²° 이유: ν”„λ‘ νŠΈμ—”λ“œ μ½”λ“œ 리뷰 μ‹œ μœ‘μ•ˆμœΌλ‘œ ν™•μΈν•˜κΈ° νž˜λ“  μ˜λ„μΉ˜ μ•Šμ€ λ ˆμ΄μ•„μ›ƒ/색상 변경을 μžλ™ν™” 도ꡬ가 μ‹œκ°μ μœΌλ‘œ μ°Ύμ•„λ‚΄μ–΄ λ¦¬λ·°μ–΄μ—κ²Œ μ œμ‹œν•©λ‹ˆλ‹€ [3, 9]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: Chromaticμ΄λ‚˜ Happoλ₯Ό CI νŒŒμ΄ν”„λΌμΈκ³Ό κ²°ν•©ν•˜μ—¬ PR 리뷰의 정확도λ₯Ό 높이고 μ•ˆμ •μ μΈ UIλ₯Ό λ°°ν¬ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό 배울 수 μžˆμŠ΅λ‹ˆλ‹€. ### Deeper Research Questions - PR의 크기λ₯Ό μž‘κ²Œ μœ μ§€ν•˜κ³  단일 μž‘μ—…(Single task)에 μ§‘μ€‘ν•˜λ„λ‘ λ…Όλ¦¬μ μœΌλ‘œ μž‘μ—…μ„ λΆ„ν• ν•˜λŠ” κ°€μž₯ 효과적인 방법둠과 기쀀은 무엇인가? - λŒ€κ·œλͺ¨ νŒ€μ—μ„œ μŸμ•„μ§€λŠ” μˆ˜λ§Žμ€ PRκ³Ό μ½”λ“œ 리뷰 μš”μ²­μ„ 병λͺ© ν˜„μƒ 없이 효율적으둜 μ²˜λ¦¬ν•˜κ³  배포 속도λ₯Ό μœ μ§€ν•˜κΈ° μœ„ν•œ μ „λž΅μ€ 무엇인가? - μ‹œκ°μ  νšŒκ·€ ν…ŒμŠ€νŠΈ(Visual Regression Testing) μ‹œ λ°œμƒν•˜λŠ” λ―Έμ„Έν•œ λ Œλ”λ§ 차이(Flake)λ₯Ό λ°©μ§€ν•˜κ³  μ‹ λ’°ν•  수 μžˆλŠ” κΈ°μ€€μ„ (Baseline)을 μœ μ§€ν•˜κΈ° μœ„ν•œ ꡬ체적인 ꡬ성 μ΅œμ ν™” 방법은 무엇인가? - μ½”λ“œ 리뷰 μ‹œ μ‹œκ°μ  νšŒκ·€(Visual changes) κ°μ§€λΏλ§Œ μ•„λ‹ˆλΌ, μ ‘κ·Όμ„± ν…ŒμŠ€νŠΈ(Accessibility tests)λ₯Ό ν•¨κ»˜ μžλ™ν™”ν–ˆμ„ λ•Œ μ–»κ²Œ λ˜λŠ” 이점과 이λ₯Ό μ²˜λ¦¬ν•˜λŠ” λ‚΄λΆ€ λ™μž‘ μ›λ¦¬λŠ” 무엇인가? - κΈ°λŠ₯ λΆ„κΈ°(Feature branch)의 수λͺ…이 κΈΈμ–΄μ‘Œμ„ λ•Œ λ°œμƒν•˜λŠ” 리뷰 및 병합 좩돌 문제λ₯Ό ν•΄κ²°ν•˜κ³ , μ§€μ†μ μœΌλ‘œ 짧은 주기의 리뷰λ₯Ό μœ λ„ν•˜λŠ” λ¬Έν™”λŠ” μ–΄λ–»κ²Œ μ •μ°©μ‹œν‚¬ 수 μžˆλŠ”κ°€? ### Practical Application Contexts - **Implementation:** μ½”λ“œλ₯Ό μ»€λ°‹ν•˜κ³  PR을 생성할 λ•Œ, 리뷰어가 μ‰½κ²Œ μ½”λ“œλ₯Ό νŒŒμ•…ν•  수 μžˆλ„λ‘ 200쀄 미만의 μž‘μ€ λ‹¨μœ„λ‘œ λ³€κ²½ 사항을 μͺΌκ°œμ–΄ 올리고 무엇이 μ™œ λ³€κ²½λ˜μ—ˆλŠ”μ§€ λͺ…ν™•νžˆ λͺ…μ‹œν•΄μ•Ό ν•©λ‹ˆλ‹€ [2, 7]. - **System Design:** ν”„λ‘ νŠΈμ—”λ“œ 섀계 μ‹œ Storybook을 ν™œμš©ν•˜μ—¬ λͺ¨λ“  UI μ»΄ν¬λ„ŒνŠΈμ˜ λ‹€μ–‘ν•œ μƒνƒœ(loading, error λ“±)λ₯Ό μΊ‘μŠν™”ν•΄ 두면, μ½”λ“œ 리뷰 μ‹œμ— 이 μƒνƒœλ“€μ„ μžλ™μœΌλ‘œ μŠ€ν¬λ¦°μƒ·μœΌλ‘œ 찍어 검증할 수 μžˆλŠ” 기반 μ‹œμŠ€ν…œμ΄ λ§Œλ“€μ–΄μ§‘λ‹ˆλ‹€ [16]. - **Operation / Maintenance:** CI/CD νŒŒμ΄ν”„λΌμΈ 단계에 Chromaticμ΄λ‚˜ Happo 같은 도ꡬλ₯Ό μ—°λ™μ‹œμΌœ, νŒ€μ›μ΄ PR을 생성할 λ•Œλ§ˆλ‹€ μ‹œκ°μ  변동 사항(diff)μ΄λ‚˜ μ ‘κ·Όμ„± μœ„λ°˜ 내역이 PR 체크 λ¦¬μŠ€νŠΈμ— λ°°μ§€λ‘œ μžλ™ λ³΄κ³ λ˜λ„λ‘ 운영 ν™˜κ²½μ„ κ΅¬μΆ•ν•©λ‹ˆλ‹€ [17]. - **Learning Path:** Git의 기초적인 브랜치 μ‚¬μš©λ²•μ„ 배운 ν›„, νŒ€ ν˜‘μ—…μ˜ 핡심인 PR 생성 및 리뷰 μš”μ²­ κ³Όμ •(GitHub Flow λ“±)을 읡히고, λ‚˜μ•„κ°€ μ‹œκ°μ  ν…ŒμŠ€νŒ… 도ꡬ가 PR에 μ–΄λ–»κ²Œ ν”Όλ“œλ°±μ„ μ£ΌλŠ”μ§€λ₯Ό μ‹€μŠ΅ν•΄λ³΄λŠ” νλ¦„μœΌλ‘œ ν•™μŠ΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [8, 18]. - **My Project Relevance:** μ†Œκ·œλͺ¨ 3인 νŒ€ ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•  λ•Œ λ³΅μž‘ν•œ Git-Flow λŒ€μ‹  κΈ°λŠ₯ 브랜치 μ›Œν¬ν”Œλ‘œμš°λ₯Ό μ±„νƒν•˜κ³ , μ½”λ“œ 병합 μ‹œ λ°˜λ“œμ‹œ 1λͺ… μ΄μƒμ˜ ν”Όμ–΄ 리뷰(Peer review)λ₯Ό 받도둝 κ·œμΉ™μ„ μ •ν•΄ 버그 μ—†λŠ” μ•ˆμ •μ  메인 브랜치λ₯Ό μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [1, 14]. ### Adjacent Topics - [[Continuous Integration (CI)]] - ν™•μž₯ λ°©ν–₯: PR이 μ˜¬λΌμ™”μ„ λ•Œ μ½”λ“œ 리뷰λ₯Ό 돕기 μœ„ν•΄ 사전에 ν…ŒμŠ€νŠΈ 톡과 μ—¬λΆ€, λΉŒλ“œ 성곡 μ—¬λΆ€ 등을 μžλ™μœΌλ‘œ κ²€μ‚¬ν•΄μ£ΌλŠ” μžλ™ν™” νŒŒμ΄ν”„λΌμΈμ˜ ꡬ좕에 λŒ€ν•΄ ν•™μŠ΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [7, 19]. --- *Last updated: 2026-04-30*