stack-analysis
CHAPTER 119 / 120
읽기 약 2분
FUNCTION
기술 부채 관리: 리팩토링 전략
핵심 개념
tech debt 분류·점진 리팩토링·boy scout rule·strangler fig — 안전한 개선.
본문
기술 부채 4분면
의도적
┌─────────────┬─────────────┐
신중│ 신중·의도적 │ 무모·의도적 │ 무모
│ "지금은 빠르게│ "내일 고치자│
│ 나중에 고침"│ (실제로는?)│
├─────────────┼─────────────┤
│ 신중·우발적 │ 무모·우발적 │
│ "이제 다른 │ "레이어드 │
│ 방법 알았네"│ 아키텍처가 │
│ │ 뭐죠?" │
└─────────────┴─────────────┘
우발적부채 분류 + 우선순위
[High Priority]
- 보안 이슈
- 빈번한 버그 발생 영역
- 핫스팟 (자주 변경)
- 출시 블로커
[Medium]
- 성능 저하
- 개발 속도 저하
- 새 기능 추가 어려움
[Low]
- 코드 스타일
- 사용 빈도 낮은 영역
- 곧 deprecated 예정
→ High만 즉시 해결
→ Medium은 boy scout rule
→ Low는 무시 OKBoy Scout Rule
"항상 들어왔을 때보다 더 깨끗하게 떠나라"
기능 작업 시 같은 영역에:
- 명확한 변수명
- 함수 분리
- 타입 추가
- 작은 테스트
→ 한 번에 큰 리팩토링 X
→ 매 PR마다 5~10% 개선
→ 1년 후 코드베이스 80% 개선점진 리팩토링 (Strangler Fig)
오래된 시스템 → 새 시스템 점진 교체
[1단계] 새 코드 옆에 새 모듈 작성
- 작은 부분만 새 패턴
- 기존 코드 영향 X
[2단계] Facade로 라우팅
- 일부 기능 → 새 모듈
- 나머지 → 기존 코드
[3단계] 점진 이전
- 한 번에 1~2 기능
- 검증 후 다음
[4단계] 기존 코드 제거
- 모두 이전 완료
- 옛 코드 삭제
기간: 6개월~2년
장점: 항상 동작, 위험 분산데드 코드 제거
# 사용 안 하는 export 검출
pnpm dlx ts-prune
# 결과
src/utils/legacy.ts:5 - oldFunction
src/components/Old.tsx:1 - OldComponent
src/lib/deprecated.ts:23 - deprecatedHelper
# Knip — 더 강력
pnpm dlx knip
# → 미사용 export, 의존성, 파일 모두
# CI에 통합
- name: Find dead code
run: pnpm dlx ts-prune --error테스트로 안전망
// 리팩토링 전:
// 1. 현재 동작 테스트로 캡처
describe('orderService.calculateTotal', () => {
it('handles basic order', () => {
const result = calculateTotal({ items: [...], discount: 0 });
expect(result).toBe(50000);
});
it('applies percentage discount', () => {
const result = calculateTotal({ items: [...], discount: { type: '%', value: 10 } });
expect(result).toBe(45000);
});
// ... 모든 케이스
});
// 2. 리팩토링 — 테스트 통과 유지
// 3. 검증 — 같은 결과측정 — 코드 품질 메트릭
# 복잡도 (cyclomatic complexity)
pnpm dlx eslint --rule 'complexity: ["error", 10]'
# 코드 중복
pnpm dlx jscpd src/
# 의존성 그래프
pnpm dlx madge --circular src/
# → 순환 의존성 검출
# 코드 cover
pnpm test --coverage
# → 80% 이상 목표
# SonarQube (종합)
- 버그·취약점·코드 스멜
- 기술 부채 시간 추정예: God Object 분해
// ❌ 1000줄 OrderService — 모든 것 한 곳
class OrderService {
calculateTotal() { ... }
applyDiscount() { ... }
processPayment() { ... }
sendEmail() { ... }
updateInventory() { ... }
generateInvoice() { ... }
// ... 30 메서드
}
// ✅ 책임 분리
class OrderCalculator {
calculateTotal() { ... }
applyDiscount() { ... }
}
class PaymentProcessor {
process() { ... }
}
class OrderNotifier {
sendConfirmation() { ... }
}
class InventoryReserver {
reserve() { ... }
release() { ... }
}
class OrderService {
constructor(
private calculator: OrderCalculator,
private payment: PaymentProcessor,
private notifier: OrderNotifier,
private inventory: InventoryReserver,
) {}
async placeOrder(input: any) {
const total = this.calculator.calculateTotal(input);
await this.inventory.reserve(input.items);
await this.payment.process(total);
await this.notifier.sendConfirmation(input);
}
}라이브러리 마이그레이션
// jQuery → React 마이그레이션 사례
[Phase 1] 새 페이지만 React
[Phase 2] 기존 페이지의 일부 컴포넌트 React로 mount
[Phase 3] 페이지 단위로 React 전환
[Phase 4] jQuery 제거
// Webpack → Vite
[Phase 1] dev 서버만 Vite (빠름)
[Phase 2] 빌드도 Vite
[Phase 3] webpack 제거
// CommonJS → ESM
- "type": "module" 점진 적용
- import/export로 변환
- __dirname 등 대체다음 챕터
CH.120 "실전 스택 해부 마스터 로드맵".
AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude
무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6
내 코드의 기술 부채 부분을 분석해서 실전 분석 + 개선 우선순위를 알려줘.
ChatGPT
무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro
기술 부채 관련 베스트 프랙티스 5가지를 비교 분석해서 패턴 추출를 알려줘.
Gemini
무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro
내 프로젝트 전체에서 기술 부채 최적화 가능 위치를 보고해줘.
Grok
무료: Grok 4.1 / SuperGrok $30/mo
2026년 한국 시장의 기술 부채 트렌드를 솔직히 알려줘.
⭐ 이것만 기억하세요
기술 부채 관리: 리팩토링 전략은 이 3가지만 확실히 잡으세요
1.Boy Scout Rule = 매 PR마다 5% 개선 — 큰 리팩토링 X
2.Strangler Fig 패턴으로 안전한 점진 교체
3.테스트로 안전망 + 메트릭으로 측정
공유하기
진행도 119 / 120