π Clean Code κ°μ
Robert C. Martin(μΌλͺ Uncle Bob)μ **"Clean Code: A Handbook of Agile Software Craftsmanship"**λ μννΈμ¨μ΄ κ°λ°μλ€μκ² κΉ¨λνκ³ μ μ§λ³΄μ κ°λ₯ν μ½λ μμ± λ°©λ²μ μ μνλ νλ μμ λλ€. μ΄ μ± μ μ½λμ κ°λ μ±κ³Ό μ μ§λ³΄μμ±μ λμ΄κΈ° μν΄ λ€μν μμΉ, μ¬λ‘, κ·Έλ¦¬κ³ μ€μ μ½λλ₯Ό ν΅ν΄ κ°λ°μλ€μ΄ μ€μ²ν μ μλ μ§μΉ¨μ μ 곡ν©λλ€.
π "Clean Code" by Robert C. Martin (Uncle Bob)
**"Clean Code: A Handbook of Agile Software Craftsmanship"**μ μννΈμ¨μ΄ κ°λ°μμ **κΉ¨λνκ³ μ μ§λ³΄μ κ°λ₯ν μ½λ(Clean Code)**λ₯Ό μμ±νλ λ°©λ²κ³Ό μμΉμ λ€λ£¬ μννΈμ¨μ΄ μμ§λμ΄λ§μ νλ μμ λλ€. μ΄ μ± μ κ°λ°μλ€μ΄ ν¨μ¨μ μ΄κ³ μ½κΈ° μ¬μ΄ μ½λλ₯Ό μμ±νλλ‘ λκΈ° μν΄ λ€μν μμΉκ³Ό μ€μ μ¬λ‘λ₯Ό μκ°ν©λλ€.
π― ν΅μ¬ μ£Όμ μ λ΄μ©
1οΈβ£ κΉ¨λν μ½λμ μ μ
- κΉ¨λν μ½λλ μ½κΈ° μ½κ³ μ΄ν΄νκΈ° μ½κ³ λ³κ²½νκΈ° μ¬μ΄ μ½λμ λλ€.
- "λμ μ½λ"λ μκ°μ΄ μ§λ μλ‘ μ μ§λ³΄μκ° μ΄λ €μμ§κ³ , **κΈ°μ λΆμ±(Technical Debt)**λ₯Ό μ¦κ°μν΅λλ€.
2οΈβ£ μ½λ κ°μ μ μμΉκ³Ό λ°©λ²
- λ³μ, ν¨μ, ν΄λμ€, κ°μ²΄ μ§ν₯ μ€κ³ λ±μ λ€λ£¨λ©°, κ° μμλ₯Ό μ΄λ»κ² λ κΉλνκ² λ¦¬ν©ν λ§ν μ μλμ§ μ€λͺ ν©λλ€.
3οΈβ£ ν¨μ μμ±μ μμΉ
- ν¨μλ μ§§κ³ , νλμ μΌμ ν΄μΌ νλ©°, μλλ₯Ό λͺ νν λλ¬λ΄μΌ ν©λλ€.
- "νλμ ν¨μλ νλμ λͺ©μ λ§ κ°μ ΈμΌ νλ€."
4οΈβ£ μ½λ μ€λ©(Code Smell)κ³Ό 리ν©ν λ§
- μ½λ μ€λ©: μ½λκ° λ³΅μ‘νκ±°λ λΆνμνκ² μ΄λ €μ 보μ΄λ λ¬Έμ μ .
- μ΄λ¬ν λ¬Έμ λ₯Ό λ°κ²¬νκ³ λ¦¬ν©ν λ§μ ν΅ν΄ κ°μ νλ λ°©λ²μ μ€λͺ ν©λλ€.
5οΈβ£ SOLID μμΉ
- κ°μ²΄ μ§ν₯ μ€κ³μ ν΅μ¬ μμΉμΈ SOLID μμΉμ μμΈν μ€λͺ
ν©λλ€.
- S: Single Responsibility Principle (λ¨μΌ μ± μ μμΉ)
- O: Open/Closed Principle (κ°λ°©/νμ μμΉ)
- L: Liskov Substitution Principle (리μ€μ½ν μΉν μμΉ)
- I: Interface Segregation Principle (μΈν°νμ΄μ€ λΆλ¦¬ μμΉ)
- D: Dependency Inversion Principle (μμ‘΄μ± μμ μμΉ)
6οΈβ£ ν μ€νΈ μ£Όλ κ°λ°(TDD)κ³Ό 리ν©ν λ§
- ν μ€νΈ μ½λλ₯Ό λ¨Όμ μμ±νκ³ μ΄λ₯Ό κΈ°λ°μΌλ‘ μ½λλ₯Ό κ°μ νλ TDD κΈ°λ²μ κΆμ₯ν©λλ€.
π― μ£Όμ κ΅ν λ° μ² ν
π 1. "λμ μ½λ"λ₯Ό λλ €μνλΌ
- λμ μ½λλ νλ‘μ νΈμ μ€ν¨λ₯Ό μ΄λν©λλ€.
- μ²μλΆν° κΉ¨λν μ½λλ₯Ό μμ±νκ³ , μ½λλ₯Ό μ§μμ μΌλ‘ 리ν©ν λ§ν΄μΌ ν©λλ€.
π 2. "μ½λμ κ°λ μ±"μ΄ μ€μνλ€
- μ½λλ μ»΄ν¨ν°κ° μλλΌ μ¬λμ΄ μ½λ κ²μ μΌλμ λκ³ μμ±ν΄μΌ ν©λλ€.
- κ°λ μ±μ΄ λμ μ½λκ° μ μ§λ³΄μμ νμ₯μ μ 리ν©λλ€.
π 3. "μμ ν¨μ, μλ―Έ μλ μ΄λ¦"
- ν¨μλ μμμλ‘ μ’μΌλ©°, μ΄λ¦μ μλλ₯Ό λͺ ννκ² λλ¬λ΄λ κ²μ΄ μ€μν©λλ€.
- μ: getUserData() λμ fetchUserDataFromDatabase() κ°μ ꡬ체μ μΈ μ΄λ¦μ μ¬μ©νλΌ.
π μ€μ μ½λ μμ
- Before:
- public int calculate(int a, int b, int c) { return a + b * c; }
- After:
- public int calculateTotalPrice(int unitPrice, int quantity, int discount) { return unitPrice * quantity - discount; }
β‘οΈ λ³μμ ν¨μ μ΄λ¦μ λͺ νν νλ©΄ μ½λ κ°λ μ±μ΄ ν₯μλ©λλ€.
π μ± μΆμ²νλ μ΄μ
- μ½λ κ°λ μ±, μ μ§λ³΄μμ±, 리ν©ν λ§ λ°©λ²μ λ°°μΈ μ μμ΅λλ€.
- νΉν SOLID μμΉμ μλνμ΄ κ°λ° μ€μΈ Java κΈ°λ° λ°±μλμμ κ°μ²΄ μ§ν₯ μ€κ³ μ λ§€μ° μ μ©ν©λλ€.
- 볡μ‘ν μ½λμμ μλλ₯Ό λλ¬λ΄λ λ³μ/ν¨μλͺ μ μ¬μ©νκ³ , μ½λ μ€λ©μ μ κ±°νλ λ° ν° λμμ΄ λ©λλ€.
π μ± μ ꡬμ±
Chapter No. Title Key Concept
1 | Clean Code | κΉ¨λν μ½λλ 무μμΈκ° |
2 | Meaningful Names | μλ―Έ μλ μ΄λ¦ μ¬μ©νκΈ° |
3 | Functions | ν¨μ μμ± μμΉ |
4 | Comments | μ£Όμμ μ€μ΄κ³ μ½λ μμ²΄λ‘ μ€λͺ νκΈ° |
5 | Formatting | μ½λ ν¬λ§·ν κ³Ό μΌκ΄μ± |
6 | Objects and Data Structures | κ°μ²΄μ λ°μ΄ν° ꡬ쑰 |
7 | Error Handling | μ€λ₯ μ²λ¦¬ μμΉ |
8 | Boundaries | μμ€ν κ²½κ³λ₯Ό κ΄λ¦¬νκΈ° |
9 | Unit Tests | λ¨μ ν μ€νΈ μμ± λ°©λ² |
10 | Classes | ν΄λμ€ μ€κ³ μμΉ |
11 | Systems | μμ€ν λμμΈ |
π― μ€μ λ‘ μ΄ μ± μ μ½μΌλ©΄ μ΄λ»κ² λ³ν κΉ?
- β λ μ§§κ³ μ½κΈ° μ¬μ΄ ν¨μλ₯Ό μμ±νκ² λ¨
- β μ½λμ μλλ₯Ό μ λλ¬λ΄λ λ³μμ ν¨μ μ΄λ¦μ μ¬μ©νκ² λ¨
- β λΆνμν μ£Όμμ μ€μ΄κ³ μ½λ μμ²΄λ‘ μ€λͺ ν μ μμ
- β μ μ§λ³΄μμ νμ₯μ±μ΄ λμ μ½λ μμ± μ΅κ΄μ κ°μ§κ² λ¨
"μ½λκ° μ½κΈ° μ’μΌλ©΄ μ μ§λ³΄μλ μ½λ€"λ μ² νμ λ°νμΌλ‘ νλ‘μ νΈμ μμ°μ±κ³Ό μ½λ νμ§μ ν₯μμν¬ μ μμ΅λλ€.
μ½κΈ° μ½κ³ μ΄ν΄νκΈ° μ¬μ΄ μ½λλ₯Ό λ§λ€κ³ μΆλ€λ©΄ **"Clean Code"**λ νμμ
λλ€! π
β Clean Code μ€μ² κ°μ΄λ
- μ§§κ³ λͺ νν ν¨μ μμ±
- μλ―Έ μλ λ³μμ ν¨μ μ΄λ¦ μ¬μ©
- μ£Όμμ μ΅μννκ³ μ½λλ‘ μ€λͺ νλΌ
- μ½λ μ€λ©μ κ°μ§νκ³ λ¦¬ν©ν λ§νλΌ
- SOLID μμΉμ μ€μνλΌ
- ν μ€νΈ μ£Όλ κ°λ°(TDD)μ μ€μ²νλΌ
π§ 리ν©ν λ§κ³Ό μ½λ κ°μ μ€μ μμ
Before Refactoring:
public int calculate(int a, int b, int c) {
return a + b * c;
}
After Refactoring:
public int calculateTotalPrice(int unitPrice, int quantity, int discount) {
return unitPrice * quantity - discount;
}
리ν©ν λ§ Tips:
- ν¨μ μ΄λ¦μ λͺ ννκ² λ°κΎΌλ€.
- λ§€κ°λ³μ μ΄λ¦μ μλ―Έ μκ² μμ νλ€.
Clean Code: ν΅μ¬ μμ½κ³Ό κ°λ°μλ₯Ό μν μ€μ² κ°μ΄λ
π Clean Code κ°μ
Robert C. Martin(μΌλͺ Uncle Bob)μ **"Clean Code: A Handbook of Agile Software Craftsmanship"**λ μννΈμ¨μ΄ κ°λ°μλ€μκ² κΉ¨λνκ³ μ μ§λ³΄μ κ°λ₯ν μ½λ μμ± λ°©λ²μ μ μνλ νλ μμ λλ€. μ΄ μ± μ μ½λμ κ°λ μ±κ³Ό μ μ§λ³΄μμ±μ λμ΄κΈ° μν΄ λ€μν μμΉ, μ¬λ‘, κ·Έλ¦¬κ³ μ€μ μ½λλ₯Ό ν΅ν΄ κ°λ°μλ€μ΄ μ€μ²ν μ μλ μ§μΉ¨μ μ 곡ν©λλ€.
π‘ κΉ¨λν μ½λλ?
Uncle Bobμ κΉ¨λν μ½λ(Clean Code)λ₯Ό λ€μκ³Ό κ°μ΄ μ μν©λλ€:
"κΉ¨λν μ½λλ μ¬λλ€μκ² κΈ°μ¨μ μ£Όλ μ½λλ€."
β¨ κΉ¨λν μ½λμ νΉμ§
- κ°λ μ±(Readability): μ½λλ₯Ό μ½λ μ¬λμ΄ μ½κ² μ΄ν΄ν μ μμ΄μΌ ν¨.
- λ¨μμ±(Simplicity): λΆνμν 볡μ‘ν¨μ μ κ±°νκ³ , μ½λλ κ°κ²°νκ³ μ§κ΄μ μ΄μ΄μΌ ν¨.
- μ μ§λ³΄μμ±(Maintainability): μκ°μ΄ μ§λλ μ½κ² μμ νκ³ νμ₯ν μ μμ΄μΌ ν¨.
- νμ₯μ±(Extensibility): λ³κ²½ μꡬ μ¬νμ μ½κ² λμν μ μμ΄μΌ ν¨.
π― κΉ¨λν μ½λλ₯Ό μν ν΅μ¬ μμΉ
μ± μμ μ μνλ ν΅μ¬ μμΉλ€μ μ 리νλ©΄ λ€μκ³Ό κ°μ΅λλ€:
1οΈβ£ μλ―Έ μλ μ΄λ¦ μ¬μ©νκΈ°
- λ³μ, ν¨μ, ν΄λμ€ μ΄λ¦μ μλλ₯Ό λͺ ννκ² λλ¬λ΄μΌ ν©λλ€.
- μ΄λ¦λ§ λ΄λ μ½λμ μν μ μ΄ν΄ν μ μμ΄μΌ ν©λλ€.
β Bad Example:
int d; // κ²½κ³Ό μκ° (days)
β Good Example:
int elapsedTimeInDays;
Tips:
- μΆμ½μ΄λ₯Ό νΌνκ³ , ꡬ체μ μΈ λ¨μ΄λ₯Ό μ¬μ©ν©λλ€.
- ν¨μ μ΄λ¦μ λμ¬ ννλ‘ μμ±ν©λλ€.
2οΈβ£ ν¨μλ μ§§κ³ νλμ μΌμ ν΄μΌ νλ€
- ν¨μλ μ§§μμλ‘ μ’μ΅λλ€.
- ν¨μλ **νλμ μ± μ(One Responsibility)**λ§ κ°μ ΈμΌ ν©λλ€.
β Bad Example:
public void processOrder(Order order) {
validateOrder(order);
calculateDiscount(order);
saveOrder(order);
}
β Good Example:
public void validateOrder(Order order) { ... }
public void calculateDiscount(Order order) { ... }
public void saveOrder(Order order) { ... }
3οΈβ£ μ£Όμμ μ€μ΄κ³ μ½λ μμ²΄λ‘ μ€λͺ νλΌ
- μ£Όμμ μ½λμ νλμ μ€λͺ νλ κ²μ΄ μλλΌ, μ½λμ μλλ₯Ό λλ¬λ΄μΌ ν©λλ€.
- λΆνμν μ£Όμμ λ¨λ°νμ§ λ§κ³ , μ½λ μμ²΄κ° μ€λͺ μ΄ λλλ‘ μμ±ν©λλ€.
β Bad Example:
// μ¬μ©μ λ°μ΄ν°λ₯Ό λ°μ΄ν°λ² μ΄μ€μ μ μ₯ν©λλ€
saveUserToDatabase(user);
β Good Example:
public void saveUserToDatabase(User user) { ... }
4οΈβ£ μ½λ μ€λ©(Code Smell) μ κ±°
- μ½λ μ€λ©μ΄λ μ½λκ° λ³΅μ‘νκ±°λ λΉν¨μ¨μ μΌλ‘ 보μ΄λ λ¬Έμ λ₯Ό λ§ν©λλ€.
- λ€μκ³Ό κ°μ μ½λ μ€λ©μ λ°κ²¬νλ©΄ μ¦μ 리ν©ν λ§ν΄μΌ ν©λλ€.
μ½λ μ€λ© μ¬λ‘:
- μ€λ³΅ μ½λ (Duplicate Code)
- μ§λμΉκ² ν° ν¨μ (Large Function)
- λΆνμν μ£Όμ (Unnecessary Comments)
- κ³Όλν 쑰건문 (Excessive If-Else Statements)
5οΈβ£ SOLID μμΉ μ μ©νκΈ°
κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μμ μ€μν SOLID μμΉμ μ€μνλ©΄, μ½λμ μ μ§λ³΄μμ±κ³Ό νμ₯μ±μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€.
μμΉ μ€λͺ
S: λ¨μΌ μ± μ μμΉ | ν΄λμ€λ νλμ μ± μλ§ κ°μ ΈμΌ ν¨ |
O: κ°λ°©/νμ μμΉ | κΈ°μ‘΄ μ½λλ₯Ό μμ νμ§ μκ³ νμ₯ κ°λ₯ν΄μΌ ν¨ |
L: 리μ€μ½ν μΉν μμΉ | μλΈνμ μ μΈμ λ κΈ°λ° νμ μΌλ‘ λ체 κ°λ₯ν΄μΌ ν¨ |
I: μΈν°νμ΄μ€ λΆλ¦¬ μμΉ | νΉμ ν΄λΌμ΄μΈνΈλ₯Ό μν μΈν°νμ΄μ€λ₯Ό μ 곡ν΄μΌ ν¨ |
D: μμ‘΄μ± μμ μμΉ | κ³ μμ€ λͺ¨λμ μ μμ€ λͺ¨λμ μμ‘΄ν΄μλ μ λ¨ |
π§ 리ν©ν λ§κ³Ό μ½λ κ°μ μ€μ μμ
Before Refactoring:
public int calculate(int a, int b, int c) {
return a + b * c;
}
After Refactoring:
public int calculateTotalPrice(int unitPrice, int quantity, int discount) {
return unitPrice * quantity - discount;
}
리ν©ν λ§ Tips:
- ν¨μ μ΄λ¦μ λͺ ννκ² λ°κΎΌλ€.
- λ§€κ°λ³μ μ΄λ¦μ μλ―Έ μκ² μμ νλ€.
β Clean Code μ€μ² κ°μ΄λ
- μ§§κ³ λͺ νν ν¨μ μμ±
- μλ―Έ μλ λ³μμ ν¨μ μ΄λ¦ μ¬μ©
- μ£Όμμ μ΅μννκ³ μ½λλ‘ μ€λͺ νλΌ
- μ½λ μ€λ©μ κ°μ§νκ³ λ¦¬ν©ν λ§νλΌ
- SOLID μμΉμ μ€μνλΌ
- ν μ€νΈ μ£Όλ κ°λ°(TDD)μ μ€μ²νλΌ
π λ§λ¬΄λ¦¬
Robert C. Martinμ Clean Codeλ λͺ¨λ κ°λ°μλ€μ΄ λ°λμ μ½μ΄μΌ ν μ± μ λλ€. μ½λλ₯Ό κΉ¨λνκ² μμ±νλ©΄ μ μ§λ³΄μ λΉμ©μ΄ μ€μ΄λ€κ³ , ν μ 체μ μμ°μ±μ΄ ν₯μλ©λλ€.
**"μ½λλ μ»΄ν¨ν°κ° μλλΌ μ¬λμ μν΄ μμ±ν΄μΌ νλ€"**λ μ² νμ νμ κΈ°μ΅νλ©°, λ λμ μ½λλ₯Ό μμ±ν΄ λ΄ μλ€!
π‘ μΆμ² λμ:
- μ½λ νμ§μ ν₯μμν€κ³ μΆμ κ°λ°μ
- 리ν©ν λ§μ μ€μ²νκ³ μΆμ κ°λ°μ
- ν νμ μμ μ½λ 리뷰λ₯Ό κ°ννκ³ μΆμ κ°λ°μ