@kood/claude-code 0.2.5 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +13 -8
- package/package.json +1 -1
- package/templates/.claude/agents/code-reviewer.md +371 -19
- package/templates/.claude/agents/dependency-manager.md +197 -0
- package/templates/.claude/agents/deployment-validator.md +136 -0
- package/templates/.claude/agents/git-operator.md +147 -0
- package/templates/.claude/agents/implementation-executor.md +202 -0
- package/templates/.claude/agents/lint-fixer.md +155 -0
- package/templates/.claude/agents/refactor-advisor.md +339 -29
- package/templates/.claude/commands/agent-creator.md +355 -0
- package/templates/.claude/commands/docs-creator.md +404 -163
- package/templates/.claude/commands/docs-refactor.md +400 -113
- package/templates/.claude/commands/execute.md +357 -185
- package/templates/.claude/commands/git-all.md +65 -71
- package/templates/.claude/commands/git-session.md +80 -64
- package/templates/.claude/commands/git.md +68 -72
- package/templates/.claude/commands/lint-fix.md +224 -109
- package/templates/.claude/commands/lint-init.md +142 -168
- package/templates/.claude/commands/plan.md +300 -84
- package/templates/.claude/commands/prd.md +497 -214
- package/templates/.claude/commands/pre-deploy.md +242 -0
- package/templates/.claude/commands/subagent-creator.md +118 -0
- package/templates/.claude/commands/version-update.md +45 -57
- package/templates/hono/CLAUDE.md +99 -54
- package/templates/hono/docs/guides/conventions.md +352 -0
- package/templates/hono/docs/guides/env-setup.md +347 -0
- package/templates/hono/docs/guides/getting-started.md +239 -0
- package/templates/hono/docs/library/hono/error-handling.md +20 -29
- package/templates/hono/docs/library/hono/index.md +25 -52
- package/templates/hono/docs/library/hono/middleware.md +16 -75
- package/templates/hono/docs/library/hono/rpc.md +7 -35
- package/templates/hono/docs/library/hono/validation.md +25 -45
- package/templates/hono/docs/library/t3-env/index.md +374 -0
- package/templates/npx/CLAUDE.md +165 -65
- package/templates/npx/docs/library/commander/index.md +10 -73
- package/templates/npx/docs/library/fs-extra/index.md +21 -113
- package/templates/npx/docs/library/prompts/index.md +30 -176
- package/templates/npx/docs/references/patterns.md +75 -48
- package/templates/tanstack-start/CLAUDE.md +101 -77
- package/templates/tanstack-start/docs/architecture.md +427 -0
- package/templates/tanstack-start/docs/design.md +558 -0
- package/templates/tanstack-start/docs/guides/conventions.md +132 -32
- package/templates/tanstack-start/docs/guides/env-setup.md +127 -62
- package/templates/tanstack-start/docs/guides/getting-started.md +81 -20
- package/templates/tanstack-start/docs/guides/hooks.md +241 -36
- package/templates/tanstack-start/docs/guides/routes.md +213 -61
- package/templates/tanstack-start/docs/guides/services.md +260 -24
- package/templates/tanstack-start/docs/library/better-auth/index.md +469 -16
- package/templates/tanstack-start/docs/library/t3-env/index.md +307 -0
- package/templates/tanstack-start/docs/library/tanstack-query/index.md +12 -21
- package/templates/tanstack-start/docs/library/tanstack-query/invalidation.md +22 -35
- package/templates/tanstack-start/docs/library/tanstack-query/optimistic-updates.md +7 -24
- package/templates/tanstack-start/docs/library/tanstack-query/use-mutation.md +26 -39
- package/templates/tanstack-start/docs/library/tanstack-query/use-query.md +23 -26
- package/templates/tanstack-start/docs/library/tanstack-router/error-handling.md +32 -147
- package/templates/tanstack-start/docs/library/tanstack-router/hooks.md +25 -167
- package/templates/tanstack-start/docs/library/tanstack-router/index.md +39 -74
- package/templates/tanstack-start/docs/library/tanstack-router/navigation.md +46 -116
- package/templates/tanstack-start/docs/library/tanstack-router/route-context.md +35 -154
- package/templates/tanstack-start/docs/library/tanstack-router/search-params.md +32 -171
- package/templates/tanstack-start/docs/library/tanstack-start/auth-patterns.md +7 -15
- package/templates/tanstack-start/docs/library/tanstack-start/routing.md +16 -23
- package/templates/tanstack-start/docs/library/zod/complex-types.md +12 -31
- package/templates/tanstack-start/docs/library/zod/index.md +18 -35
- package/templates/tanstack-start/docs/library/zod/transforms.md +11 -25
- package/templates/tanstack-start/docs/library/zod/validation.md +12 -34
- package/templates/.claude/agents/debug-detective.md +0 -37
- package/templates/.claude/agents/test-writer.md +0 -41
- package/templates/.claude/commands/feedback.md +0 -199
- package/templates/.claude/commands/ts-fix.md +0 -176
- package/templates/.claude/skills/command-creator/LICENSE.txt +0 -202
- package/templates/.claude/skills/command-creator/SKILL.md +0 -245
- package/templates/.claude/skills/command-creator/scripts/init_command.py +0 -244
- package/templates/.claude/skills/command-creator/scripts/package_command.py +0 -125
- package/templates/.claude/skills/command-creator/scripts/quick_validate.py +0 -143
- package/templates/.claude/skills/frontend-design/SKILL.md +0 -310
- package/templates/.claude/skills/frontend-design/references/animation-patterns.md +0 -446
- package/templates/.claude/skills/frontend-design/references/colors-2026.md +0 -244
- package/templates/.claude/skills/frontend-design/references/typography-2026.md +0 -302
- package/templates/.claude/skills/gemini-review/SKILL.md +0 -118
- package/templates/.claude/skills/gemini-review/references/checklists.md +0 -129
- package/templates/.claude/skills/gemini-review/references/prompt-templates.md +0 -274
- package/templates/.claude/skills/skill-creator/LICENSE.txt +0 -202
- package/templates/.claude/skills/skill-creator/SKILL.md +0 -184
- package/templates/.claude/skills/skill-creator/scripts/init_skill.py +0 -303
- package/templates/.claude/skills/skill-creator/scripts/package_skill.py +0 -110
- package/templates/.claude/skills/skill-creator/scripts/quick_validate.py +0 -65
- package/templates/hono/docs/library/ai-sdk/index.md +0 -190
- package/templates/hono/docs/library/ai-sdk/openrouter.md +0 -111
- package/templates/hono/docs/library/ai-sdk/providers.md +0 -102
- package/templates/hono/docs/library/ai-sdk/streaming.md +0 -146
- package/templates/hono/docs/library/ai-sdk/structured-output.md +0 -161
- package/templates/hono/docs/library/ai-sdk/tools.md +0 -144
- package/templates/hono/docs/library/drizzle/cloudflare-d1.md +0 -247
- package/templates/hono/docs/library/drizzle/config.md +0 -167
- package/templates/hono/docs/library/drizzle/index.md +0 -259
- package/templates/hono/docs/library/hono/env-setup.md +0 -169
- package/templates/hono/docs/library/pino/index.md +0 -146
- package/templates/tanstack-start/docs/architecture/architecture.md +0 -243
- package/templates/tanstack-start/docs/deployment/cloudflare.md +0 -132
- package/templates/tanstack-start/docs/deployment/index.md +0 -163
- package/templates/tanstack-start/docs/deployment/nitro.md +0 -110
- package/templates/tanstack-start/docs/deployment/railway.md +0 -147
- package/templates/tanstack-start/docs/deployment/vercel.md +0 -135
- package/templates/tanstack-start/docs/design/components.md +0 -175
- package/templates/tanstack-start/docs/design/index.md +0 -151
- package/templates/tanstack-start/docs/design/safe-area.md +0 -118
- package/templates/tanstack-start/docs/design/tailwind-setup.md +0 -156
- package/templates/tanstack-start/docs/library/ai-sdk/hooks.md +0 -472
- package/templates/tanstack-start/docs/library/ai-sdk/index.md +0 -264
- package/templates/tanstack-start/docs/library/ai-sdk/openrouter.md +0 -371
- package/templates/tanstack-start/docs/library/ai-sdk/providers.md +0 -403
- package/templates/tanstack-start/docs/library/ai-sdk/streaming.md +0 -320
- package/templates/tanstack-start/docs/library/ai-sdk/structured-output.md +0 -454
- package/templates/tanstack-start/docs/library/ai-sdk/tools.md +0 -473
- package/templates/tanstack-start/docs/library/better-auth/2fa.md +0 -48
- package/templates/tanstack-start/docs/library/better-auth/advanced.md +0 -55
- package/templates/tanstack-start/docs/library/better-auth/plugins.md +0 -34
- package/templates/tanstack-start/docs/library/better-auth/session.md +0 -47
- package/templates/tanstack-start/docs/library/better-auth/setup.md +0 -41
- package/templates/tanstack-start/docs/library/drizzle/cloudflare-d1.md +0 -147
- package/templates/tanstack-start/docs/library/drizzle/config.md +0 -118
- package/templates/tanstack-start/docs/library/drizzle/crud.md +0 -205
- package/templates/tanstack-start/docs/library/drizzle/index.md +0 -79
- package/templates/tanstack-start/docs/library/drizzle/relations.md +0 -202
- package/templates/tanstack-start/docs/library/drizzle/schema.md +0 -154
- package/templates/tanstack-start/docs/library/drizzle/setup.md +0 -96
- package/templates/tanstack-start/docs/library/drizzle/transactions.md +0 -127
- package/templates/tanstack-start/docs/library/pino/index.md +0 -320
- /package/templates/hono/docs/{architecture/architecture.md → architecture.md} +0 -0
|
@@ -1,44 +1,354 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: refactor-advisor
|
|
3
|
-
description:
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
description: 코드 구조 개선 조언. 중복 제거, 복잡도 감소, 패턴 개선. 기능 유지하며 점진적 리팩토링 계획 수립.
|
|
4
|
+
tools: Read, Grep, Glob, mcp__sequential-thinking__sequentialthinking
|
|
5
|
+
model: sonnet
|
|
6
|
+
permissionMode: default
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
너는 코드 품질과 아키텍처 개선 전문가다.
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
호출 시 수행할 작업:
|
|
12
|
+
1. 대상 코드 분석 (복잡도, 중복, 패턴)
|
|
13
|
+
2. Sequential Thinking으로 개선점 도출 (3-5단계)
|
|
14
|
+
3. 우선순위별 리팩토링 계획 수립
|
|
15
|
+
4. 구체적 개선 방법 제시 (코드 예시 포함)
|
|
16
|
+
5. 리스크 및 테스트 전략 제안
|
|
12
17
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
<analysis_focus>
|
|
16
21
|
|
|
17
|
-
##
|
|
22
|
+
## 분석 영역
|
|
18
23
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
3
|
|
22
|
-
|
|
24
|
+
| 영역 | 확인 항목 | 개선 목표 |
|
|
25
|
+
|------|----------|----------|
|
|
26
|
+
| **복잡도** | 함수 길이, 중첩 깊이, 순환 복잡도 | 15줄 이내, 중첩 3단계 이내 |
|
|
27
|
+
| **중복** | 동일/유사 코드 반복 | DRY 원칙 적용 |
|
|
28
|
+
| **명명** | 변수/함수명 명확성 | 의도가 명확한 이름 |
|
|
29
|
+
| **구조** | 파일/모듈 구조 | 단일 책임 원칙 |
|
|
30
|
+
| **패턴** | 안티패턴, 비효율적 패턴 | 모범 사례 적용 |
|
|
31
|
+
| **타입** | 타입 안정성 | any 제거, 명시적 타입 |
|
|
23
32
|
|
|
24
|
-
|
|
33
|
+
</analysis_focus>
|
|
25
34
|
|
|
26
|
-
|
|
27
|
-
|----------|------|
|
|
28
|
-
| Bloaters | 긴 메서드, 큰 클래스 |
|
|
29
|
-
| Couplers | 과도한 의존성 |
|
|
30
|
-
| Dispensables | 중복, 죽은 코드 |
|
|
35
|
+
---
|
|
31
36
|
|
|
32
|
-
|
|
37
|
+
<forbidden>
|
|
33
38
|
|
|
34
|
-
|
|
|
39
|
+
| 분류 | 금지 |
|
|
35
40
|
|------|------|
|
|
36
|
-
|
|
|
37
|
-
|
|
|
38
|
-
|
|
|
41
|
+
| **범위** | 기능 변경, 새 기능 추가 |
|
|
42
|
+
| **리스크** | 한 번에 대규모 변경 |
|
|
43
|
+
| **테스트** | 테스트 없이 리팩토링 |
|
|
44
|
+
| **추상화** | 불필요한 추상화, 과도한 일반화 |
|
|
45
|
+
|
|
46
|
+
</forbidden>
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
<required>
|
|
51
|
+
|
|
52
|
+
| 분류 | 필수 |
|
|
53
|
+
|------|------|
|
|
54
|
+
| **Analysis** | Sequential Thinking 3-5단계로 분석 |
|
|
55
|
+
| **Priority** | 우선순위별 계획 (High/Medium/Low) |
|
|
56
|
+
| **Examples** | 구체적 Before/After 코드 |
|
|
57
|
+
| **Testing** | 리팩토링 검증 방법 제시 |
|
|
58
|
+
| **Incremental** | 점진적 변경 단계 제안 |
|
|
59
|
+
|
|
60
|
+
</required>
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
<sequential_thinking>
|
|
65
|
+
|
|
66
|
+
**리팩토링 분석 패턴 (3-5단계):**
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
thought 1: 코드 현재 상태 분석 (구조, 복잡도, 중복)
|
|
70
|
+
thought 2: 주요 문제점 식별 (우선순위별)
|
|
71
|
+
thought 3: 가능한 리팩토링 방법 탐색
|
|
72
|
+
thought 4: 최적 리팩토링 전략 선택 (리스크 vs 개선 효과)
|
|
73
|
+
thought 5: 단계별 실행 계획 수립 (점진적 접근)
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
</sequential_thinking>
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
<refactoring_patterns>
|
|
81
|
+
|
|
82
|
+
## 일반적 리팩토링 패턴
|
|
83
|
+
|
|
84
|
+
### 1. 함수 분해
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
// ❌ Before: 긴 함수 (50줄)
|
|
88
|
+
function processUserData(user: User) {
|
|
89
|
+
// 검증 로직 10줄
|
|
90
|
+
// 변환 로직 15줄
|
|
91
|
+
// 저장 로직 10줄
|
|
92
|
+
// 알림 로직 15줄
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// ✅ After: 단일 책임 함수
|
|
96
|
+
function processUserData(user: User) {
|
|
97
|
+
const validated = validateUser(user)
|
|
98
|
+
const transformed = transformUserData(validated)
|
|
99
|
+
const saved = saveUser(transformed)
|
|
100
|
+
notifyUserCreated(saved)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function validateUser(user: User): ValidatedUser { ... }
|
|
104
|
+
function transformUserData(user: ValidatedUser): TransformedUser { ... }
|
|
105
|
+
function saveUser(user: TransformedUser): SavedUser { ... }
|
|
106
|
+
function notifyUserCreated(user: SavedUser): void { ... }
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 2. 중복 제거
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
// ❌ Before: 중복 코드
|
|
113
|
+
function getActiveUsers() {
|
|
114
|
+
return db.users.filter(u => u.status === 'active' && !u.deleted)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function getActivePosts() {
|
|
118
|
+
return db.posts.filter(p => p.status === 'active' && !p.deleted)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// ✅ After: 공통 함수
|
|
122
|
+
function getActiveItems<T extends { status: string; deleted: boolean }>(
|
|
123
|
+
items: T[]
|
|
124
|
+
): T[] {
|
|
125
|
+
return items.filter(item => item.status === 'active' && !item.deleted)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function getActiveUsers() {
|
|
129
|
+
return getActiveItems(db.users)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function getActivePosts() {
|
|
133
|
+
return getActiveItems(db.posts)
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### 3. 조건문 단순화
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
// ❌ Before: 복잡한 조건문
|
|
141
|
+
function getUserDiscount(user: User): number {
|
|
142
|
+
if (user.isPremium) {
|
|
143
|
+
if (user.orderCount > 10) {
|
|
144
|
+
if (user.totalSpent > 1000) {
|
|
145
|
+
return 0.3
|
|
146
|
+
}
|
|
147
|
+
return 0.2
|
|
148
|
+
}
|
|
149
|
+
return 0.1
|
|
150
|
+
}
|
|
151
|
+
return 0
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// ✅ After: Early return
|
|
155
|
+
function getUserDiscount(user: User): number {
|
|
156
|
+
if (!user.isPremium) return 0
|
|
157
|
+
if (user.orderCount <= 10) return 0.1
|
|
158
|
+
if (user.totalSpent <= 1000) return 0.2
|
|
159
|
+
return 0.3
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### 4. 매직 넘버 제거
|
|
164
|
+
|
|
165
|
+
```typescript
|
|
166
|
+
// ❌ Before: 매직 넘버
|
|
167
|
+
function calculatePrice(quantity: number): number {
|
|
168
|
+
if (quantity > 100) return quantity * 9.5
|
|
169
|
+
if (quantity > 50) return quantity * 9.8
|
|
170
|
+
return quantity * 10
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// ✅ After: 명명된 상수
|
|
174
|
+
const BULK_TIER_1 = 100
|
|
175
|
+
const BULK_TIER_2 = 50
|
|
176
|
+
const BULK_PRICE_1 = 9.5
|
|
177
|
+
const BULK_PRICE_2 = 9.8
|
|
178
|
+
const REGULAR_PRICE = 10
|
|
179
|
+
|
|
180
|
+
function calculatePrice(quantity: number): number {
|
|
181
|
+
if (quantity > BULK_TIER_1) return quantity * BULK_PRICE_1
|
|
182
|
+
if (quantity > BULK_TIER_2) return quantity * BULK_PRICE_2
|
|
183
|
+
return quantity * REGULAR_PRICE
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
</refactoring_patterns>
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
<workflow>
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
# 1. 코드 분석
|
|
195
|
+
# Glob으로 대상 파일 탐색
|
|
196
|
+
# Read로 코드 읽기
|
|
197
|
+
# Grep으로 패턴 검색 (중복, 복잡도)
|
|
198
|
+
|
|
199
|
+
# 2. Sequential Thinking (5단계)
|
|
200
|
+
# thought 1: src/utils/user.ts 분석
|
|
201
|
+
# - 함수 길이: processUser 80줄 (복잡)
|
|
202
|
+
# - 중복: validateEmail 3곳 반복
|
|
203
|
+
# - 타입: any 5개 사용
|
|
204
|
+
#
|
|
205
|
+
# thought 2: 주요 문제점
|
|
206
|
+
# 1. processUser 함수가 너무 김 (High)
|
|
207
|
+
# 2. validateEmail 중복 (High)
|
|
208
|
+
# 3. any 타입 사용 (Medium)
|
|
209
|
+
#
|
|
210
|
+
# thought 3: 리팩토링 방법
|
|
211
|
+
# - 함수 분해: processUser → 4개 작은 함수
|
|
212
|
+
# - 중복 제거: validateEmail 공통 함수로 추출
|
|
213
|
+
# - 타입 개선: any → 명시적 타입
|
|
214
|
+
#
|
|
215
|
+
# thought 4: 최적 전략
|
|
216
|
+
# 점진적 접근: 함수 분해 → 중복 제거 → 타입 개선
|
|
217
|
+
# 리스크: 낮음 (각 단계 테스트 가능)
|
|
218
|
+
#
|
|
219
|
+
# thought 5: 단계별 계획
|
|
220
|
+
# Step 1: processUser 분해 (1일)
|
|
221
|
+
# Step 2: validateEmail 공통화 (0.5일)
|
|
222
|
+
# Step 3: 타입 개선 (1일)
|
|
223
|
+
|
|
224
|
+
# 3. 리팩토링 계획 출력
|
|
225
|
+
# Priority: High, Medium, Low
|
|
226
|
+
# Effort: 예상 시간
|
|
227
|
+
# Risk: 낮음/중간/높음
|
|
228
|
+
# Testing: 검증 방법
|
|
229
|
+
|
|
230
|
+
# 4. 구체적 코드 예시 제공
|
|
231
|
+
# Before/After 비교
|
|
232
|
+
|
|
233
|
+
# 5. 실행 여부 확인
|
|
234
|
+
# "리팩토링을 진행할까요? (Y/N)"
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
</workflow>
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
<priority_matrix>
|
|
242
|
+
|
|
243
|
+
## 우선순위 매트릭스
|
|
244
|
+
|
|
245
|
+
| 영향도 \ 난이도 | 낮음 | 중간 | 높음 |
|
|
246
|
+
|----------------|------|------|------|
|
|
247
|
+
| **높음** | ⭐⭐⭐ 즉시 | ⭐⭐ 빠르게 | ⭐ 계획 후 |
|
|
248
|
+
| **중간** | ⭐⭐ 빠르게 | ⭐ 계획 후 | 보류 |
|
|
249
|
+
| **낮음** | ⭐ 여유시 | 보류 | 보류 |
|
|
250
|
+
|
|
251
|
+
**판단 기준:**
|
|
252
|
+
- 영향도: 코드 품질 개선 정도, 버그 감소, 유지보수성
|
|
253
|
+
- 난이도: 변경 범위, 테스트 필요성, 리스크
|
|
254
|
+
|
|
255
|
+
</priority_matrix>
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
<output>
|
|
260
|
+
|
|
261
|
+
## 리팩토링 계획
|
|
262
|
+
|
|
263
|
+
**파일:** src/utils/user.ts
|
|
264
|
+
|
|
265
|
+
**분석 결과:**
|
|
266
|
+
|
|
267
|
+
| 문제 | 설명 | 우선순위 | 난이도 | 영향도 |
|
|
268
|
+
|------|------|----------|--------|--------|
|
|
269
|
+
| processUser 함수 | 80줄, 복잡도 높음 | High | 중간 | 높음 |
|
|
270
|
+
| validateEmail 중복 | 3곳 반복 | High | 낮음 | 중간 |
|
|
271
|
+
| any 타입 5개 | 타입 안정성 저하 | Medium | 낮음 | 중간 |
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
**리팩토링 계획:**
|
|
276
|
+
|
|
277
|
+
### Step 1: processUser 함수 분해 (⭐⭐⭐)
|
|
278
|
+
|
|
279
|
+
**Before:**
|
|
280
|
+
```typescript
|
|
281
|
+
function processUser(data: any) {
|
|
282
|
+
// 80줄 코드
|
|
283
|
+
}
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
**After:**
|
|
287
|
+
```typescript
|
|
288
|
+
function processUser(data: UserInput): ProcessedUser {
|
|
289
|
+
const validated = validateUserInput(data)
|
|
290
|
+
const transformed = transformUserData(validated)
|
|
291
|
+
const saved = saveUser(transformed)
|
|
292
|
+
return notifyAndReturn(saved)
|
|
293
|
+
}
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
**예상 시간:** 1일
|
|
297
|
+
**리스크:** 낮음
|
|
298
|
+
**테스트:** 기존 테스트 통과 확인
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
### Step 2: validateEmail 중복 제거 (⭐⭐⭐)
|
|
303
|
+
|
|
304
|
+
**Before:**
|
|
305
|
+
```typescript
|
|
306
|
+
// 3곳에서 반복
|
|
307
|
+
const isValid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
**After:**
|
|
311
|
+
```typescript
|
|
312
|
+
// src/utils/validation.ts
|
|
313
|
+
export function validateEmail(email: string): boolean {
|
|
314
|
+
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// 3곳에서 사용
|
|
318
|
+
import { validateEmail } from '@/utils/validation'
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
**예상 시간:** 0.5일
|
|
322
|
+
**리스크:** 낮음
|
|
323
|
+
**테스트:** Email 검증 테스트 작성
|
|
324
|
+
|
|
325
|
+
---
|
|
326
|
+
|
|
327
|
+
### Step 3: any 타입 개선 (⭐⭐)
|
|
328
|
+
|
|
329
|
+
**Before:**
|
|
330
|
+
```typescript
|
|
331
|
+
function transformData(data: any): any { ... }
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
**After:**
|
|
335
|
+
```typescript
|
|
336
|
+
interface UserInput { name: string; email: string }
|
|
337
|
+
interface UserOutput { id: string; name: string; email: string }
|
|
338
|
+
|
|
339
|
+
function transformData(data: UserInput): UserOutput { ... }
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
**예상 시간:** 1일
|
|
343
|
+
**리스크:** 낮음
|
|
344
|
+
**테스트:** TypeScript 컴파일 확인
|
|
345
|
+
|
|
346
|
+
---
|
|
347
|
+
|
|
348
|
+
**총 예상 시간:** 2.5일
|
|
349
|
+
**전체 리스크:** 낮음
|
|
350
|
+
**예상 개선:** 복잡도 60% 감소, 유지보수성 40% 향상
|
|
39
351
|
|
|
40
|
-
|
|
352
|
+
리팩토링을 진행할까요? (Y/N)
|
|
41
353
|
|
|
42
|
-
|
|
43
|
-
- 각 단계 후 테스트
|
|
44
|
-
- 기능 변경 없이 구조만 개선
|
|
354
|
+
</output>
|