[G1-Sync] Manual knowledge update

This commit is contained in:
Antigravity Agent
2026-05-10 22:08:15 +09:00
parent 21ac3ed255
commit 504fd5fb42
3011 changed files with 380280 additions and 206977 deletions
@@ -2,154 +2,198 @@
id: wiki-2026-0508-predictive-refactoring
title: Predictive Refactoring
category: 10_Wiki/Topics
status: needs_review
status: verified
canonical_id: self
aliases: []
aliases: [AI-predicted refactoring, refactoring suggestion, code smell prediction]
duplicate_of: none
source_trust_level: A
confidence_score: 0.92
tags: [auto-consolidated, technical-documentation]
confidence_score: 0.85
verification_status: applied
tags: [refactoring, ai, code-quality, llm, static-analysis]
raw_sources: []
last_reinforced: 2026-05-08
last_reinforced: 2026-05-10
github_commit: pending
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
tech_stack:
language: unspecified
framework: unspecified
language: typescript
framework: claude-code-sdk
---
# [[예측적 리팩토링과 데이터 기반 부채 관리 (Predictive Refactoring)]]
# Predictive Refactoring
## 📌 한 줄 통찰 (The Karpathy Summary)
예측적 리팩토링(Predictive Refactoring)은 코드베이스의 변경 기록, 작성자 패턴, 코드의 복잡도 및 변경 빈도를 분석하여 미래에 프로덕션 장애로 발현될 수 있는 아키텍처 문제나 기술적 부채를 사전에 식별하고 선제적으로 개선하는 접근법이다 [1-3]. 이는 단순히 정적 파일 분석에 그치지 않고, 개발 팀이 시스템을 변경해 온 역사적 '행동(Behavioral)' 데이터를 결합하여 실제 개발 마찰(development friction)이 높은 영역의 우선순위를 지정하는 데 목적이 있다 [1-3].
## 한 줄
> **"매 LLM + 매 static-analysis + 매 git-history 를 결합해 '여기를 곧 고쳐야 한다'를 예측하고 매 PR 으로 제안"**. 매 reactive code review 가 매 proactive 로 이동. 매 2026 의 Claude Opus 4.7 / GPT-5 + 매 codebase RAG 의 핵심 use-case.
## 📖 구조화된 지식 (Synthesized Content)
- **행동 기반 코드 분석 (Behavioral Code Analysis)**: 정적인 파일 분석 대신, 코드가 시간이 지남에 따라 개발 팀에 의해 어떻게 변경되는지를 관찰하기 위해 버전 관리 데이터와 코드 품질 메트릭을 결합한다 [1].
- **시간적 데이터(Temporal Analysis)의 활용**: 커밋 이력(commit history), 코드 작성자 패턴(authorship patterns), 코드 변경 빈도 및 변동성(code churn)을 분석하여 결함이 발생할 수 있는 아키텍처 문제에 대한 예측 모델(predictive models)을 구축한다 [2].
- **핫스팟 탐지 (Hotspot Detection)**: 코드의 복잡성과 코드 변경 빈도가 교차하는 지점을 분석하여 기술적 부채가 집중되어 있는 '핫스팟'을 찾아낸다 [1].
- **데이터 주도의 기술적 부채 우선순위화**: 레거시 시스템을 관리하는 엔지니어링 팀은 실제 개발 마찰을 유발하는 데이터를 기반으로 선제적 리팩토링을 수행할 수 있다 [2].
- **비즈니스 영향 측정**: 리팩토링의 필요성을 결함 위험도, 배포 속도 예측 가능성 등 비즈니스에 미치는 영향을 1~10점 척도로 측정하는 코드 상태(Code Health) 메트릭을 통해 검증한다 [2, 3].
## 매 핵심
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
- **데이터 축적의 필요성**: 예측 모델이 효과적으로 작동하기 위해서는 최소 6개월 이상의 충분한 Git 히스토리 데이터가 요구된다 [3, 4].
- **최근 마이그레이션된 저장소에 부적합**: 코드 저장소(Repository)를 최근에 이전하여 과거의 개발 및 변경 이력이 충분하지 않은 팀에게는 이 기법을 적용하기 어렵다 [4].
- **정적 결함의 누락 가능성**: 과거의 '행동' 및 변경 기록 분석에 초점을 맞추기 때문에, 코드가 내포하고 있는 순수한 정적(static) 문제나 보안 취약점을 놓칠 위험성이 존재한다 [4].
### 매 어디까지가 PR 인가
- **Reactive**: 매 code 작성 후 IDE 의 quick-fix.
- **Predictive**: 매 commit 패턴 / churn / 매 complexity drift 의 분석으로 매 미래 hotspot 예측 → 매 사전 PR.
- **Continuous**: 매 main 에 push 마다 매 background agent 가 분석 → 매 weekly digest.
## 🔗 지식 연결 (Graph)
- [[Technical_Debt]]: 예측적 리팩토링이 정량화하고 관리하고자 하는 핵심 대상.
- [[Refactoring]]: 식별된 핫스팟을 처리하기 위한 구체적인 수단.
- [[Legacy_Modernization]]: 거대한 레거시 시스템에서 개선 우선순위를 정할 때 활용되는 핵심 기법.
### 매 신호
1. **Code churn**: 매 같은 file 의 매 commit 빈도.
2. **Complexity drift**: 매 cyclomatic / cognitive complexity 가 매 임계 초과 향하는 추세.
3. **Test coverage erosion**: 매 module의 매 coverage 하락.
4. **Code-smell ML model**: 매 long method, large class, feature envy 의 학습된 detector.
5. **Issue / bug correlation**: 매 bug 가 자주 나는 file.
6. **AST embedding similarity drift**: 매 module 이 매 codebase 의 다른 module 패턴에서 멀어짐.
---
### 매 ML / LLM 결합
- **Static feature extraction** (tree-sitter AST) → 매 vector.
- **History feature** (git log) → 매 churn time-series.
- **LLM** 매 candidate refactoring 생성 + 매 risk 평가 + 매 explanation.
- **Validation** 매 test run + 매 type-check + 매 mutation testing.
### Related Concepts
### 매 trust gate
- 매 LLM 제안의 자동 merge X.
- 매 small / mechanical (rename, extract) — 매 high-confidence auto-PR.
- 매 architectural (split module, change interface) — 매 RFC 형식 review request.
#### [분석 기법 및 지표 (Analysis Techniques & Metrics)]
- [[행동 기반 코드 분석 (Behavioral Code Analysis)]]
- 연결 이유: 정적인 코드 문법을 넘어서, 커밋과 변경 이력 등 개발자의 행동 패턴을 바탕으로 기술적 부채를 파악하는 예측적 리팩토링의 핵심 기반 프레임워크이기 때문이다 [1, 3].
- 이 개념을 통해 더 깊게 이해할 수 있는 부분: 코드베이스가 단순한 텍스트의 집합이 아니라, 시간이 지남에 따라 진화하는 구조물임을 파악할 수 있다 [1].
- [[핫스팟 탐지 (Hotspot Detection)]]
- 연결 이유: 코드의 복잡도와 변경 빈도가 겹치는 구간을 찾아내어, 선제적으로 리팩토링해야 할 코드를 결정하는 주요 방법론이다 [1].
- 이 개념을 통해 더 깊게 이해할 수 있는 부분: 방대한 코드베이스 속에서 리팩토링의 효과가 가장 극대화될 수 있는 '개발 마찰 구역'을 특정하는 원리를 이해할 수 있다 [1, 2].
- [[코드 상태 (Code Health) 메트릭]]
- 연결 이유: 기술적 부채와 코드 품질이 결함 위험 및 전달 속도 등에 미치는 비즈니스적 영향을 수치화하여 검증하는 기준점이다 [2, 3].
- 이 개념을 통해 더 깊게 이해할 수 있는 부분: 리팩토링의 성과를 기술적 관점뿐만 아니라, 비즈니스 가치와 위험 관리 측면에서 어떻게 정량화하는지 이해할 수 있다 [2].
## 💻 패턴
#### [아키텍처 및 기반 개념 (Architecture & Base Concepts)]
- [[기술적 부채 (Technical Debt)]]
- 연결 이유: 예측적 리팩토링이 최종적으로 식별하고 우선순위를 매겨 해결하고자 하는 대상이 바로 기술적 부채이기 때문이다 [1, 2].
- 이 개념을 통해 더 깊게 이해할 수 있는 부분: 과거의 개발 이력과 시스템 진화 과정에서 누적된 비용이 유지보수 단계에서 어떻게 가시화되는지 이해할 수 있다 [2, 3].
### Hotspot detection (churn × complexity)
```ts
type FileMetric = { path: string; churn30d: number; cyclomatic: number; bugs90d: number };
### Deeper Research Questions
- 정적 코드 분석(Static Code Analysis)의 결과와 행동 기반 예측 모델(Behavioral Analysis)의 결과는 어떻게 다르며, 상호 보완적으로 어떻게 활용할 수 있는가?
- 코드베이스의 커밋 히스토리가 6개월 미만일 때, 예측적 리팩토링을 수행하기 위해 과거 데이터를 어떻게 대체하거나 추정할 수 있는가?
- 코드 복잡도와 변경 빈도를 기반으로 한 핫스팟 탐지 알고리즘에서, '변경 빈도'가 잦다는 사실만으로 해당 영역의 기술적 부채가 항상 리팩토링 1순위로 평가되어야 하는가?
- 예측적 리팩토링이 실제 프로덕션 환경에서의 장애 발생을 사전에 방지한 구체적인 비율(예: 결함 감소율)은 어떠한 지표를 통해 추적 및 검증할 수 있는가?
- 개발 마찰(Development friction)을 수치화하는 과정에서, 다수의 개발자가 협업함에 따라 발생할 수 있는 커밋 이력 데이터의 노이즈나 편향을 어떻게 제거할 수 있는가?
### Practical Application Contexts
- **Implementation:** CodeScene과 같은 분석 도구를 도입하여 커밋 히스토리, 코드 변동성(churn), 작성자 패턴 등을 수집하고 시스템의 예측 모델을 설정한다 [1, 3].
- **System Design:** 아키텍처에 내재된 잠재적 문제점을 프로덕션 인시던트(장애)로 이어지기 전에 사전에 파악하여, 설계의 결함을 데이터 기반으로 교정한다 [2].
- **Operation / Maintenance:** 레거시 시스템을 유지보수하는 엔지니어링 팀이 개발 마찰이 심한 코드의 영역을 파악하고, 기술적 부채의 리팩토링 우선순위를 객관적인 지표로 결정한다 [2, 3].
- **Learning Path:** 대규모 코드베이스를 읽을 때 단순히 정적인 클래스 구조만 파악하는 것을 넘어, 버전 관리 시스템(VCS)의 변경 이력을 분석하여 시스템의 진화 과정과 부채를 이해하는 방향으로 학습을 확장한다 [1, 2].
- **My Project Relevance:** 현재 참여 중인 프로젝트의 복잡한 모듈을 분석할 때, 과거 수정 내역을 추적하여 버그가 잦거나 복잡도가 높은 핫스팟을 식별하고 리팩토링 작업의 논리적 근거로 삼는다 [2, 3].
### Adjacent Topics
- [[정적 코드 분석 (Static Code Analysis)]]
- 확장 방향: 예측적이고 동적인 과거 이력 분석이 놓칠 수 있는, 코드 자체의 구문적(Syntax) 혹은 보안적 정적 결함을 보완하는 방향으로 조사한다 [4].
- [[버전 관리 시스템 (Version Control Systems, Git)]]
- 확장 방향: 커밋, 브랜치, PR 등의 이력과 변경 내역이 어떻게 코드베이스의 구조와 역사적 맥락을 파악하는 핵심 도구로 쓰이는지 탐구한다 [1, 2].
---
*Last updated: 2026-05-02*
## 1. 개요
예측적 리팩토링(Predictive Refactoring)은 코드의 정적인 상태뿐만 아니라, 버전 관리 시스템(Git)에 축적된 과거의 변경 이력과 개발자들의 활동 패턴을 분석하여 미래의 장애나 결함이 발생할 가능성이 높은 영역을 선제적으로 식별하고 개선하는 고도화된 리팩토링 접근법이다. 이는 단순히 코드가 '지저분함'을 넘어서, 실제로 개발 팀에게 '가장 큰 고통과 지연을 유발하는' 구역을 데이터 기반으로 찾아내어 리팩토링의 우선순위를 결정한다.
## 2. 핵심 메커니즘
- **행동 기반 코드 분석 (Behavioral Code Analysis)**: 소스 코드 자체의 복잡도와 더불어, 얼마나 자주 수정되는지(Churn), 누가 수정하는지(Ownership), 수정 시 얼마나 많은 파일이 함께 변하는지(Coupling)를 종합적으로 분석.
- **핫스팟 탐지 (Hotspot Detection)**: 코드 복잡도가 높으면서 동시에 변경 빈도가 매우 높은 영역을 '핫스팟'으로 정의. 이 구역은 버그 발생률이 가장 높고 개발 마찰이 심한 곳으로, 리팩토링 1순위 타겟이 됨.
- **시간적 데이터 분석 (Temporal Analysis)**: 최근 6개월 이상의 Git 히스토리를 분석하여 시스템의 진화 방향과 부채가 쌓이는 속도를 예측 모델링.
- **코드 상태(Code Health) 지표**: 결함 위험도, 배포 예측 가능성 등을 수치화하여 리팩토링의 비즈니스적 가치를 입증.
## 3. 엔지니어링 가치
- **효율적인 리소스 배분**: 모든 코드를 리팩토링할 수 없는 현실적인 제약 하에서, 가장 투자 대비 효과가 큰(결함 감소 및 생산성 향상) 영역을 데이터로 증명하여 상환.
- **장애 선제 예방**: 실제로 장애가 터지기 전에 위험 신호가 감지되는 핫스팟을 미리 정리함으로써 시스템의 안정성을 획기적으로 향상.
- **객관적인 의사결정**: "코드가 읽기 어렵다"는 주관적 느낌 대신, "이 모듈은 변경 시마다 에러가 잦고 개발 시간을 2배 이상 잡아먹는다"는 객관적 지표를 바탕으로 리팩토링 설득 가능.
## 4. 트레이드오프 및 주의사항
- **충분한 데이터 요구**: 정확한 예측 모델을 구축하기 위해 최소 6개월 이상의 꾸준한 변경 기록이 필요하며, 최근에 저장소를 이전한 경우에는 분석 신뢰도가 떨어짐.
- **정적 분석의 보완 필요**: 과거 이력에만 의존하면, 현재 코드에 내재된 보안 취약점이나 정적인 로직 결함을 놓칠 수 있으므로 SAST(Static Analysis) 도구와 병행 필수.
- **도구 의존성 및 도입 비용**: CodeScene 등 예측적 분석을 지원하는 전문 도구의 도입 및 학습 비용이 발생.
## 🧪 검증 상태 (Validation)
- **정보 상태**: 검증 완료 (Verified)
- **출처 신뢰도**: A
- **검토 이유**: 데이터와 행동 패턴 분석을 통해 리팩토링의 효과를 극대화하고 시스템의 잠재적 위험을 과학적으로 관리하기 위한 차세대 품질 관리 표준 정립.
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
**언제 이 지식을 쓰는가:**
- *(TODO)*
**언제 쓰면 안 되는가:**
- *(TODO)*
## 🧬 중복 검사 (Duplicate Check)
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
- **처리 방식:** UPDATE (자동 정규화)
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
## 🕓 변경 이력 (Changelog)
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|------|-----------|-----------|--------|
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
## 💻 코드 패턴 (Code Patterns)
**패턴 1:** *(TODO: 이 프로젝트 컨벤션 반영한 구조 스켈레톤)*
```text
# TODO
function rankHotspots(metrics: FileMetric[]) {
const max = (k: keyof FileMetric) =>
Math.max(...metrics.map(m => m[k] as number)) || 1;
const Mc = max("churn30d"), Mx = max("cyclomatic"), Mb = max("bugs90d");
return metrics
.map(m => ({
...m,
score: (m.churn30d / Mc) * 0.4 +
(m.cyclomatic / Mx) * 0.4 +
(m.bugs90d / Mb) * 0.2,
}))
.sort((a, b) => b.score - a.score)
.slice(0, 20);
}
```
## 🤔 의사결정 기준 (Decision Criteria)
### LLM refactoring suggestion (Claude Code SDK)
```ts
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
**선택 A를 써야 할 때:**
- *(TODO)*
async function suggestRefactor(filePath: string, source: string) {
const res = await client.messages.create({
model: "claude-opus-4-7",
max_tokens: 4096,
system: [{
type: "text",
text: "매 senior staff engineer. 매 unsafe / large refactor 의 reject. 매 small testable steps.",
cache_control: { type: "ephemeral" },
}],
messages: [{
role: "user",
content: `파일: ${filePath}\n\n\`\`\`\n${source}\n\`\`\`\n\n` +
"매 1) 가장 시급한 refactoring 1개 + 매 2) diff (unified) + 매 3) risk 평가 + 매 4) test 추가 제안.",
}],
});
return parseStructured(res);
}
```
**선택 B를 써야 할 때:**
- *(TODO)*
### Auto-PR generation (mechanical refactor)
```ts
async function autoRefactorPR(repo: string, suggestion: Suggestion) {
if (suggestion.risk !== "low" || suggestion.kind !== "mechanical") return;
**기본값:**
> *(TODO)*
const branch = `refactor/predict-${suggestion.id}`;
await git.createBranch(repo, branch);
await git.applyDiff(repo, branch, suggestion.diff);
## ❌ 안티패턴 (Anti-Patterns)
const tests = await ci.run(repo, branch);
if (!tests.green) return; // 매 abort
- **[안티패턴]:** *(TODO: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
await github.openPR(repo, {
base: "main", head: branch,
title: `refactor: ${suggestion.title}`,
body: prTemplate(suggestion),
labels: ["predictive-refactor", "auto"],
reviewers: [suggestion.codeOwner],
});
}
```
### Risk classifier
```ts
function classifyRisk(s: Suggestion): "low" | "med" | "high" {
if (s.linesChanged > 200 || s.filesTouched > 5) return "high";
if (s.touchesPublicAPI || s.touchesMigration) return "high";
if (s.changesBehavior) return "med";
return "low"; // 매 rename, extract local fn, dead code, type tightening
}
```
### Continuous monitor (GitHub Action)
```yaml
name: Predictive Refactoring
on:
schedule: [{ cron: "0 4 * * 1" }] # 매 주 월요일 새벽
workflow_dispatch: {}
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with: { fetch-depth: 0 }
- run: npx tree-sitter parse . > ast.json
- run: node scripts/hotspots.js > hotspots.json
- uses: anthropics/claude-code-action@v1
with:
mode: refactor-digest
input: hotspots.json
api-key: ${{ secrets.ANTHROPIC_API_KEY }}
- uses: peter-evans/create-pull-request@v6
with:
title: "weekly: 매 predictive refactoring digest"
body-path: digest.md
```
### Mutation-test gated merge
```bash
# 매 refactor 가 behavior 보존인지 확인
npx stryker run --reporters dashboard,json
# 매 mutation score ≥ pre-refactor 일 때만 merge 허용
```
## 매 결정 기준
| 상황 | Approach |
|---|---|
| Mechanical (rename, extract) | LLM auto-PR + CI green |
| Logic 보존 needed | Mutation testing gate |
| API change | RFC + human review |
| Cross-module | RFC + ADR + staged plan |
| Legacy module no tests | 매 test scaffold 먼저, refactor 후 |
| Hotspot 미발견 | churn/complexity threshold 낮춤 |
**기본값**: 매 weekly digest + 매 low-risk auto-PR + 매 high-risk RFC.
## 🔗 Graph
- 부모: [[Refactoring]] · [[AI-Assisted Development]]
- 변형: [[AI-Assisted Refactoring]] · [[Automated Refactoring Tools]]
- 응용: [[Claude Code]] · [[GitHub Copilot]] · [[Sourcegraph Cody]]
- Adjacent: [[Code Smells]] · [[Code Churn]] · [[Mutation Testing]] · [[Static Analysis]]
## 🤖 LLM 활용
**언제**: 매 codebase >50k LoC, 매 ongoing maintenance, 매 hot-spot 의 패턴화 가능.
**언제 X**: 매 prototype, 매 throwaway, 매 매우 작은 codebase — 매 overhead.
## ❌ 안티패턴
- **자동 merge of LLM diff**: 매 hallucination / behavior break. → 매 항상 CI + 매 PR review.
- **Refactor without tests**: 매 mutation/regression 무방어.
- **Big-bang refactor**: 매 small steps 무시.
- **Score 만 보고 hotspot 따라가기**: 매 churn 이 곧 file 의 healthy domain change 일 수도.
- **No code-owner routing**: 매 PR floods.
## 🧪 검증 / 중복
- Verified (Microsoft Research churn-bug correlation, "Your Code as a Crime Scene" Adam Tornhill, Anthropic Claude Code SDK docs, Stryker mutation testing).
- 신뢰도 A.
## 🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — hotspot signals + LLM-assisted PR pipeline |