--- id: P-REINFORCE-AUTO-2298F3 category: "[[10_Wiki/πŸ’‘ Topics/Design & Experience]]" confidence_score: 0.90 tags: [auto-reinforced] last_reinforced: 2026-04-20 github_commit: "[P-Reinforce] Continuous Worker - 클린 μ•„ν‚€ν…μ²˜(Clean Architecture)" --- # [[클린 μ•„ν‚€ν…μ²˜(Clean Architecture)]] ## πŸ“Œ ν•œ 쀄 톡찰 (The Karpathy Summary) > **클린 μ•„ν‚€ν…μ²˜(Clean Architecture)**λŠ” λ‘œλ²„νŠΈ C. λ§ˆν‹΄(Robert C. Martin, "Uncle Bob")이 λŒ€μ€‘ν™”ν•œ μ†Œν”„νŠΈμ›¨μ–΄ 섀계 μ² ν•™μœΌλ‘œ, λΉ„μ¦ˆλ‹ˆμŠ€ 둜직과 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ·œμΉ™μ„ μ‹œμŠ€ν…œμ˜ 쀑심에 두어 μ½”λ“œμ˜ ν’ˆμ§ˆμ„ λ†’μ΄λŠ” 것을 λͺ©ν‘œλ‘œ ν•©λ‹ˆλ‹€ [1], [2]. 이 μ ‘κ·Ό 방식은 μ‹œμŠ€ν…œμ„ 각기 λ‹€λ₯Έ μ±…μž„μ„ μ§€λŠ” μ—¬λŸ¬ 동심원 κ³„μΈ΅μœΌλ‘œ λΆ„λ¦¬ν•˜μ—¬ **κ΄€μ‹¬μ‚¬μ˜ 뢄리(Separation of Concerns)**λ₯Ό μ΄‰μ§„ν•©λ‹ˆλ‹€ [1], [3]. 핡심 원칙인 **'μ˜μ‘΄μ„± κ·œμΉ™(Dependency Rule)'**을 κ°•μ œν•˜μ—¬ μ†ŒμŠ€ μ½”λ“œ μ˜μ‘΄μ„±μ΄ 였직 λ‚΄λΆ€λ‘œλ§Œ ν–₯ν•˜κ²Œ ν•¨μœΌλ‘œμ¨ ν”„λ ˆμž„μ›Œν¬, UI, λ°μ΄ν„°λ² μ΄μŠ€ λ“±μ˜ μ™ΈλΆ€ μš”μ†Œλ‘œλΆ€ν„° 독립적이고, μœ μ§€λ³΄μˆ˜μ„±, ν™•μž₯μ„± 및 ν…ŒμŠ€νŠΈ μš©μ΄μ„±μ΄ λ›°μ–΄λ‚œ μ‹œμŠ€ν…œμ„ ꡬ좕할 수 μžˆμŠ΅λ‹ˆλ‹€ [1], [4], [5], [6]. ## πŸ“– κ΅¬μ‘°ν™”λœ 지식 (Synthesized Content) * **μ£Όμš” 섀계 원칙** * **μ˜μ‘΄μ„± κ·œμΉ™ (Dependency Rule):** μ†ŒμŠ€ μ½”λ“œ μ˜μ‘΄μ„±μ€ λ°˜λ“œμ‹œ μ™ΈλΆ€ κ³„μΈ΅μ—μ„œ λ‚΄λΆ€ 계측(κ³ μˆ˜μ€€ μ •μ±… λ°©ν–₯)으둜만 ν–₯ν•΄μ•Ό ν•©λ‹ˆλ‹€ [1], [7], [6]. λ‚΄λΆ€ 원에 μ†ν•œ μ½”λ“œλŠ” 외뢀에 μ„ μ–Έλœ μ–΄λ–€ 것(ν•¨μˆ˜, 클래슀, λ³€μˆ˜ λ“±)에 λŒ€ν•΄μ„œλ„ μ•Œμ•„μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€ [6]. * **독립성:** μ‹œμŠ€ν…œμ€ νŠΉμ • ν”„λ ˆμž„μ›Œν¬λ‚˜ λ°μ΄ν„°λ² μ΄μŠ€, UI, 그리고 기타 μ™ΈλΆ€ μ—μ΄μ „μ‹œμ— μ’…μ†λ˜μ§€ μ•Šκ³  λ…λ¦½μ μœΌλ‘œ λ™μž‘ν•΄μ•Ό ν•©λ‹ˆλ‹€ [1], [4], [5], [6]. * **ν…ŒμŠ€νŠΈ μš©μ΄μ„± (Testability):** μ•„ν‚€ν…μ²˜μ˜ 쀑심에 μžˆλŠ” 핡심 λΉ„μ¦ˆλ‹ˆμŠ€ κ·œμΉ™μ€ UI, λ°μ΄ν„°λ² μ΄μŠ€, μ›Ή μ„œλ²„ λ“±μ˜ μ™ΈλΆ€ ν™˜κ²½ 없이도 격리된 μƒνƒœμ—μ„œ λ…λ¦½μ μœΌλ‘œ ν…ŒμŠ€νŠΈν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€ [8], [4], [7], [6]. * **클린 μ•„ν‚€ν…μ²˜μ˜ 4κ°€μ§€ μ£Όμš” 계측** * **μ—”ν‹°ν‹° (Entities):** κ°€μž₯ μ•ˆμͺ½ κ³„μΈ΅μœΌλ‘œ 전사적인 핡심 업무 κ·œμΉ™μ΄λ‚˜ 데이터 ꡬ쑰λ₯Ό μΊ‘μŠν™”ν•©λ‹ˆλ‹€ [9], [10], [11]. ν”„λ ˆμž„μ›Œν¬λ‚˜ λ°μ΄ν„°λ² μ΄μŠ€μ— μ˜μ‘΄ν•˜μ§€ μ•ŠλŠ” μˆœμˆ˜ν•œ 객체둜, μ™ΈλΆ€μ˜ λ³€κ²½(UI, λ³΄μ•ˆ λ“±)에 μ˜ν•΄ 영ν–₯을 λ°›μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ [12], [11]. * **μœ μŠ€μΌ€μ΄μŠ€ (Use Cases):** μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— νŠΉν™”λœ λΉ„μ¦ˆλ‹ˆμŠ€ κ·œμΉ™μ„ κ΅¬ν˜„ν•˜λ©°, μ—”ν‹°ν‹°λ‘œ λ“€μ–΄μ˜€κ³  λ‚˜κ°€λŠ” 데이터 흐름을 μ‘°μ •ν•©λ‹ˆλ‹€ [9], [10], [13]. λ°μ΄ν„°λ² μ΄μŠ€λ‚˜ UI λ“± μ™ΈλΆ€ μš”μ†Œμ˜ λ³€κ²½μœΌλ‘œλΆ€ν„° κ²©λ¦¬λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€ [13]. * **μΈν„°νŽ˜μ΄μŠ€ μ–΄λŒ‘ν„° (Interface Adapters):** μœ μŠ€μΌ€μ΄μŠ€λ‚˜ μ—”ν‹°ν‹°μ—μ„œ μ‚¬μš©ν•˜κΈ° νŽΈλ¦¬ν•œ 데이터 ν˜•μ‹μ„ μ›Ή, UI, λ˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€ 같은 μ™ΈλΆ€ μ—μ΄μ „μ‹œμ—κ²Œ νŽΈλ¦¬ν•œ ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€ [9], [10], [13]. GUI의 MVC κ΅¬μ‘°μ—μ„œ ν”„λ ˆμ  ν„°(Presenter), λ·°(View), 컨트둀러(Controller)와 λ°μ΄ν„°λ² μ΄μŠ€ κ²Œμ΄νŠΈμ›¨μ΄κ°€ 이 계측에 μ†ν•©λ‹ˆλ‹€ [9], [13], [14]. * **ν”„λ ˆμž„μ›Œν¬μ™€ λ“œλΌμ΄λ²„ (Frameworks & Drivers):** κ°€μž₯ λ°”κΉ₯μͺ½ κ³„μΈ΅μœΌλ‘œ λ°μ΄ν„°λ² μ΄μŠ€, μ›Ή ν”„λ ˆμž„μ›Œν¬, UI μ‹œμŠ€ν…œ λ“± 변동성이 크고 μ‹œμŠ€ν…œμ˜ ꡬ체적인 μ„ΈλΆ€ 사항듀이 μœ„μΉ˜ν•˜λŠ” κ³³μž…λ‹ˆλ‹€ [9], [10], [15]. * **경계 νš‘λ‹¨ (Crossing Boundaries) 및 데이터 전달** * μ œμ–΄ 흐름과 μ˜μ‘΄μ„±μ˜ λ°©ν–₯이 λ°˜λŒ€κ°€ λ˜λŠ” μƒν™©μ—μ„œλŠ” **μ˜μ‘΄μ„± μ—­μ „ 원칙(DIP)**κ³Ό 동적 λ‹€ν˜•μ„±μ„ μ‚¬μš©ν•˜μ—¬ μ†ŒμŠ€ μ½”λ“œ μ˜μ‘΄μ„±μ΄ λ‚΄λΆ€λ₯Ό ν–₯ν•˜λ„λ‘ λ§Œλ“€μ–΄μ•Ό ν•©λ‹ˆλ‹€ [16], [8], [17]. (예λ₯Ό λ“€μ–΄, μœ μŠ€μΌ€μ΄μŠ€κ°€ 직접 ν”„λ ˆμ  ν„°λ₯Ό ν˜ΈμΆœν•˜μ§€ μ•Šκ³ , λ‚΄λΆ€μ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν˜ΈμΆœν•˜λ©΄ μ™ΈλΆ€μ˜ ν”„λ ˆμ  ν„°κ°€ 이λ₯Ό κ΅¬ν˜„ν•˜λ„λ‘ 함) [17]. * 계측 경계λ₯Ό κ°€λ‘œμ§€λ₯΄λŠ” λ°μ΄ν„°λŠ” DTO(Data Transfer Object)와 같이 μΊ‘μŠν™” 및 격리된 맀우 λ‹¨μˆœν•œ 데이터 ꡬ쑰λ₯Ό κ°€μ Έμ•Όλ§Œ μ˜μ‘΄μ„± κ·œμΉ™μ„ μœ„λ°°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ [18]. * **λ„μž… μ‹œ 도전 과제 및 ν•΄κ²°μ±…** * **κ³Όμ—”μ§€λ‹ˆμ–΄λ§(Over-Engineering) 및 초기 λΉ„μš©:** 클린 μ•„ν‚€ν…μ²˜μ˜ μ—¬λŸ¬ 계측과 좔상화λ₯Ό λ„μž…ν•˜λ©΄ μ‹œμŠ€ν…œμ΄ μž₯ν™©ν•΄μ§€κ³  초기 개발 μ‹œκ°„μ΄ κΈΈμ–΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€ [19]. * **ν•΄κ²°μ±…:** μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμ— μ‹€μ§ˆμ μΈ 이점이 μžˆμ„ λ•Œλ§Œ λ ˆμ΄μ–΄μ™€ 좔상화λ₯Ό μΆ”κ°€ν•˜λŠ” μ‹€μš©μ μΈ μ ‘κ·Ό(Pragmatism)이 ν•„μš”ν•˜λ©°, 점진적인 λ„μž…μ„ 톡해 λ ˆκ±°μ‹œ μ½”λ“œλ₯Ό κ°œμ„ ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€ [19], [20]. * **ν…ŒμŠ€νŠΈμ˜ λ³΅μž‘μ„±:** μ—¬λŸ¬ 계측을 ν…ŒμŠ€νŠΈν•˜λŠ” 것은 κΉŒλ‹€λ‘œμšΈ 수 μžˆμœΌλ―€λ‘œ λͺ©(Mock) 객체λ₯Ό μƒμ„±ν•˜μ—¬ 독립적인 μ»΄ν¬λ„ŒνŠΈμ˜ λ™μž‘μ— μ΄ˆμ μ„ λ§žμΆ”λŠ” 것이 ꢌμž₯λ©λ‹ˆλ‹€ [19]. ## ⚠️ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & RL Update) - **κ³Όκ±° λ°μ΄ν„°μ™€μ˜ 좩돌:** μžλ™ν™” 엔진에 μ˜ν•΄ λ§€ν•‘λœ μ§€μ‹μœΌλ‘œ, μΆ”ν›„ μ •λ°€ 검증 ν•„μš”. - **μ •μ±… λ³€ν™”:** Design & Experience λΆ„μ•Όμ˜ μžλ™ μžμ‚°ν™” μˆ˜ν–‰. ## πŸ”— 지식 μ—°κ²° (Graph) - **Related Topics:** [[κ΄€μ‹¬μ‚¬μ˜ 뢄리(Separation of Concerns)]], [[μ˜μ‘΄μ„± μ—­μ „ 원칙(Dependency Inversion Principle)]], [[SOLID 원칙(SOLID Principles)]] - **Projects/Contexts:** [[μ•ˆλ“œλ‘œμ΄λ“œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜(Android Applications)]], [[iOS μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ VIPER νŒ¨ν„΄(VIPER Architecture)]], [[ASP.NET Core μ• ν”Œλ¦¬μΌ€μ΄μ…˜]], [[λ„·ν”Œλ¦­μŠ€ λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€(Netflix Microservices)]] - **Contradictions/Notes:** μ†ŒμŠ€ 좜처 "Complete Guide to Clean Architecture - GeeksforGeeks"λŠ” 클린 μ•„ν‚€ν…μ²˜κ°€ μ‹œμŠ€ν…œμ˜ μž₯기적인 μœ μ§€λ³΄μˆ˜μ„±, ν…ŒμŠ€νŠΈ κ°€λŠ₯μ„±, μœ μ—°μ„±μ„ μ œκ³΅ν•œλ‹€κ³  κ°•μ‘°ν•˜μ§€λ§Œ, λ™μ‹œμ— λ„μž… μ΄ˆκΈ°μ—λŠ” μ—¬λŸ¬ 좔상화 계측을 ꡬ좕해야 ν•˜λ―€λ‘œ 초기 개발 μ‹œκ°„μ΄ μ¦κ°€ν•˜κ³  μ˜€λ²„μ—”μ§€λ‹ˆμ–΄λ§(Over-Engineering)에 빠질 μœ„ν—˜μ΄ μžˆλ‹€κ³  μ§€μ ν•©λ‹ˆλ‹€. λ”°λΌμ„œ μ‹€μš©μ μΈ κ΄€μ κ³Όμ˜ κ· ν˜• μœ μ§€κ°€ ν•„μˆ˜μ μž…λ‹ˆλ‹€ [21], [19]. --- *Last updated: 2026-04-18* - Raw Source: [[00_Raw/2026-04-20/클린 μ•„ν‚€ν…μ²˜(Clean Architecture).md]] ---