| name | code-refactor |
| description | Systematic code refactoring based on Martin Fowler's methodology. Use when users ask to refactor code, improve code structure, reduce technical debt, clean up legacy code, eliminate code smells, or improve code maintainability. This skill guides through a phased approach with research, planning, and safe incremental implementation. |
์ฝ๋ ๋ฆฌํฉํ ๋ง ์คํฌ
Martin Fowler์ Refactoring: Improving the Design of Existing Code (์ 2ํ)์ ๊ธฐ๋ฐํ ์ฒด๊ณ์ ์ธ ๋ฆฌํฉํ ๋ง ์ ๊ทผ๋ฒ์
๋๋ค. ์ด ์คํฌ์ ํ
์คํธ๋ก ๋ท๋ฐ์นจ๋๋ ์์ ํ๊ณ ์ ์ง์ ์ธ ๋ณ๊ฒฝ์ ๊ฐ์กฐํฉ๋๋ค.
"๋ฆฌํฉํ ๋ง์ ์ฝ๋์ ์ธ๋ถ ๋์์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ํ๋ ๋ฐฉ์์ผ๋ก ์ํํธ์จ์ด ์์คํ
์ ๋ณ๊ฒฝํ๋ ํ๋ก์ธ์ค์
๋๋ค." -- Martin Fowler
ํต์ฌ ์์น
- ๋์ ๋ณด์กด: ์ธ๋ถ ๋์์ ๋ฐ๋์ ๋ณ๊ฒฝ๋์ง ์์์ผ ํฉ๋๋ค
- ์์ ๋จ๊ณ: ์๊ณ ํ
์คํธ ๊ฐ๋ฅํ ๋ณ๊ฒฝ์ ํฉ๋๋ค
- ํ
์คํธ ์ฃผ๋: ํ
์คํธ๊ฐ ์์ ๋ง์
๋๋ค
- ์ง์์ : ๋ฆฌํฉํ ๋ง์ ์ผํ์ฑ ์ด๋ฒคํธ๊ฐ ์๋๋ผ ์ง์์ ์ธ ๊ฒ์
๋๋ค
- ํ๋ ฅ์ : ๊ฐ ๋จ๊ณ์์ ์ฌ์ฉ์ ์น์ธ์ด ํ์ํฉ๋๋ค
์ํฌํ๋ก ๊ฐ์
Phase 1: Research & Analysis
โ
Phase 2: Test Coverage Assessment
โ
Phase 3: Code Smell Identification
โ
Phase 4: Refactoring Plan Creation
โ
Phase 5: Incremental Implementation
โ
Phase 6: Review & Iteration
1๋จ๊ณ: ๋ฆฌ์์น ๋ฐ ๋ถ์
๋ชฉํ
- ์ฝ๋๋ฒ ์ด์ค ๊ตฌ์กฐ์ ๋ชฉ์ ์ดํด
- ๋ฆฌํฉํ ๋ง ๋ฒ์ ํ์
- ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ์ ๋ํ ์ปจํ
์คํธ ์์ง
์ฌ์ฉ์์๊ฒ ํ ์ง๋ฌธ
์์ํ๊ธฐ ์ ์ ๋ช
ํํ ํฉ๋๋ค:
- ๋ฒ์: ์ด๋ค ํ์ผ/๋ชจ๋/ํจ์๋ฅผ ๋ฆฌํฉํ ๋งํด์ผ ํฉ๋๊น?
- ๋ชฉํ: ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํฉ๋๊น? (๊ฐ๋
์ฑ, ์ฑ๋ฅ, ์ ์ง๋ณด์์ฑ)
- ์ ์ฝ ์กฐ๊ฑด: ๋ณ๊ฒฝํ๋ฉด ์ ๋๋ ์์ญ์ด ์์ต๋๊น?
- ์ผ์ ์๋ฐ: ๋ค๋ฅธ ์์
์ ์ฐจ๋จํ๊ณ ์์ต๋๊น?
- ํ
์คํธ ์ํ: ํ
์คํธ๊ฐ ์กด์ฌํฉ๋๊น? ํต๊ณผํ๊ณ ์์ต๋๊น?
์ก์
์ถ๋ ฅ
์ฌ์ฉ์์๊ฒ ๋ฐ๊ฒฌ ์ฌํญ์ ์ ์ํฉ๋๋ค:
- ์ฝ๋ ๊ตฌ์กฐ ์์ฝ
- ์๋ณ๋ ๋ฌธ์ ์์ญ
- ์ด๊ธฐ ๊ถ์ฅ ์ฌํญ
- ์งํ ์น์ธ ์์ฒญ
2๋จ๊ณ: ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง ํ๊ฐ
ํ
์คํธ๊ฐ ์ค์ํ ์ด์
"ํ
์คํธ ์์ด ๋ฆฌํฉํ ๋งํ๋ ๊ฒ์ ์์ ๋ฒจํธ ์์ด ์ด์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค." -- Martin Fowler
ํ
์คํธ๋ ์์ ํ ๋ฆฌํฉํ ๋ง์ ํต์ฌ ์์์
๋๋ค. ํ
์คํธ ์์ด๋ ๋ฒ๊ทธ๋ฅผ ๋์
ํ ์ํ์ด ์์ต๋๋ค.
ํ๊ฐ ๋จ๊ณ
-
๊ธฐ์กด ํ
์คํธ ํ์ธ
find . -name "*test*" -o -name "*spec*" | head -20
-
๊ธฐ์กด ํ
์คํธ ์คํ
npm test
pytest -v
mvn test
-
์ปค๋ฒ๋ฆฌ์ง ํ์ธ (๊ฐ๋ฅํ ๊ฒฝ์ฐ)
npm run test:coverage
pytest --cov=.
๊ฒฐ์ ์์ : ์ฌ์ฉ์์๊ฒ ์ง๋ฌธ
ํ
์คํธ๊ฐ ์กด์ฌํ๊ณ ํต๊ณผํ๋ ๊ฒฝ์ฐ:
- 3๋จ๊ณ๋ก ์งํํฉ๋๋ค
ํ
์คํธ๊ฐ ์๊ฑฐ๋ ๋ถ์์ ํ ๊ฒฝ์ฐ:
์ต์
์ ์ ์ํฉ๋๋ค:
- ๋จผ์ ํ
์คํธ๋ฅผ ์์ฑํฉ๋๋ค (๊ถ์ฅ)
- ๋ฆฌํฉํ ๋ง ์ค ์ ์ง์ ์ผ๋ก ํ
์คํธ๋ฅผ ์ถ๊ฐํฉ๋๋ค
- ํ
์คํธ ์์ด ์งํํฉ๋๋ค (์ํ - ์ฌ์ฉ์ ํ์ธ ํ์)
ํ
์คํธ๊ฐ ์คํจํ๋ ๊ฒฝ์ฐ:
- ์ค์งํฉ๋๋ค. ๋ฆฌํฉํ ๋ง ์ ์ ์คํจํ๋ ํ
์คํธ๋ฅผ ์์ ํฉ๋๋ค
- ์ฌ์ฉ์์๊ฒ ์ง๋ฌธํฉ๋๋ค: ๋จผ์ ํ
์คํธ๋ฅผ ์์ ํด์ผ ํ ๊น์?
ํ
์คํธ ์์ฑ ๊ฐ์ด๋๋ผ์ธ (ํ์ํ ๊ฒฝ์ฐ)
๋ฆฌํฉํ ๋ง๋๋ ๊ฐ ํจ์์ ๋ํด ํ
์คํธ๊ฐ ๋ค์์ ์ปค๋ฒํ๋๋ก ํฉ๋๋ค:
- ์ ์ ๊ฒฝ๋ก (์ ์ ์๋)
- ์ฃ์ง ์ผ์ด์ค (๋น ์
๋ ฅ, null, ๊ฒฝ๊ณ๊ฐ)
- ์๋ฌ ์๋๋ฆฌ์ค (์๋ชป๋ ์
๋ ฅ, ์์ธ)
"red-green-refactor" ์ฌ์ดํด์ ์ฌ์ฉํฉ๋๋ค:
- ์คํจํ๋ ํ
์คํธ ์์ฑ (red)
- ํต๊ณผ์ํค๊ธฐ (green)
- ๋ฆฌํฉํ ๋ง
3๋จ๊ณ: ์ฝ๋ ์ค๋ฉ ์๋ณ
์ฝ๋ ์ค๋ฉ์ด๋?
์ฝ๋์ ๋ ๊น์ ๋ฌธ์ ์ ์ฆ์์
๋๋ค. ๋ฒ๊ทธ๋ ์๋์ง๋ง ์ฝ๋๋ฅผ ๊ฐ์ ํ ์ ์๋ค๋ ์งํ์
๋๋ค.
ํ์ธํ ์ผ๋ฐ์ ์ธ ์ฝ๋ ์ค๋ฉ
์ ์ฒด ์นดํ๋ก๊ทธ๋ references/code-smells.md๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
๋น ๋ฅธ ์ฐธ์กฐ
| ์ค๋ฉ | ์งํ | ์ํฅ |
|---|
| Long Method | 30-50์ค ์ด์์ ๋ฉ์๋ | ์ดํด, ํ
์คํธ, ์ ์ง๋ณด์๊ฐ ์ด๋ ค์ |
| Duplicated Code | ์ฌ๋ฌ ๊ณณ์ ๋์ผํ ๋ก์ง | ์ฌ๋ฌ ๊ณณ์์ ๋ฒ๊ทธ ์์ ํ์ |
| Large Class | ์ฑ
์์ด ๋๋ฌด ๋ง์ ํด๋์ค | ๋จ์ผ ์ฑ
์ ์์น ์๋ฐ |
| Feature Envy | ๋ค๋ฅธ ํด๋์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ ๋ง์ด ์ฌ์ฉํ๋ ๋ฉ์๋ | ์บก์ํ ๋ถ์กฑ |
| Primitive Obsession | ๊ฐ์ฒด ๋์ ๊ธฐ๋ณธํ์ ๊ณผ๋ํ ์ฌ์ฉ | ๋๋ฉ์ธ ๊ฐ๋
๋๋ฝ |
| Long Parameter List | 4๊ฐ ์ด์์ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง ๋ฉ์๋ | ์ฌ๋ฐ๋ฅด๊ฒ ํธ์ถํ๊ธฐ ์ด๋ ค์ |
| Data Clumps | ํจ๊ป ๋ํ๋๋ ๋์ผํ ๋ฐ์ดํฐ ํญ๋ชฉ | ์ถ์ํ ๋๋ฝ |
| Switch Statements | ๋ณต์กํ switch/if-else ์ฒด์ธ | ํ์ฅํ๊ธฐ ์ด๋ ค์ |
| Speculative Generality | "๋ง์ฝ์ ๋๋นํ" ์ฝ๋ | ๋ถํ์ํ ๋ณต์ก์ฑ |
| Dead Code | ์ฌ์ฉ๋์ง ์๋ ์ฝ๋ | ํผ๋, ์ ์ง๋ณด์ ๋ถ๋ด |
๋ถ์ ๋จ๊ณ
-
์๋ํ๋ ๋ถ์ (์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ)
python scripts/detect-smells.py <file>
-
์๋ ๋ฆฌ๋ทฐ
- ์ฝ๋๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ์ดํด๋ด
๋๋ค
- ๊ฐ ์ค๋ฉ์ ์์น์ ์ฌ๊ฐ๋๋ฅผ ๊ธฐ๋กํฉ๋๋ค
- ์ํฅ๋ณ๋ก ๋ถ๋ฅํฉ๋๋ค (Critical/High/Medium/Low)
-
์ฐ์ ์์ ๊ฒฐ์
๋ค์๊ณผ ๊ฐ์ ์ค๋ฉ์ ์ง์คํฉ๋๋ค:
- ํ์ฌ ๊ฐ๋ฐ์ ์ฐจ๋จํ๋ ๊ฒ
- ๋ฒ๊ทธ๋ ํผ๋์ ์ผ์ผํค๋ ๊ฒ
- ๊ฐ์ฅ ์์ฃผ ๋ณ๊ฒฝ๋๋ ์ฝ๋ ๊ฒฝ๋ก์ ์ํฅ์ ์ฃผ๋ ๊ฒ
์ถ๋ ฅ: ์ค๋ฉ ๋ณด๊ณ ์
์ฌ์ฉ์์๊ฒ ์ ์ํฉ๋๋ค:
- ์์น๊ฐ ํฌํจ๋ ์๋ณ๋ ์ค๋ฉ ๋ชฉ๋ก
- ๊ฐ๊ฐ์ ์ฌ๊ฐ๋ ํ๊ฐ
- ๊ถ์ฅ ์ฐ์ ์์ ์์
- ์ฐ์ ์์์ ๋ํ ์น์ธ ์์ฒญ
4๋จ๊ณ: ๋ฆฌํฉํ ๋ง ๊ณํ ์์ฑ
๋ฆฌํฉํ ๋ง ์ ํ
๊ฐ ์ค๋ฉ์ ๋ํด ์นดํ๋ก๊ทธ์์ ์ ์ ํ ๋ฆฌํฉํ ๋ง์ ์ ํํฉ๋๋ค.
์ ์ฒด ๋ชฉ๋ก์ references/refactoring-catalog.md๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์ค๋ฉ-๋ฆฌํฉํ ๋ง ๋งคํ
| ์ฝ๋ ์ค๋ฉ | ๊ถ์ฅ ๋ฆฌํฉํ ๋ง |
|---|
| Long Method | Extract Method, Replace Temp with Query |
| Duplicated Code | Extract Method, Pull Up Method, Form Template Method |
| Large Class | Extract Class, Extract Subclass |
| Feature Envy | Move Method, Move Field |
| Primitive Obsession | Replace Primitive with Object, Replace Type Code with Class |
| Long Parameter List | Introduce Parameter Object, Preserve Whole Object |
| Data Clumps | Extract Class, Introduce Parameter Object |
| Switch Statements | Replace Conditional with Polymorphism |
| Speculative Generality | Collapse Hierarchy, Inline Class, Remove Dead Code |
| Dead Code | Remove Dead Code |
๊ณํ ๊ตฌ์กฐ
templates/refactoring-plan.md์ ํ
ํ๋ฆฟ์ ์ฌ์ฉํฉ๋๋ค.
๊ฐ ๋ฆฌํฉํ ๋ง์ ๋ํด:
- ๋์: ์ด๋ค ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋ ๊ฒ์ธ์ง
- ์ค๋ฉ: ์ด๋ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋์ง
- ๋ฆฌํฉํ ๋ง: ์ด๋ค ๊ธฐ๋ฒ์ ์ ์ฉํ ๊ฒ์ธ์ง
- ๋จ๊ณ: ์์ธํ ๋ง์ดํฌ๋ก ๋จ๊ณ
- ์ํ: ๋ฌด์์ด ์๋ชป๋ ์ ์๋์ง
- ๋กค๋ฐฑ: ํ์ ์ ์ด๋ป๊ฒ ์ทจ์ํ ๊ฒ์ธ์ง
๋จ๊ณ์ ์ ๊ทผ
์ค์: ๋ฆฌํฉํ ๋ง์ ๋จ๊ณ์ ์ผ๋ก ์ ์ง ๋์
ํฉ๋๋ค.
Phase A: ๋น ๋ฅธ ์ฑ๊ณผ (๋ฎ์ ์ํ, ๋์ ๊ฐ์น)
- ๋ช
ํ์ฑ์ ์ํด ๋ณ์ ์ด๋ฆ ๋ณ๊ฒฝ
- ๋ช
๋ฐฑํ ์ค๋ณต ์ฝ๋ ์ถ์ถ
- ์ฃฝ์ ์ฝ๋ ์ ๊ฑฐ
Phase B: ๊ตฌ์กฐ์ ๊ฐ์ (์ค๊ฐ ์ํ)
- ๊ธด ํจ์์์ ๋ฉ์๋ ์ถ์ถ
- ํ๋ผ๋ฏธํฐ ๊ฐ์ฒด ๋์
- ์ ์ ํ ํด๋์ค๋ก ๋ฉ์๋ ์ด๋
Phase C: ์ํคํ
์ฒ ๋ณ๊ฒฝ (๋์ ์ํ)
- ์กฐ๊ฑด๋ฌธ์ ๋คํ์ฑ์ผ๋ก ๊ต์ฒด
- ํด๋์ค ์ถ์ถ
- ๋์์ธ ํจํด ๋์
๊ฒฐ์ ์์ : ์ฌ์ฉ์์๊ฒ ๊ณํ ์ ์
๊ตฌํ ์ ์:
- ์์ ํ ๋ฆฌํฉํ ๋ง ๊ณํ์ ๋ณด์ฌ์ค๋๋ค
- ๊ฐ ๋จ๊ณ์ ์ํ์ ์ค๋ช
ํฉ๋๋ค
- ๊ฐ ๋จ๊ณ์ ๋ํ ๋ช
์์ ์น์ธ์ ๋ฐ์ต๋๋ค
- ์ง๋ฌธํฉ๋๋ค: "Phase A๋ฅผ ์งํํ ๊น์?"
5๋จ๊ณ: ์ ์ง์ ๊ตฌํ
๊ณจ๋ ๋ฃฐ
"๋ณ๊ฒฝ -> ํ
์คํธ -> ๋
น์? -> ์ปค๋ฐ -> ๋ค์ ๋จ๊ณ"
๊ตฌํ ๋ฆฌ๋ฌ
๊ฐ ๋ฆฌํฉํ ๋ง ๋จ๊ณ์ ๋ํด:
-
์ฌ์ ํ์ธ
- ํ
์คํธ๊ฐ ํต๊ณผ ์ค (๋
น์)
- ์ฝ๋๊ฐ ์ปดํ์ผ๋จ
-
ํ๋์ ์์ ๋ณ๊ฒฝ ์ํ
- ์นดํ๋ก๊ทธ์ ๋ฉ์ปค๋์ฆ์ ๋ฐ๋ฆ
๋๋ค
- ๋ณ๊ฒฝ์ ์ต์ํ์ผ๋ก ์ ์งํฉ๋๋ค
-
๊ฒ์ฆ
- ์ฆ์ ํ
์คํธ๋ฅผ ์คํํฉ๋๋ค
- ์ปดํ์ผ ์๋ฌ๋ฅผ ํ์ธํฉ๋๋ค
-
ํ
์คํธ ํต๊ณผ ์ (๋
น์)
- ์ค๋ช
์ ์ธ ๋ฉ์์ง์ ํจ๊ป ์ปค๋ฐํฉ๋๋ค
- ๋ค์ ๋จ๊ณ๋ก ์ด๋ํฉ๋๋ค
-
ํ
์คํธ ์คํจ ์ (๋นจ๊ฐ์)
- ์ฆ์ ์ค์งํฉ๋๋ค
- ๋ณ๊ฒฝ์ ์ทจ์ํฉ๋๋ค
- ๋ฌด์์ด ์๋ชป๋์๋์ง ๋ถ์ํฉ๋๋ค
- ๋ถํ์คํ ๊ฒฝ์ฐ ์ฌ์ฉ์์๊ฒ ์ง๋ฌธํฉ๋๋ค
์ปค๋ฐ ์ ๋ต
๊ฐ ์ปค๋ฐ์ ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค:
- ์์์ : ํ๋์ ๋
ผ๋ฆฌ์ ๋ณ๊ฒฝ
- ๋๋๋ฆด ์ ์๋: ์ฝ๊ฒ ๋๋๋ฆด ์ ์์
- ์ค๋ช
์ ์ธ: ๋ช
ํํ ์ปค๋ฐ ๋ฉ์์ง
์ปค๋ฐ ๋ฉ์์ง ์์:
refactor: Extract calculateTotal() from processOrder()
refactor: Rename 'x' to 'customerCount' for clarity
refactor: Remove unused validateOldFormat() method
์งํ ๋ณด๊ณ
๊ฐ ํ์ ๋จ๊ณ ํ ์ฌ์ฉ์์๊ฒ ๋ณด๊ณ ํฉ๋๋ค:
- ์ํ๋ ๋ณ๊ฒฝ ์ฌํญ
- ํ
์คํธ๊ฐ ์ฌ์ ํ ํต๊ณผํ๋์ง?
- ๋ฐ์ํ ๋ฌธ์
- ์ง๋ฌธํฉ๋๋ค: "๋ค์ ๋ฐฐ์น๋ฅผ ๊ณ์ํ ๊น์?"
6๋จ๊ณ: ๋ฆฌ๋ทฐ ๋ฐ ๋ฐ๋ณต
๋ฆฌํฉํ ๋ง ํ ์ฒดํฌ๋ฆฌ์คํธ
๋ฉํธ๋ฆญ ๋น๊ต
์ ํ ๋ณต์ก๋ ๋ถ์์ ์คํํฉ๋๋ค:
python scripts/analyze-complexity.py <file>
๊ฐ์ ์ฌํญ์ ์ ์ํฉ๋๋ค:
- ์ฝ๋ ์ค ์ ๋ณํ
- ์ํ ๋ณต์ก๋ ๋ณํ
- ์ ์ง๋ณด์์ฑ ์ง์ ๋ณํ
์ฌ์ฉ์ ๋ฆฌ๋ทฐ
์ต์ข
๊ฒฐ๊ณผ๋ฅผ ์ ์ํฉ๋๋ค:
- ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ ์์ฝ
- ์ /ํ ์ฝ๋ ๋น๊ต
- ๋ฉํธ๋ฆญ ๊ฐ์
- ๋จ์ ์๋ ๊ธฐ์ ๋ถ์ฑ
- ์ง๋ฌธํฉ๋๋ค: "์ด ๋ณ๊ฒฝ ์ฌํญ์ ๋ง์กฑํ์ญ๋๊น?"
๋ค์ ๋จ๊ณ
์ฌ์ฉ์์ ๋
ผ์ํฉ๋๋ค:
- ํด๊ฒฐํด์ผ ํ ์ถ๊ฐ ์ค๋ฉ?
- ํ์ ๋ฆฌํฉํ ๋ง ์ผ์ ?
- ๋ค๋ฅธ ๊ณณ์ ์ ์ฌํ ๋ณ๊ฒฝ ์ ์ฉ?
์ค์ ๊ฐ์ด๋๋ผ์ธ
์ค์งํ๊ณ ์ง๋ฌธํด์ผ ํ ๋
ํญ์ ์ผ์ ์ค์งํ๊ณ ์ฌ์ฉ์์๊ฒ ์๋ดํฉ๋๋ค:
- ๋น์ฆ๋์ค ๋ก์ง์ด ๋ถํ์คํ ๋
- ๋ณ๊ฒฝ์ด ์ธ๋ถ API์ ์ํฅ์ ์ค ์ ์์ ๋
- ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง๊ฐ ๋ถ์กฑํ ๋
- ์ค์ํ ์ํคํ
์ฒ ๊ฒฐ์ ์ด ํ์ํ ๋
- ์ํ ์์ค์ด ์ฆ๊ฐํ ๋
- ์์์น ๋ชปํ ๋ณต์ก์ฑ์ ๋ง๋ฌ์ ๋
์์ ๊ท์น
- ํ
์คํธ ์์ด ์ ๋ ๋ฆฌํฉํ ๋งํ์ง ๋ง์ญ์์ค (์ฌ์ฉ์๊ฐ ๋ช
์์ ์ผ๋ก ์ํ์ ์ธ์ ํ์ง ์๋ ํ)
- ํฐ ๋ณ๊ฒฝ์ ์ ๋ ํ์ง ๋ง์ญ์์ค - ์์ ๋จ๊ณ๋ก ๋๋๋๋ค
- ๊ฐ ๋ณ๊ฒฝ ํ ํ
์คํธ ์คํ์ ์ ๋ ๊ฑด๋๋ฐ์ง ๋ง์ญ์์ค
- ํ
์คํธ๊ฐ ์คํจํ๋ฉด ์ ๋ ๊ณ์ํ์ง ๋ง์ญ์์ค - ๋จผ์ ์์ ํ๊ฑฐ๋ ๋กค๋ฐฑํฉ๋๋ค
- ์ ๋ ๊ฐ์ ํ์ง ๋ง์ญ์์ค - ์์ฌ์ค๋ฌ์ฐ๋ฉด ์ง๋ฌธํฉ๋๋ค
ํ์ง ๋ง์์ผ ํ ๊ฒ
- ๋ฆฌํฉํ ๋ง๊ณผ ๊ธฐ๋ฅ ์ถ๊ฐ๋ฅผ ๊ฒฐํฉํ์ง ๋ง์ญ์์ค
- ํ๋ก๋์
๊ธด๊ธ ์ํฉ ์ค์ ๋ฆฌํฉํ ๋งํ์ง ๋ง์ญ์์ค
- ์ดํดํ์ง ๋ชปํ๋ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ์ง ๋ง์ญ์์ค
- ๊ณผ๋ํ๊ฒ ์์ง๋์ด๋งํ์ง ๋ง์ญ์์ค - ๋จ์ํ๊ฒ ์ ์งํฉ๋๋ค
- ๋ชจ๋ ๊ฒ์ ํ ๋ฒ์ ๋ฆฌํฉํ ๋งํ์ง ๋ง์ญ์์ค
๋น ๋ฅธ ์์ ์์
์๋๋ฆฌ์ค: ์ค๋ณต์ด ์๋ ๊ธด ๋ฉ์๋
์ด์ :
function processOrder(order) {
}
๋ฆฌํฉํ ๋ง ๋จ๊ณ:
- processOrder()์ ๋ํ ํ
์คํธ๊ฐ ์กด์ฌํ๋์ง ํ์ธํฉ๋๋ค
- ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ validateOrder()๋ก ์ถ์ถํฉ๋๋ค
- ํ
์คํธ - ํต๊ณผํด์ผ ํฉ๋๋ค
- ๊ณ์ฐ์ calculateOrderTotal()๋ก ์ถ์ถํฉ๋๋ค
- ํ
์คํธ - ํต๊ณผํด์ผ ํฉ๋๋ค
- ์๋ฆผ์ notifyCustomer()๋ก ์ถ์ถํฉ๋๋ค
- ํ
์คํธ - ํต๊ณผํด์ผ ํฉ๋๋ค
- ๋ฆฌ๋ทฐ - processOrder()๊ฐ ์ด์ 3๊ฐ์ ๋ช
ํํ ํจ์๋ฅผ ์ค์ผ์คํธ๋ ์ด์
ํฉ๋๋ค
์ดํ:
function processOrder(order) {
validateOrder(order);
const total = calculateOrderTotal(order);
notifyCustomer(order, total);
return { order, total };
}
์ฐธ๊ณ ์๋ฃ
์คํฌ๋ฆฝํธ
scripts/analyze-complexity.py - ์ฝ๋ ๋ณต์ก๋ ๋ฉํธ๋ฆญ ๋ถ์
scripts/detect-smells.py - ์๋ํ๋ ์ค๋ฉ ๊ฐ์ง
๋ฒ์ ๊ธฐ๋ก
- v1.0.0 (2025-01-15): Fowler ๋ฐฉ๋ฒ๋ก , ๋จ๊ณ์ ์ ๊ทผ, ์ฌ์ฉ์ ์๋ด ํฌ์ธํธ๊ฐ ํฌํจ๋ ์ด๊ธฐ ๋ฆด๋ฆฌ์ค