@kood/claude-code 0.6.6 → 0.7.0
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 +7 -1
- package/package.json +1 -1
- package/templates/.claude/agents/analyst.md +5 -0
- package/templates/.claude/agents/architect.md +5 -0
- package/templates/.claude/agents/build-fixer.md +1 -0
- package/templates/.claude/agents/code-reviewer.md +1 -0
- package/templates/.claude/agents/critic.md +4 -0
- package/templates/.claude/agents/deep-executor.md +1 -0
- package/templates/.claude/agents/dependency-manager.md +2 -0
- package/templates/.claude/agents/deployment-validator.md +2 -0
- package/templates/.claude/agents/designer.md +2 -0
- package/templates/.claude/agents/document-writer.md +3 -0
- package/templates/.claude/agents/explore.md +1 -0
- package/templates/.claude/agents/git-operator.md +2 -0
- package/templates/.claude/agents/implementation-executor.md +2 -0
- package/templates/.claude/agents/ko-to-en-translator.md +3 -0
- package/templates/.claude/agents/lint-fixer.md +2 -0
- package/templates/.claude/agents/planner.md +3 -0
- package/templates/.claude/agents/pm.md +349 -0
- package/templates/.claude/agents/qa-tester.md +1 -0
- package/templates/.claude/agents/refactor-advisor.md +4 -0
- package/templates/.claude/agents/researcher.md +9 -1
- package/templates/.claude/agents/scientist.md +1 -0
- package/templates/.claude/agents/security-reviewer.md +1 -0
- package/templates/.claude/agents/tdd-guide.md +1 -0
- package/templates/.claude/agents/vision.md +1 -0
- package/templates/.claude/instructions/agent-patterns/agent-teams-usage.md +376 -0
- package/templates/.claude/instructions/sourcing/reliable-search.md +49 -2
- package/templates/.claude/scripts/agent-teams/check-availability.sh +238 -0
- package/templates/.claude/scripts/agent-teams/setup-tmux.sh +125 -0
- package/templates/.claude/skills/agent-teams-setup/SKILL.md +460 -0
- package/templates/.claude/skills/brainstorm/SKILL.md +1 -0
- package/templates/.claude/skills/bug-fix/SKILL.md +1 -0
- package/templates/.claude/skills/crawler/SKILL.md +2 -0
- package/templates/.claude/skills/docs-creator/SKILL.md +1 -0
- package/templates/.claude/skills/docs-fetch/SKILL.md +6 -4
- package/templates/.claude/skills/docs-refactor/SKILL.md +1 -0
- package/templates/.claude/skills/elon-musk/SKILL.md +1 -0
- package/templates/.claude/skills/execute/SKILL.md +1 -0
- package/templates/.claude/skills/feedback/SKILL.md +1 -0
- package/templates/.claude/skills/figma-to-code/SKILL.md +1 -0
- package/templates/.claude/skills/genius-thinking/SKILL.md +1 -0
- package/templates/.claude/skills/global-uiux-design/SKILL.md +1 -0
- package/templates/.claude/skills/korea-uiux-design/SKILL.md +1 -0
- package/templates/.claude/skills/nextjs-react-best-practices/SKILL.md +1 -0
- package/templates/.claude/skills/plan/SKILL.md +1 -0
- package/templates/.claude/skills/prd/SKILL.md +1 -0
- package/templates/.claude/skills/project-optimizer/AGENTS.md +275 -0
- package/templates/.claude/skills/project-optimizer/SKILL.md +375 -0
- package/templates/.claude/skills/project-optimizer/rules/arch-config-centralize.md +66 -0
- package/templates/.claude/skills/project-optimizer/rules/arch-hot-path.md +35 -0
- package/templates/.claude/skills/project-optimizer/rules/arch-interface-segregation.md +51 -0
- package/templates/.claude/skills/project-optimizer/rules/arch-module-boundary.md +42 -0
- package/templates/.claude/skills/project-optimizer/rules/build-cache.md +57 -0
- package/templates/.claude/skills/project-optimizer/rules/build-code-split.md +56 -0
- package/templates/.claude/skills/project-optimizer/rules/build-incremental.md +65 -0
- package/templates/.claude/skills/project-optimizer/rules/build-minify.md +61 -0
- package/templates/.claude/skills/project-optimizer/rules/build-tree-shake.md +60 -0
- package/templates/.claude/skills/project-optimizer/rules/code-complexity.md +65 -0
- package/templates/.claude/skills/project-optimizer/rules/code-dead-elimination.md +32 -0
- package/templates/.claude/skills/project-optimizer/rules/code-duplication.md +54 -0
- package/templates/.claude/skills/project-optimizer/rules/code-error-handling.md +75 -0
- package/templates/.claude/skills/project-optimizer/rules/code-naming.md +52 -0
- package/templates/.claude/skills/project-optimizer/rules/concurrency-defer-await.md +54 -0
- package/templates/.claude/skills/project-optimizer/rules/concurrency-parallel.md +90 -0
- package/templates/.claude/skills/project-optimizer/rules/concurrency-pipeline.md +68 -0
- package/templates/.claude/skills/project-optimizer/rules/concurrency-pool.md +68 -0
- package/templates/.claude/skills/project-optimizer/rules/deps-lightweight-alt.md +37 -0
- package/templates/.claude/skills/project-optimizer/rules/deps-peer-align.md +44 -0
- package/templates/.claude/skills/project-optimizer/rules/deps-security-audit.md +45 -0
- package/templates/.claude/skills/project-optimizer/rules/deps-unused-removal.md +25 -0
- package/templates/.claude/skills/project-optimizer/rules/deps-version-pin.md +40 -0
- package/templates/.claude/skills/project-optimizer/rules/dx-ci-speed.md +47 -0
- package/templates/.claude/skills/project-optimizer/rules/dx-dev-server.md +35 -0
- package/templates/.claude/skills/project-optimizer/rules/dx-lint-config.md +36 -0
- package/templates/.claude/skills/project-optimizer/rules/dx-test-coverage.md +34 -0
- package/templates/.claude/skills/project-optimizer/rules/dx-type-safety.md +49 -0
- package/templates/.claude/skills/project-optimizer/rules/io-batch-queries.md +67 -0
- package/templates/.claude/skills/project-optimizer/rules/io-cache-layer.md +67 -0
- package/templates/.claude/skills/project-optimizer/rules/io-connection-reuse.md +67 -0
- package/templates/.claude/skills/project-optimizer/rules/io-serialize-minimal.md +61 -0
- package/templates/.claude/skills/project-optimizer/rules/io-stream.md +75 -0
- package/templates/.claude/skills/project-optimizer/rules/memory-bounded-cache.md +65 -0
- package/templates/.claude/skills/project-optimizer/rules/memory-large-data.md +64 -0
- package/templates/.claude/skills/project-optimizer/rules/memory-lazy-init.md +78 -0
- package/templates/.claude/skills/project-optimizer/rules/memory-leak-prevention.md +79 -0
- package/templates/.claude/skills/project-optimizer/rules/memory-pool-reuse.md +70 -0
- package/templates/.claude/skills/ralph/SKILL.md +1 -0
- package/templates/.claude/skills/refactor/SKILL.md +1 -0
- package/templates/.claude/skills/research/SKILL.md +1 -0
- package/templates/.claude/skills/sql-optimizer/SKILL.md +438 -0
- package/templates/.claude/skills/sql-optimizer/orm-patterns.md +218 -0
- package/templates/.claude/skills/startup-validator/SKILL.md +1 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/AGENTS.md +53 -14
- package/templates/.claude/skills/tanstack-start-react-best-practices/SKILL.md +94 -27
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/bundle-defer-third-party.md +42 -19
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/client-optimistic-updates.md +109 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/client-suspense-query.md +74 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/client-use-hook.md +81 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rerender-react-compiler.md +81 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-beforeload-auth.md +121 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-file-conventions.md +104 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-link-navigation.md +119 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-nested-layouts.md +155 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-path-params.md +89 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-pending-component.md +110 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-preload-strategy.md +91 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-router-context.md +120 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/routing-search-params.md +114 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-deferred-data.md +1 -1
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-error-boundaries.md +79 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-middleware.md +85 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-serialization.md +56 -21
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-streaming.md +84 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-validator.md +71 -0
- package/templates/.claude/skills/tauri-react-best-practices/AGENTS.md +527 -0
- package/templates/.claude/skills/tauri-react-best-practices/SKILL.md +571 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-barrel-imports.md +140 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-cargo-profile.md +96 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-frontend-treeshake.md +242 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-lazy-components.md +255 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/bundle-remove-unused-commands.md +160 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/deploy-ci-pipeline.md +269 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/deploy-signing.md +207 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/deploy-updater.md +226 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-async-commands.md +172 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-batch-commands.md +133 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-binary-response.md +198 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-channel-streaming.md +186 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-error-handling.md +250 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/ipc-type-safe.md +227 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/perf-derived-state.md +231 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/perf-functional-setstate.md +191 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/perf-index-maps.md +276 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/perf-lazy-state-init.md +196 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/plugin-lifecycle.md +265 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/plugin-mobile-compat.md +199 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/plugin-permission-scope.md +193 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/react-error-boundary.md +239 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/react-event-listener.md +151 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/react-file-src.md +155 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/react-invoke-hook.md +139 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/react-optimistic-update.md +211 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/security-capability-split.md +205 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/security-csp.md +207 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/security-least-privilege.md +106 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/security-no-wildcard.md +253 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/security-scope-paths.md +160 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/state-async-mutex.md +270 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/state-mutex-pattern.md +265 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/state-react-sync.md +375 -0
- package/templates/.claude/skills/tauri-react-best-practices/rules/state-single-container.md +275 -0
- package/templates/tanstack-start/docs/architecture.md +238 -167
- package/templates/tanstack-start/docs/library/tanstack-router/error-handling.md +777 -38
- package/templates/tanstack-start/docs/library/tanstack-router/hooks.md +549 -37
- package/templates/tanstack-start/docs/library/tanstack-router/index.md +895 -111
- package/templates/tanstack-start/docs/library/tanstack-router/navigation.md +641 -43
- package/templates/tanstack-start/docs/library/tanstack-router/route-context.md +889 -38
- package/templates/tanstack-start/docs/library/tanstack-router/search-params.md +891 -29
- package/templates/tanstack-start/docs/library/tanstack-start/auth-patterns.md +972 -36
- package/templates/tanstack-start/docs/library/tanstack-start/index.md +1525 -881
- package/templates/tanstack-start/docs/library/tanstack-start/middleware.md +1099 -20
- package/templates/tanstack-start/docs/library/tanstack-start/routing.md +796 -30
- package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +953 -35
- package/templates/tanstack-start/docs/library/tanstack-start/setup.md +371 -15
- package/templates/tauri/CLAUDE.md +189 -0
- package/templates/tauri/docs/guides/distribution.md +261 -0
- package/templates/tauri/docs/guides/getting-started.md +302 -0
- package/templates/tauri/docs/guides/mobile.md +288 -0
- package/templates/tauri/docs/library/tauri/index.md +510 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Serialize Only Required Fields
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: 30-70% payload reduction, faster serialization
|
|
5
|
+
tags: io, serialization, payload, network, select
|
|
6
|
+
languages: all
|
|
7
|
+
related: [io-batch-queries, memory-large-data]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 필요한 필드만 직렬화/전송
|
|
11
|
+
|
|
12
|
+
전체 객체 대신 실제 사용하는 필드만 선택하여 직렬화 비용과 네트워크 전송량을 줄입니다.
|
|
13
|
+
|
|
14
|
+
**❌ 잘못된 예시 (전체 객체 반환):**
|
|
15
|
+
|
|
16
|
+
```python
|
|
17
|
+
# 50개 필드 전부 전송, 클라이언트는 3개만 사용
|
|
18
|
+
@app.get("/users")
|
|
19
|
+
def list_users():
|
|
20
|
+
return db.query(User).all() # password_hash 포함 위험
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
// 전체 객체 반환
|
|
25
|
+
return await prisma.user.findMany() // 50개 필드
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**✅ 올바른 예시 (필요 필드만):**
|
|
29
|
+
|
|
30
|
+
```python
|
|
31
|
+
# DTO/스키마로 필드 제한
|
|
32
|
+
@app.get("/users")
|
|
33
|
+
def list_users():
|
|
34
|
+
users = db.query(User.id, User.name, User.email).all()
|
|
35
|
+
return [UserResponse(id=u.id, name=u.name, email=u.email) for u in users]
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
// Prisma select
|
|
40
|
+
const users = await prisma.user.findMany({
|
|
41
|
+
select: { id: true, name: true, email: true }
|
|
42
|
+
})
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
```sql
|
|
46
|
+
-- SQL
|
|
47
|
+
SELECT id, name, email FROM users; -- ✅
|
|
48
|
+
SELECT * FROM users; -- ❌
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
```go
|
|
52
|
+
// Go - json 태그로 제어
|
|
53
|
+
type UserResponse struct {
|
|
54
|
+
ID string `json:"id"`
|
|
55
|
+
Name string `json:"name"`
|
|
56
|
+
Email string `json:"email"`
|
|
57
|
+
// PasswordHash 필드 없음 → 자동 제외
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**적용 범위:** API 응답, SSR 데이터, 캐시 저장, 메시지 큐 페이로드.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Stream Large Data Instead of Loading All
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: Constant memory usage, no OOM on large datasets
|
|
5
|
+
tags: io, streaming, iterator, generator, memory
|
|
6
|
+
languages: all
|
|
7
|
+
related: [memory-large-data, concurrency-pipeline]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 대용량 데이터 스트리밍 처리
|
|
11
|
+
|
|
12
|
+
전체 데이터를 메모리에 적재하지 않고 스트림/이터레이터/제너레이터로 청크 단위 처리합니다.
|
|
13
|
+
|
|
14
|
+
**❌ 잘못된 예시 (전체 로드):**
|
|
15
|
+
|
|
16
|
+
```python
|
|
17
|
+
# 100만 행 전체 메모리 적재
|
|
18
|
+
rows = db.execute("SELECT * FROM big_table").fetchall()
|
|
19
|
+
for row in rows:
|
|
20
|
+
process(row)
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**✅ 올바른 예시 (스트리밍):**
|
|
24
|
+
|
|
25
|
+
```python
|
|
26
|
+
# Python - 서버 사이드 커서
|
|
27
|
+
cursor = db.execute("SELECT * FROM big_table")
|
|
28
|
+
while batch := cursor.fetchmany(1000):
|
|
29
|
+
for row in batch:
|
|
30
|
+
process(row)
|
|
31
|
+
|
|
32
|
+
# 파일 스트리밍
|
|
33
|
+
with open("huge.csv") as f:
|
|
34
|
+
for line in f: # 한 줄씩 (메모리 일정)
|
|
35
|
+
process(line)
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
// Node.js - 스트림
|
|
40
|
+
import { createReadStream } from 'fs'
|
|
41
|
+
import { pipeline } from 'stream/promises'
|
|
42
|
+
|
|
43
|
+
await pipeline(
|
|
44
|
+
createReadStream('huge.csv'),
|
|
45
|
+
new Transform({ transform(chunk, enc, cb) { /* 청크 처리 */ cb() } }),
|
|
46
|
+
createWriteStream('output.csv')
|
|
47
|
+
)
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
```go
|
|
51
|
+
// Go - Scanner (파일), rows.Next() (DB)
|
|
52
|
+
scanner := bufio.NewScanner(file)
|
|
53
|
+
for scanner.Scan() {
|
|
54
|
+
process(scanner.Text())
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
rows, _ := db.Query("SELECT * FROM big_table")
|
|
58
|
+
defer rows.Close()
|
|
59
|
+
for rows.Next() {
|
|
60
|
+
var item Item
|
|
61
|
+
rows.Scan(&item.ID, &item.Name)
|
|
62
|
+
process(item)
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
```rust
|
|
67
|
+
// Rust - Iterator (lazy)
|
|
68
|
+
use std::io::{BufRead, BufReader};
|
|
69
|
+
let reader = BufReader::new(file);
|
|
70
|
+
for line in reader.lines() {
|
|
71
|
+
process(line?);
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**적용 기준:** 10MB+ 파일, 10K+ DB 행, API 페이지네이션.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Bound Cache Size with LRU/TTL
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: Prevents unbounded memory growth
|
|
5
|
+
tags: memory, cache, lru, ttl, bounded
|
|
6
|
+
languages: all
|
|
7
|
+
related: [io-cache-layer, concurrency-pool]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 캐시에 크기 제한 설정
|
|
11
|
+
|
|
12
|
+
무제한 캐시는 시간이 지남에 따라 메모리를 소진합니다. LRU(최소 최근 사용) + TTL(유효 시간)로 제한합니다.
|
|
13
|
+
|
|
14
|
+
**❌ 잘못된 예시 (무제한 캐시):**
|
|
15
|
+
|
|
16
|
+
```python
|
|
17
|
+
cache = {} # 무제한 성장
|
|
18
|
+
def get_user(id):
|
|
19
|
+
if id not in cache:
|
|
20
|
+
cache[id] = db.get_user(id)
|
|
21
|
+
return cache[id]
|
|
22
|
+
# 100만 유저 → 100만 항목, OOM
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**✅ 올바른 예시 (제한된 캐시):**
|
|
26
|
+
|
|
27
|
+
```python
|
|
28
|
+
# Python
|
|
29
|
+
from cachetools import TTLCache, LRUCache
|
|
30
|
+
cache = TTLCache(maxsize=10000, ttl=300) # 최대 1만, 5분 TTL
|
|
31
|
+
|
|
32
|
+
# functools (크기만 제한)
|
|
33
|
+
@lru_cache(maxsize=1000)
|
|
34
|
+
def get_config(key): ...
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
// Node.js
|
|
39
|
+
import { LRUCache } from 'lru-cache'
|
|
40
|
+
const cache = new LRUCache<string, User>({
|
|
41
|
+
max: 10000, // 최대 항목 수
|
|
42
|
+
ttl: 5 * 60 * 1000, // 5분
|
|
43
|
+
maxSize: 50 * 1024 * 1024, // 50MB (선택)
|
|
44
|
+
sizeCalculation: (v) => JSON.stringify(v).length,
|
|
45
|
+
})
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
```go
|
|
49
|
+
// Go (ristretto)
|
|
50
|
+
cache, _ := ristretto.NewCache(&ristretto.Config{
|
|
51
|
+
NumCounters: 1e5, // 키 추적 수
|
|
52
|
+
MaxCost: 1 << 26, // 64MB
|
|
53
|
+
BufferItems: 64,
|
|
54
|
+
})
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
```rust
|
|
58
|
+
// Rust (moka)
|
|
59
|
+
let cache: Cache<String, User> = Cache::builder()
|
|
60
|
+
.max_capacity(10_000)
|
|
61
|
+
.time_to_live(Duration::from_secs(300))
|
|
62
|
+
.build();
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**원칙:** 캐시 = max 크기 + 만료 정책. 둘 다 없으면 메모리 릭과 같음.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Paginate or Stream Large Datasets
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: Constant memory usage regardless of data size
|
|
5
|
+
tags: memory, pagination, streaming, large-data
|
|
6
|
+
languages: all
|
|
7
|
+
related: [io-stream, concurrency-pipeline]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 대용량 데이터 페이지네이션/스트리밍
|
|
11
|
+
|
|
12
|
+
전체 데이터를 한번에 메모리에 적재하지 않고 페이지 단위 또는 스트림으로 처리합니다.
|
|
13
|
+
|
|
14
|
+
**❌ 잘못된 예시:**
|
|
15
|
+
|
|
16
|
+
```python
|
|
17
|
+
all_users = db.query("SELECT * FROM users").fetchall() # 100만 행 = OOM
|
|
18
|
+
response = jsonify(all_users)
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**✅ 올바른 예시:**
|
|
22
|
+
|
|
23
|
+
```python
|
|
24
|
+
# 커서 기반 페이지네이션
|
|
25
|
+
@app.get("/users")
|
|
26
|
+
def list_users(cursor: str = None, limit: int = 50):
|
|
27
|
+
query = db.query(User).order_by(User.id)
|
|
28
|
+
if cursor:
|
|
29
|
+
query = query.filter(User.id > cursor)
|
|
30
|
+
users = query.limit(limit).all()
|
|
31
|
+
next_cursor = users[-1].id if users else None
|
|
32
|
+
return {"data": users, "next_cursor": next_cursor}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
// 커서 기반 (Prisma)
|
|
37
|
+
const users = await prisma.user.findMany({
|
|
38
|
+
take: 50,
|
|
39
|
+
skip: cursor ? 1 : 0,
|
|
40
|
+
cursor: cursor ? { id: cursor } : undefined,
|
|
41
|
+
orderBy: { id: 'asc' },
|
|
42
|
+
})
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
```go
|
|
46
|
+
// Go - 청크 처리
|
|
47
|
+
const batchSize = 1000
|
|
48
|
+
var lastID int64
|
|
49
|
+
for {
|
|
50
|
+
var batch []User
|
|
51
|
+
db.Where("id > ?", lastID).Order("id").Limit(batchSize).Find(&batch)
|
|
52
|
+
if len(batch) == 0 { break }
|
|
53
|
+
processBatch(batch)
|
|
54
|
+
lastID = batch[len(batch)-1].ID
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**페이지네이션 유형:**
|
|
59
|
+
|
|
60
|
+
| 유형 | 장점 | 단점 |
|
|
61
|
+
|------|------|------|
|
|
62
|
+
| **Offset** | 간단 구현 | 대량 데이터 시 느림, 중복/누락 |
|
|
63
|
+
| **Cursor** | 일관성, 빠름 | 임의 페이지 접근 불가 |
|
|
64
|
+
| **Keyset** | 가장 빠름 | 정렬 키 필요 |
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Lazy Initialize Expensive Resources
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: Faster startup, lower baseline memory
|
|
5
|
+
tags: memory, lazy, initialization, startup
|
|
6
|
+
languages: all
|
|
7
|
+
related: [concurrency-defer-await, build-code-split]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 비싼 초기화 지연 실행
|
|
11
|
+
|
|
12
|
+
애플리케이션 시작 시 모든 리소스를 초기화하지 않고, 실제 사용 시점에 지연 초기화합니다.
|
|
13
|
+
|
|
14
|
+
**❌ 잘못된 예시 (즉시 초기화):**
|
|
15
|
+
|
|
16
|
+
```python
|
|
17
|
+
# 모듈 import 시 즉시 무거운 ML 모델 로드
|
|
18
|
+
import tensorflow as tf
|
|
19
|
+
model = tf.keras.models.load_model("huge_model.h5") # 5초, 2GB RAM
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
// 모듈 로드 시 즉시 초기화
|
|
24
|
+
const heavyConfig = JSON.parse(fs.readFileSync('config.json', 'utf8'))
|
|
25
|
+
const searchIndex = buildSearchIndex(allDocuments) // 3초
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**✅ 올바른 예시 (지연 초기화):**
|
|
29
|
+
|
|
30
|
+
```python
|
|
31
|
+
# Python - 필요 시점에 로드
|
|
32
|
+
_model = None
|
|
33
|
+
def get_model():
|
|
34
|
+
global _model
|
|
35
|
+
if _model is None:
|
|
36
|
+
import tensorflow as tf
|
|
37
|
+
_model = tf.keras.models.load_model("huge_model.h5")
|
|
38
|
+
return _model
|
|
39
|
+
|
|
40
|
+
# Python 3.8+ functools.cached_property
|
|
41
|
+
class Service:
|
|
42
|
+
@cached_property
|
|
43
|
+
def model(self):
|
|
44
|
+
return load_heavy_model()
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
// JS/TS - getter 또는 lazy 패턴
|
|
49
|
+
let _searchIndex: SearchIndex | null = null
|
|
50
|
+
function getSearchIndex(): SearchIndex {
|
|
51
|
+
if (!_searchIndex) {
|
|
52
|
+
_searchIndex = buildSearchIndex(allDocuments)
|
|
53
|
+
}
|
|
54
|
+
return _searchIndex
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
```rust
|
|
59
|
+
// Rust - LazyLock (std) 또는 once_cell
|
|
60
|
+
use std::sync::LazyLock;
|
|
61
|
+
static CONFIG: LazyLock<Config> = LazyLock::new(|| {
|
|
62
|
+
load_config().expect("config load failed")
|
|
63
|
+
});
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
```go
|
|
67
|
+
// Go - sync.Once
|
|
68
|
+
var (
|
|
69
|
+
instance *Service
|
|
70
|
+
once sync.Once
|
|
71
|
+
)
|
|
72
|
+
func GetService() *Service {
|
|
73
|
+
once.Do(func() { instance = newService() })
|
|
74
|
+
return instance
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**적용 대상:** ML 모델, 검색 인덱스, 대용량 설정, 외부 서비스 커넥션.
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Guarantee Resource Cleanup
|
|
3
|
+
impact: HIGH
|
|
4
|
+
impactDescription: Prevents memory leaks, file handle exhaustion, connection leaks
|
|
5
|
+
tags: memory, resource, leak, cleanup, dispose
|
|
6
|
+
languages: all
|
|
7
|
+
related: [memory-pool-reuse, io-connection-reuse]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 리소스 해제 보장
|
|
11
|
+
|
|
12
|
+
파일, DB 커넥션, 소켓, 락 등 시스템 리소스는 예외 발생 시에도 반드시 해제합니다.
|
|
13
|
+
|
|
14
|
+
**❌ 잘못된 예시:**
|
|
15
|
+
|
|
16
|
+
```python
|
|
17
|
+
f = open("data.csv")
|
|
18
|
+
data = f.read() # 예외 시 f.close() 호출 안 됨
|
|
19
|
+
|
|
20
|
+
conn = db.connect()
|
|
21
|
+
result = conn.execute(query) # 예외 시 커넥션 누수
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**✅ 올바른 예시:**
|
|
25
|
+
|
|
26
|
+
```python
|
|
27
|
+
# Python - context manager
|
|
28
|
+
with open("data.csv") as f:
|
|
29
|
+
data = f.read()
|
|
30
|
+
|
|
31
|
+
async with pool.acquire() as conn:
|
|
32
|
+
result = await conn.execute(query)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
```go
|
|
36
|
+
// Go - defer
|
|
37
|
+
resp, err := http.Get(url)
|
|
38
|
+
if err != nil { return err }
|
|
39
|
+
defer resp.Body.Close()
|
|
40
|
+
|
|
41
|
+
f, err := os.Open("data.csv")
|
|
42
|
+
if err != nil { return err }
|
|
43
|
+
defer f.Close()
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
// JS/TS - try/finally
|
|
48
|
+
const conn = await pool.acquire()
|
|
49
|
+
try {
|
|
50
|
+
return await conn.query(sql)
|
|
51
|
+
} finally {
|
|
52
|
+
conn.release()
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// TC39 Explicit Resource Management (using)
|
|
56
|
+
await using conn = await pool.acquire()
|
|
57
|
+
return await conn.query(sql)
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
```rust
|
|
61
|
+
// Rust - RAII (자동)
|
|
62
|
+
let file = File::open("data.csv")?; // Drop trait으로 스코프 끝에서 자동 해제
|
|
63
|
+
let data = read_to_string(&file)?;
|
|
64
|
+
// file 자동 해제
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
```java
|
|
68
|
+
// Java - try-with-resources
|
|
69
|
+
try (var conn = dataSource.getConnection();
|
|
70
|
+
var stmt = conn.prepareStatement(sql)) {
|
|
71
|
+
return stmt.executeQuery();
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
```csharp
|
|
76
|
+
// C# - using
|
|
77
|
+
await using var conn = await pool.GetConnectionAsync();
|
|
78
|
+
return await conn.QueryAsync(sql);
|
|
79
|
+
```
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Pool and Reuse Expensive Objects
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: Reduces GC pressure, allocation overhead
|
|
5
|
+
tags: memory, pool, reuse, allocation, gc
|
|
6
|
+
languages: all
|
|
7
|
+
related: [memory-leak-prevention, concurrency-pool, io-connection-reuse]
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 비싼 객체 풀링/재사용
|
|
11
|
+
|
|
12
|
+
반복 생성-소멸되는 비싼 객체(버퍼, 커넥션, HTTP 클라이언트)를 풀에서 재사용합니다.
|
|
13
|
+
|
|
14
|
+
**❌ 잘못된 예시:**
|
|
15
|
+
|
|
16
|
+
```go
|
|
17
|
+
// 매 요청마다 새 버퍼 할당
|
|
18
|
+
func handler(w http.ResponseWriter, r *http.Request) {
|
|
19
|
+
buf := make([]byte, 32*1024) // 32KB 매번 할당 + GC
|
|
20
|
+
io.CopyBuffer(w, r.Body, buf)
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
```python
|
|
25
|
+
# 매번 새 HTTP 세션
|
|
26
|
+
def fetch(url):
|
|
27
|
+
return requests.get(url) # 매번 새 커넥션
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**✅ 올바른 예시:**
|
|
31
|
+
|
|
32
|
+
```go
|
|
33
|
+
// Go - sync.Pool
|
|
34
|
+
var bufPool = sync.Pool{
|
|
35
|
+
New: func() any { return make([]byte, 32*1024) },
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
func handler(w http.ResponseWriter, r *http.Request) {
|
|
39
|
+
buf := bufPool.Get().([]byte)
|
|
40
|
+
defer bufPool.Put(buf)
|
|
41
|
+
io.CopyBuffer(w, r.Body, buf)
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
```python
|
|
46
|
+
# Python - 세션 재사용
|
|
47
|
+
session = requests.Session() # 모듈 레벨에서 한 번 생성
|
|
48
|
+
|
|
49
|
+
def fetch(url):
|
|
50
|
+
return session.get(url) # 커넥션 재사용, Keep-Alive
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
// Node.js - HTTP Agent 재사용
|
|
55
|
+
import { Agent } from 'undici'
|
|
56
|
+
const agent = new Agent({ connections: 10, keepAliveTimeout: 30_000 })
|
|
57
|
+
|
|
58
|
+
// 또는 전역 fetch에서 agent 사용
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
```rust
|
|
62
|
+
// Rust - 정적 클라이언트
|
|
63
|
+
use reqwest::Client;
|
|
64
|
+
use std::sync::LazyLock;
|
|
65
|
+
static CLIENT: LazyLock<Client> = LazyLock::new(|| {
|
|
66
|
+
Client::builder().pool_max_idle_per_host(10).build().unwrap()
|
|
67
|
+
});
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**적용 대상:** HTTP 클라이언트, DB 커넥션, 버퍼, 정규식 컴파일 결과, 시리얼라이저 인스턴스.
|
|
@@ -8,6 +8,7 @@ user-invocable: true
|
|
|
8
8
|
@../../instructions/workflow-patterns/phase-based-workflow.md
|
|
9
9
|
@../../instructions/agent-patterns/parallel-execution.md
|
|
10
10
|
@../../instructions/agent-patterns/model-routing.md
|
|
11
|
+
@../../instructions/agent-patterns/agent-teams-usage.md
|
|
11
12
|
@../../instructions/context-optimization/phase-based-execution.md
|
|
12
13
|
@../../instructions/context-optimization/sub-agent-distribution.md
|
|
13
14
|
@../../instructions/validation/scope-completeness.md
|
|
@@ -7,6 +7,7 @@ user-invocable: true
|
|
|
7
7
|
@../../instructions/workflow-patterns/sequential-thinking.md
|
|
8
8
|
@../../instructions/agent-patterns/parallel-execution.md
|
|
9
9
|
@../../instructions/agent-patterns/model-routing.md
|
|
10
|
+
@../../instructions/agent-patterns/agent-teams-usage.md
|
|
10
11
|
@../../instructions/context-optimization/phase-based-execution.md
|
|
11
12
|
@../../instructions/context-optimization/sub-agent-distribution.md
|
|
12
13
|
@../../instructions/validation/scope-completeness.md
|
|
@@ -7,6 +7,7 @@ user-invocable: true
|
|
|
7
7
|
@../../instructions/workflow-patterns/sequential-thinking.md
|
|
8
8
|
@../../instructions/agent-patterns/parallel-execution.md
|
|
9
9
|
@../../instructions/agent-patterns/model-routing.md
|
|
10
|
+
@../../instructions/agent-patterns/agent-teams-usage.md
|
|
10
11
|
@../../instructions/sourcing/reliable-search.md
|
|
11
12
|
@../../instructions/context-optimization/redundant-exploration-prevention.md
|
|
12
13
|
@../../instructions/validation/forbidden-patterns.md
|