# [[DRY]] ## πŸ“Œ Brief Summary DRY(Don't Repeat Yourself)λŠ” λ™μΌν•œ μ½”λ“œλ₯Ό 두 번 μž‘μ„±ν•˜μ§€ μ•Šκ³  κΈ°μ‘΄ μ½”λ“œλ₯Ό μž¬μ‚¬μš©ν•΄μ•Ό ν•œλ‹€λŠ” 핡심 μ†Œν”„νŠΈμ›¨μ–΄ 개발 μ›μΉ™μž…λ‹ˆλ‹€ [1]. μ½”λ“œμ˜ 쀑볡을 ν”Όν•˜κ³  이λ₯Ό λ³„λ„μ˜ μ»΄ν¬λ„ŒνŠΈλ‚˜ ν•¨μˆ˜λ‘œ λΆ„λ¦¬ν•˜μ—¬ ν–₯ν›„ μ½”λ“œμ˜ μœ μ§€λ³΄μˆ˜μ™€ μˆ˜μ •μ„ μš©μ΄ν•˜κ²Œ λ§Œλ“œλŠ” 것을 λͺ©ν‘œλ‘œ ν•©λ‹ˆλ‹€ [2]. React ν™˜κ²½μ—μ„œλŠ” 주둜 곡톡 λ‘œμ§μ„ μ»€μŠ€ν…€ ν›…(Custom Hooks)μ΄λ‚˜ κ³ μ°¨ μ»΄ν¬λ„ŒνŠΈ(Higher-Order Components)둜 μΆ”μΆœν•˜λŠ” λ°©μ‹μœΌλ‘œ κ΅¬ν˜„λ©λ‹ˆλ‹€ [3, 4]. ## πŸ“– Core Content * **쀑볡 제거의 이점**: μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œ 쀑볡을 ν”Όν•˜λ©΄ ν–₯ν›„ μš”κ΅¬μ‚¬ν•­ λ³€κ²½ μ‹œ μœ μ§€λ³΄μˆ˜κ°€ 훨씬 μ‰¬μ›Œμ§‘λ‹ˆλ‹€ [2]. μ€‘λ³΅λœ μ½”λ“œκ°€ 많으면 μ½”λ“œλ₯Ό λ³€κ²½ν•  λ•Œ μ—¬λŸ¬ 곳을 μ°Ύμ•„ μˆ˜μ •ν•΄μ•Ό ν•˜μ§€λ§Œ, DRY 원칙을 μ§€ν‚€λ©΄ 단일 μœ„μΉ˜(one place)μ—μ„œλ§Œ λ³€κ²½ 사항을 μ μš©ν•˜λ©΄ 되기 λ•Œλ¬Έμž…λ‹ˆλ‹€ [2]. * **Reactμ—μ„œμ˜ κ΅¬ν˜„ 방법**: 반볡적인 둜직이 μ‘΄μž¬ν•˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” μž¬μ‚¬μš© κ°€λŠ₯ν•œ λ‘œμ§μ„ μΆ”μΆœν•΄μ•Ό ν•©λ‹ˆλ‹€ [4]. Reactμ—μ„œλŠ” 이λ₯Ό 주둜 μ»€μŠ€ν…€ ν›…(Custom Hooks)μ΄λ‚˜ κ³ μ°¨ μ»΄ν¬λ„ŒνŠΈ(Higher-Order Components, HOC)λ₯Ό μƒμ„±ν•˜μ—¬ μ²˜λ¦¬ν•©λ‹ˆλ‹€ [3, 4]. * **μ μ ˆν•œ 좔상화 타이밍**: μ„±κΈ‰ν•œ μ΅œμ ν™”λ₯Ό λ°©μ§€ν•˜κ³  μ½”λ“œλ₯Ό λ‹¨μˆœν•˜κ²Œ μœ μ§€ν•˜κΈ° μœ„ν•΄, νŠΉμ • μ½”λ“œ νŒ¨ν„΄μ΄ μ΅œμ†Œ '3번' 반볡될 λ•ŒκΉŒμ§€ κΈ°λ‹€λ Έλ‹€κ°€ 좔상화(abstraction)λ₯Ό μ§„ν–‰ν•˜λŠ” 것이 ꢌμž₯λ˜λŠ” κ°€μ΄λ“œλΌμΈμž…λ‹ˆλ‹€ [3]. ## βš–οΈ Trade-offs & Caveats * **κ³Όλ„ν•œ μΆ”μƒν™”μ˜ μœ„ν—˜μ„±**: 쀑볡을 μ€„μ΄λ €λŠ” λ…Έλ ₯으둜 인해 좔상화가 μ§€λ‚˜μΉ˜κ²Œ λ³΅μž‘ν•΄μ§ˆ 수 μžˆλŠ” λΆ€μž‘μš©μ΄ μžˆμŠ΅λ‹ˆλ‹€ [5]. * **KISS μ›μΉ™κ³Όμ˜ 좩돌**: μž¬μ‚¬μš© κ°€λŠ₯ν•œ 좔상화λ₯Ό λ§Œλ“€μ—ˆμ§€λ§Œ, κ·Έ 결과물이 μ›λž˜μ˜ 반볡된 μ½”λ“œλ³΄λ‹€ μ΄ν•΄ν•˜κΈ° 더 μ–΄λ €μ›Œμ§„λ‹€λ©΄ μ΄λŠ” μΆ”μƒν™”μ˜ λͺ©μ μ„ μƒμ‹€ν•œ κ²ƒμž…λ‹ˆλ‹€ [3]. 이 경우 μ½”λ“œλ₯Ό λ‹¨μˆœν•˜κ²Œ μœ μ§€ν•˜λΌλŠ” "KISS (Keep It Simple, Stupid)" 원칙을 μœ„λ°˜ν•˜κ²Œ λ©λ‹ˆλ‹€ [3]. * **μœ μ—°μ„± μ €ν•˜ 우렀**: Feature-Sliced Designκ³Ό 같은 μ΅œμ‹  ν”„λ‘ νŠΈμ—”λ“œ μ•„ν‚€ν…μ²˜μ—μ„œλŠ” DRY μ›μΉ™μ˜ μ€€μˆ˜μ™€ νŠΉμ • κΈ°λŠ₯에 맞좘 둜컬 μ»€μŠ€ν„°λ§ˆμ΄μ§•(local customization) μ‚¬μ΄μ—μ„œ μ μ ˆν•œ κ· ν˜•μ„ μœ μ§€ν•΄μ•Ό ν•œλ‹€κ³  κ°•μ‘°ν•©λ‹ˆλ‹€ [6]. 즉 무쑰건적인 쀑볡 μ œκ±°κ°€ λŠ₯μ‚¬λŠ” μ•„λ‹™λ‹ˆλ‹€. ## πŸ”— Knowledge Connections ### Related Concepts #### [μ†Œν”„νŠΈμ›¨μ–΄ μ—”μ§€λ‹ˆμ–΄λ§ 원칙] - [[KISS]] - μ—°κ²° 이유: DRY 원칙을 κ°•λ°•μ μœΌλ‘œ μ μš©ν•˜μ—¬ 좔상화λ₯Ό μ§„ν–‰ν•˜λ‹€ 보면 μ½”λ“œκ°€ μ§€λ‚˜μΉ˜κ²Œ λ³΅μž‘ν•΄μ Έ 이 KISS(Keep It Simple, Stupid) 원칙에 μœ„λ°°λ  수 μžˆμŠ΅λ‹ˆλ‹€ [3]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: 효율적인 μ½”λ“œ μž‘μ„±μ— μžˆμ–΄ 쀑볡 제거(DRY)와 μ½”λ“œμ˜ λ‹¨μˆœμ„±(KISS) μ‚¬μ΄μ˜ νŠΈλ ˆμ΄λ“œμ˜€ν”„μ™€ κ· ν˜•μ μ„ 이해할 수 μžˆμŠ΅λ‹ˆλ‹€. - [[YAGNI]] - μ—°κ²° 이유: DRY 원칙과 ν•¨κ»˜ μ–ΈκΈ‰λ˜λ©°(You Aren't Gonna Need It), μ½”λ“œ λ¦¬νŒ©ν† λ§ μ‹œ λΆˆν•„μš”ν•œ μ½”λ“œλ₯Ό μ€„μ΄λŠ” 기쀀이 λ©λ‹ˆλ‹€ [7, 8]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: λ‹Ήμž₯ ν•„μš”ν•˜μ§€ μ•Šμ€ 미래λ₯Ό λŒ€λΉ„ν•΄ 미리 μΆ”μƒν™”ν•˜μ§€ λ§λΌλŠ” κ°œλ…μ„ 톡해 '3번 반볡 μ‹œ 좔상화'λΌλŠ” DRY 적용 μ‹œμ μ„ λͺ…ν™•νžˆ 이해할 수 μžˆμŠ΅λ‹ˆλ‹€ [3]. #### [React κ΅¬ν˜„/ν™œμš© 도ꡬ] - [[Custom Hooks]] - μ—°κ²° 이유: React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ½”λ“œ 쀑볡을 ν”Όν•˜κ³  곡톡 λ‘œμ§μ„ μΆ”μΆœν•  λ•Œ κ°€μž₯ 널리 ꢌμž₯λ˜λŠ” μˆ˜λ‹¨μž…λ‹ˆλ‹€ [3, 4]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: μƒνƒœ κ΄€λ¦¬λ‚˜ 라이프사이클과 같은 React 고유의 λ‘œμ§μ„ μ–΄λ–»κ²Œ μž¬μ‚¬μš© κ°€λŠ₯ν•œ ν˜•νƒœλ‘œ 뢄리(DRY)ν•  수 μžˆλŠ”μ§€ 배울 수 μžˆμŠ΅λ‹ˆλ‹€. - [[Higher-Order Components]] - μ—°κ²° 이유: μ»€μŠ€ν…€ ν›…κ³Ό ν•¨κ»˜ React λ‚΄μ—μ„œ λ°˜λ³΅λ˜λŠ” μ»΄ν¬λ„ŒνŠΈ λ‘œμ§μ„ μž¬μ‚¬μš©ν•˜κ³  DRY 원칙을 μ€€μˆ˜ν•˜κΈ° μœ„ν•œ κ΅¬ν˜„ λ„κ΅¬μž…λ‹ˆλ‹€ [4]. - 이 κ°œλ…μ„ 톡해 더 깊게 이해할 수 μžˆλŠ” λΆ€λΆ„: UI λ Œλ”λ§ μΈ‘λ©΄μ—μ„œ μ»΄ν¬λ„ŒνŠΈμ˜ 쀑볡 μ½”λ“œλ₯Ό μ–΄λ–»κ²Œ μΆ”μƒν™”ν•˜λŠ”μ§€ 이해할 수 μžˆμŠ΅λ‹ˆλ‹€. ### Deeper Research Questions - React μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ DRY 원칙을 μ§€ν‚€κΈ° μœ„ν•΄ λ‘œμ§μ„ λ¬΄λΆ„λ³„ν•˜κ²Œ μ»€μŠ€ν…€ ν›…μœΌλ‘œ λΆ„λ¦¬ν–ˆμ„ λ•Œ λ°œμƒν•  수 μžˆλŠ” λ Œλ”λ§ μ„±λŠ₯ μ΄μŠˆλŠ” 무엇인가? - '3번 반볡되면 μΆ”μƒν™”ν•˜λΌ'λŠ” κ°€μ΄λ“œλΌμΈ 외에, κ³Όλ„ν•œ 좔상화(Over-abstraction)λ₯Ό 진단할 수 μžˆλŠ” μ½”λ“œ 리뷰 μƒμ˜ μ§€ν‘œλŠ” 무엇이 μžˆλŠ”κ°€? - Feature-Sliced Designκ³Ό 같이 도메인 λ‹¨μœ„λ‘œ κΈ°λŠ₯을 κ²©λ¦¬ν•˜λŠ” κ΅¬μ‘°μ—μ„œ, 전역적인 DRY 원칙 μ€€μˆ˜μ™€ 도메인 κ°„ 결합도(Coupling) μ΅œμ†Œν™” λͺ©ν‘œλŠ” μ–΄λ–»κ²Œ μƒμΆ©ν•˜λ©° μ–΄λ–»κ²Œ ν•΄κ²°ν•  수 μžˆλŠ”κ°€? - μ»΄ν¬λ„ŒνŠΈμ˜ UI ꡬ쑰적 쀑볡과 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직적 쀑볡을 ν•΄μ†Œν•˜λŠ” ꡬ체적인 React νŒ¨ν„΄(Render Props, HOC, Custom Hooks)은 각각 μ–΄λŠ 상황에 μ΅œμ ν™”λ˜μ–΄ μžˆλŠ”κ°€? - DRY 원칙에 따라 ν•˜λ‚˜μ˜ μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜λ‚˜ 곡유 μ»΄ν¬λ„ŒνŠΈλ₯Ό λ³€κ²½ν–ˆμ„ λ•Œ, 이λ₯Ό μ°Έμ‘°ν•˜λŠ” λ‹€λ₯Έ λͺ¨λ“ˆλ“€(Blast Radius)에 λ―ΈμΉ˜λŠ” λΆ€μž‘μš©μ„ 사전에 ν…ŒμŠ€νŠΈν•˜κ³  μ œμ–΄ν•˜λŠ” 방법둠은 무엇인가? ### Practical Application Contexts - **Implementation:** React둜 화면을 κ΅¬ν˜„ν•  λ•Œ, μ„œλ‘œ λ‹€λ₯Έ νŽ˜μ΄μ§€μ—μ„œ λ™μΌν•œ 데이터 페칭 λ°©μ‹μ΄λ‚˜ 폼 처리 λ‘œμ§μ„ μ‚¬μš© 쀑이라면 이λ₯Ό `useFetch`λ‚˜ `useForm`κ³Ό 같은 μ»€μŠ€ν…€ ν›…μœΌλ‘œ λΉΌλ‚΄μ–΄ μ½”λ“œ 쀑볡을 μ œκ±°ν•©λ‹ˆλ‹€ [3, 4]. - **System Design:** ν”„λ‘œμ νŠΈμ˜ 폴더 ꡬ쑰λ₯Ό μž‘μ„ λ•Œ 곡톡 λ‘œμ§μ„ μž¬μ‚¬μš©ν•  수 μžˆλ„λ‘ `shared` λ˜λŠ” `utils` 같은 전역적인 λ ˆμ΄μ–΄λ₯Ό 두어 쀑볡 μ½”λ“œλ₯Ό μ΅œμ†Œν™”ν•˜κ³  μž¬μ‚¬μš©μ„±μ„ μ΄‰μ§„ν•©λ‹ˆλ‹€ [6, 9]. - **Operation / Maintenance:** 쀑볡 λ‘œμ§μ„ λ³„λ„μ˜ ν•¨μˆ˜λ‚˜ μ»΄ν¬λ„ŒνŠΈλ‘œ κ΄€λ¦¬ν•˜λ©΄ νŠΉμ • API μŠ€νŽ™μ΄λ‚˜ UI 정책이 변경될 λ•Œ μˆ˜μ‹­ 개의 νŒŒμΌμ„ μˆ˜μ •ν•  ν•„μš” 없이 단 ν•œ 곳만 μˆ˜μ •ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 전체에 λ°˜μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [2]. - **Learning Path:** μ²˜μŒλΆ€ν„° μ™„λ²½ν•˜κ²Œ 쀑볡이 μ—†λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ € ν•˜κΈ°λ³΄λ‹€λŠ” 일단 μ½”λ“œλ₯Ό μž‘μ„±ν•œ λ’€, 같은 νŒ¨ν„΄μ΄ 3번 이상 λ°˜λ³΅λ˜λŠ” 것을 λͺ©κ²©ν–ˆμ„ λ•Œ λ¦¬νŒ©ν† λ§μ„ 톡해 μΆ”μƒν™”ν•˜λŠ” ν›ˆλ ¨μ„ ν•©λ‹ˆλ‹€ [3]. - **My Project Relevance:** React μ½”λ“œλ² μ΄μŠ€λ₯Ό λ¦¬νŒ©ν† λ§(refactoring)ν•˜λŠ” 과제 μˆ˜ν–‰ μ‹œ, DRY 및 YAGNI 원칙을 μ²™λ„λ‘œ μ‚Όμ•„ Lintλ₯Ό μ„€μ •ν•˜κ³ , 흩어진 μœ μ‚¬ ν•¨μˆ˜λ“€μ„ μž‘κ³  λͺ…ν™•ν•œ μž¬μ‚¬μš© λͺ¨λ“ˆλ‘œ ν†΅ν•©ν•˜λŠ” 것을 λͺ©ν‘œλ‘œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€ [7]. ### Adjacent Topics - [[SOLID]] - ν™•μž₯ λ°©ν–₯: 객체 μ§€ν–₯ 및 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ½”λ“œ ν’ˆμ§ˆμ„ λ†’μ΄λŠ” 5λŒ€ μ›μΉ™μœΌλ‘œ, DRY와 ν•¨κ»˜ React μ»΄ν¬λ„ŒνŠΈ ꡬ쑰화(단일 μ±…μž„ 원칙 λ“±)λ₯Ό ν•™μŠ΅ν•˜λŠ” 데 도움이 λ©λ‹ˆλ‹€ [10, 11]. - [[Clean Code]] - ν™•μž₯ λ°©ν–₯: 쀑볡 제거(DRY)뿐만 μ•„λ‹ˆλΌ λͺ…ν™•ν•œ 넀이밍, ν•¨μˆ˜ 크기 μΆ•μ†Œ λ“± μ½”λ“œμ˜ 가독성과 μœ μ§€λ³΄μˆ˜μ„±μ„ 총체적으둜 ν–₯μƒμ‹œν‚€λŠ” 원칙을 더 λ„“κ²Œ ν¬κ΄„ν•©λ‹ˆλ‹€ [1, 4]. --- *Last updated: 2026-04-30*