@kood/claude-code 0.1.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.d.ts +2 -0
- package/dist/index.js +297 -0
- package/package.json +47 -0
- package/templates/hono/CLAUDE.md +376 -0
- package/templates/hono/docs/deployment/cloudflare.md +328 -0
- package/templates/hono/docs/deployment/index.md +291 -0
- package/templates/hono/docs/git/index.md +180 -0
- package/templates/hono/docs/library/hono/error-handling.md +400 -0
- package/templates/hono/docs/library/hono/index.md +241 -0
- package/templates/hono/docs/library/hono/middleware.md +334 -0
- package/templates/hono/docs/library/hono/rpc.md +454 -0
- package/templates/hono/docs/library/hono/validation.md +328 -0
- package/templates/hono/docs/library/prisma/index.md +427 -0
- package/templates/hono/docs/library/zod/index.md +413 -0
- package/templates/hono/docs/mcp/context7.md +106 -0
- package/templates/hono/docs/mcp/index.md +94 -0
- package/templates/hono/docs/mcp/sequential-thinking.md +101 -0
- package/templates/hono/docs/mcp/sgrep.md +105 -0
- package/templates/hono/docs/skills/gemini-review/SKILL.md +220 -0
- package/templates/hono/docs/skills/gemini-review/references/checklists.md +136 -0
- package/templates/hono/docs/skills/gemini-review/references/prompt-templates.md +303 -0
- package/templates/tanstack-start/CLAUDE.md +279 -0
- package/templates/tanstack-start/docs/architecture/architecture.md +547 -0
- package/templates/tanstack-start/docs/deployment/cloudflare.md +346 -0
- package/templates/tanstack-start/docs/deployment/index.md +102 -0
- package/templates/tanstack-start/docs/deployment/nitro.md +211 -0
- package/templates/tanstack-start/docs/deployment/railway.md +364 -0
- package/templates/tanstack-start/docs/deployment/vercel.md +287 -0
- package/templates/tanstack-start/docs/design/accessibility.md +433 -0
- package/templates/tanstack-start/docs/design/color.md +235 -0
- package/templates/tanstack-start/docs/design/components.md +409 -0
- package/templates/tanstack-start/docs/design/index.md +107 -0
- package/templates/tanstack-start/docs/design/safe-area.md +317 -0
- package/templates/tanstack-start/docs/design/spacing.md +341 -0
- package/templates/tanstack-start/docs/design/tailwind-setup.md +470 -0
- package/templates/tanstack-start/docs/design/typography.md +324 -0
- package/templates/tanstack-start/docs/git/index.md +203 -0
- package/templates/tanstack-start/docs/guides/best-practices.md +753 -0
- package/templates/tanstack-start/docs/guides/getting-started.md +304 -0
- package/templates/tanstack-start/docs/guides/husky-lint-staged.md +303 -0
- package/templates/tanstack-start/docs/guides/prettier.md +189 -0
- package/templates/tanstack-start/docs/guides/project-templates.md +710 -0
- package/templates/tanstack-start/docs/library/better-auth/2fa.md +136 -0
- package/templates/tanstack-start/docs/library/better-auth/advanced.md +138 -0
- package/templates/tanstack-start/docs/library/better-auth/index.md +83 -0
- package/templates/tanstack-start/docs/library/better-auth/plugins.md +111 -0
- package/templates/tanstack-start/docs/library/better-auth/session.md +127 -0
- package/templates/tanstack-start/docs/library/better-auth/setup.md +123 -0
- package/templates/tanstack-start/docs/library/prisma/crud.md +218 -0
- package/templates/tanstack-start/docs/library/prisma/index.md +165 -0
- package/templates/tanstack-start/docs/library/prisma/relations.md +191 -0
- package/templates/tanstack-start/docs/library/prisma/schema.md +177 -0
- package/templates/tanstack-start/docs/library/prisma/setup.md +156 -0
- package/templates/tanstack-start/docs/library/prisma/transactions.md +140 -0
- package/templates/tanstack-start/docs/library/tanstack-query/index.md +146 -0
- package/templates/tanstack-start/docs/library/tanstack-query/invalidation.md +146 -0
- package/templates/tanstack-start/docs/library/tanstack-query/optimistic-updates.md +196 -0
- package/templates/tanstack-start/docs/library/tanstack-query/setup.md +110 -0
- package/templates/tanstack-start/docs/library/tanstack-query/use-mutation.md +170 -0
- package/templates/tanstack-start/docs/library/tanstack-query/use-query.md +173 -0
- package/templates/tanstack-start/docs/library/tanstack-start/auth-patterns.md +171 -0
- package/templates/tanstack-start/docs/library/tanstack-start/index.md +114 -0
- package/templates/tanstack-start/docs/library/tanstack-start/middleware.md +142 -0
- package/templates/tanstack-start/docs/library/tanstack-start/routing.md +163 -0
- package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +128 -0
- package/templates/tanstack-start/docs/library/tanstack-start/setup.md +85 -0
- package/templates/tanstack-start/docs/library/zod/basic-types.md +186 -0
- package/templates/tanstack-start/docs/library/zod/complex-types.md +204 -0
- package/templates/tanstack-start/docs/library/zod/index.md +186 -0
- package/templates/tanstack-start/docs/library/zod/transforms.md +174 -0
- package/templates/tanstack-start/docs/library/zod/validation.md +208 -0
- package/templates/tanstack-start/docs/mcp/context7.md +204 -0
- package/templates/tanstack-start/docs/mcp/index.md +116 -0
- package/templates/tanstack-start/docs/mcp/sequential-thinking.md +180 -0
- package/templates/tanstack-start/docs/mcp/sgrep.md +174 -0
- package/templates/tanstack-start/docs/skills/gemini-review/SKILL.md +220 -0
- package/templates/tanstack-start/docs/skills/gemini-review/references/checklists.md +150 -0
- package/templates/tanstack-start/docs/skills/gemini-review/references/prompt-templates.md +293 -0
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
# Zod - 검증
|
|
2
|
+
|
|
3
|
+
> **상위 문서**: [Zod](./index.md)
|
|
4
|
+
|
|
5
|
+
## Refinement (커스텀 검증)
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
// v4 - error 파라미터 사용 (message는 deprecated)
|
|
9
|
+
const PasswordSchema = z.string()
|
|
10
|
+
.min(8)
|
|
11
|
+
.refine((val) => /[A-Z]/.test(val), {
|
|
12
|
+
error: '대문자가 포함되어야 합니다', // v4: message → error
|
|
13
|
+
})
|
|
14
|
+
.refine((val) => /[0-9]/.test(val), {
|
|
15
|
+
error: '숫자가 포함되어야 합니다',
|
|
16
|
+
})
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### v4 Refinement 체이닝 개선
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
// v3 - ZodEffects로 래핑되어 .min() 호출 불가
|
|
23
|
+
z.string()
|
|
24
|
+
.refine(val => val.includes("@"))
|
|
25
|
+
.min(5) // ❌ 에러
|
|
26
|
+
|
|
27
|
+
// v4 - 스키마 내부에 저장되어 체이닝 가능
|
|
28
|
+
z.string()
|
|
29
|
+
.refine(val => val.includes("@"))
|
|
30
|
+
.min(5) // ✅ 정상 작동
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Async Refinement
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
const schema = z.string().refine(async (val) => val.length <= 8)
|
|
37
|
+
|
|
38
|
+
await schema.parseAsync('hello') // => "hello"
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### 이메일 중복 검사 예시
|
|
42
|
+
|
|
43
|
+
```typescript
|
|
44
|
+
const EmailSchema = z.email() // v4 새 API
|
|
45
|
+
.refine(async (email) => {
|
|
46
|
+
const exists = await checkEmailExists(email)
|
|
47
|
+
return !exists
|
|
48
|
+
}, {
|
|
49
|
+
error: '이미 사용 중인 이메일입니다', // v4: message → error
|
|
50
|
+
})
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Superrefine (고급 검증)
|
|
54
|
+
|
|
55
|
+
여러 이슈를 추가하거나 경로를 지정할 수 있습니다.
|
|
56
|
+
|
|
57
|
+
> **v4 변경**: `ctx.path`는 더 이상 사용할 수 없습니다 (성능 향상을 위해 제거됨)
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
const Schema = z.object({
|
|
61
|
+
password: z.string(),
|
|
62
|
+
confirmPassword: z.string(),
|
|
63
|
+
}).superRefine((data, ctx) => {
|
|
64
|
+
if (data.password !== data.confirmPassword) {
|
|
65
|
+
ctx.addIssue({
|
|
66
|
+
code: z.ZodIssueCode.custom,
|
|
67
|
+
message: '비밀번호가 일치하지 않습니다',
|
|
68
|
+
path: ['confirmPassword'],
|
|
69
|
+
})
|
|
70
|
+
}
|
|
71
|
+
// ctx.path // ❌ v4에서 더 이상 사용 불가
|
|
72
|
+
})
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### 복잡한 검증 로직
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
const UserSchema = z.object({
|
|
79
|
+
username: z.string(),
|
|
80
|
+
email: z.string().email(),
|
|
81
|
+
age: z.number(),
|
|
82
|
+
}).superRefine((data, ctx) => {
|
|
83
|
+
// 여러 조건 검증
|
|
84
|
+
if (data.age < 13 && data.email.includes('work')) {
|
|
85
|
+
ctx.addIssue({
|
|
86
|
+
code: z.ZodIssueCode.custom,
|
|
87
|
+
message: '13세 미만은 업무용 이메일을 사용할 수 없습니다',
|
|
88
|
+
path: ['email'],
|
|
89
|
+
})
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (data.username.toLowerCase() === 'admin' && data.age < 18) {
|
|
93
|
+
ctx.addIssue({
|
|
94
|
+
code: z.ZodIssueCode.custom,
|
|
95
|
+
message: 'admin 사용자명은 18세 이상만 사용 가능합니다',
|
|
96
|
+
path: ['username'],
|
|
97
|
+
})
|
|
98
|
+
}
|
|
99
|
+
})
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## 커스텀 스키마
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
const px = z.custom<`${number}px`>((val) => {
|
|
106
|
+
return typeof val === 'string' ? /^\d+px$/.test(val) : false
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
type Px = z.infer<typeof px> // `${number}px`
|
|
110
|
+
|
|
111
|
+
px.parse('42px') // '42px'
|
|
112
|
+
px.parse('42vw') // throws
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## TanStack Start와 함께 사용
|
|
116
|
+
|
|
117
|
+
### Server Function 입력 검증
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
import { createServerFn } from '@tanstack/react-start'
|
|
121
|
+
import { zodValidator } from '@tanstack/react-start/validators'
|
|
122
|
+
import { z } from 'zod'
|
|
123
|
+
|
|
124
|
+
const createUserSchema = z.object({
|
|
125
|
+
email: z.email(), // v4 새 API
|
|
126
|
+
name: z.string().min(1).max(100).trim(),
|
|
127
|
+
bio: z.string().max(500).optional(),
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
export const createUser = createServerFn({ method: 'POST' })
|
|
131
|
+
.inputValidator(zodValidator(createUserSchema))
|
|
132
|
+
.handler(async ({ data }) => {
|
|
133
|
+
// data는 타입 안전함
|
|
134
|
+
return prisma.user.create({ data })
|
|
135
|
+
})
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### 환경 변수 검증
|
|
139
|
+
|
|
140
|
+
```typescript
|
|
141
|
+
const envSchema = z.object({
|
|
142
|
+
NODE_ENV: z.enum(['development', 'production', 'test']),
|
|
143
|
+
DATABASE_URL: z.string().url(),
|
|
144
|
+
API_SECRET: z.string().min(32),
|
|
145
|
+
})
|
|
146
|
+
|
|
147
|
+
export const env = envSchema.parse(process.env)
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Middleware에서 사용
|
|
151
|
+
|
|
152
|
+
```typescript
|
|
153
|
+
import { createMiddleware } from '@tanstack/react-start'
|
|
154
|
+
import { zodValidator } from '@tanstack/react-start/validators'
|
|
155
|
+
import { z } from 'zod'
|
|
156
|
+
|
|
157
|
+
const mySchema = z.object({
|
|
158
|
+
workspaceId: z.string(),
|
|
159
|
+
})
|
|
160
|
+
|
|
161
|
+
const workspaceMiddleware = createMiddleware({ type: 'function' })
|
|
162
|
+
.inputValidator(zodValidator(mySchema))
|
|
163
|
+
.server(({ next, data }) => {
|
|
164
|
+
console.log('Workspace ID:', data.workspaceId)
|
|
165
|
+
return next()
|
|
166
|
+
})
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## 에러 처리
|
|
170
|
+
|
|
171
|
+
```typescript
|
|
172
|
+
const result = UserSchema.safeParse(data)
|
|
173
|
+
|
|
174
|
+
if (!result.success) {
|
|
175
|
+
// ZodError 객체
|
|
176
|
+
const errors = result.error.errors
|
|
177
|
+
|
|
178
|
+
errors.forEach((err) => {
|
|
179
|
+
console.log('Path:', err.path)
|
|
180
|
+
console.log('Message:', err.message)
|
|
181
|
+
console.log('Code:', err.code)
|
|
182
|
+
})
|
|
183
|
+
|
|
184
|
+
// 평면화된 에러
|
|
185
|
+
const flatErrors = result.error.flatten()
|
|
186
|
+
console.log(flatErrors.fieldErrors)
|
|
187
|
+
// { email: ['Invalid email'], name: ['Required'] }
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## Zod Mini (경량 버전)
|
|
192
|
+
|
|
193
|
+
v4에서 새롭게 추가된 경량 API:
|
|
194
|
+
|
|
195
|
+
```typescript
|
|
196
|
+
import * as z from "zod/mini"
|
|
197
|
+
|
|
198
|
+
// regular Zod
|
|
199
|
+
z.string().min(5).max(10).trim()
|
|
200
|
+
|
|
201
|
+
// Zod Mini - check 메서드로 통합
|
|
202
|
+
z.string().check(
|
|
203
|
+
z.minLength(5),
|
|
204
|
+
z.maxLength(10),
|
|
205
|
+
z.toLowerCase(),
|
|
206
|
+
z.trim(),
|
|
207
|
+
)
|
|
208
|
+
```
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
# Context7 MCP
|
|
2
|
+
|
|
3
|
+
> 라이브러리 공식 문서를 실시간으로 조회하는 도구
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 🚀 Quick Reference
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
✅ 사용 필수 상황:
|
|
11
|
+
- 라이브러리 API 사용법 확인
|
|
12
|
+
- 최신 버전 문법 확인
|
|
13
|
+
- 공식 문서 기반 구현
|
|
14
|
+
- 버전 마이그레이션
|
|
15
|
+
|
|
16
|
+
❌ 불필요한 상황:
|
|
17
|
+
- 이미 알고 있는 기본 문법
|
|
18
|
+
- 프로젝트 내부 코드 분석
|
|
19
|
+
- 비즈니스 로직 구현
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 사용 방법
|
|
25
|
+
|
|
26
|
+
### Step 1: 라이브러리 ID 조회
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
resolve-library-id 사용
|
|
30
|
+
→ 라이브러리 이름으로 Context7 ID 획득
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Step 2: 문서 조회
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
get-library-docs 사용
|
|
37
|
+
→ 특정 토픽의 문서 가져오기
|
|
38
|
+
|
|
39
|
+
파라미터:
|
|
40
|
+
- context7CompatibleLibraryID: 라이브러리 ID
|
|
41
|
+
- topic: 조회할 주제 (예: "hooks", "routing")
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 프로젝트 라이브러리별 사용 예시
|
|
47
|
+
|
|
48
|
+
### TanStack Start
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
토픽 예시:
|
|
52
|
+
- "server functions" - createServerFn 사용법
|
|
53
|
+
- "routing" - 파일 기반 라우팅
|
|
54
|
+
- "loader" - 데이터 로딩
|
|
55
|
+
- "middleware" - 미들웨어 설정
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### TanStack Query
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
토픽 예시:
|
|
62
|
+
- "useQuery" - 쿼리 훅
|
|
63
|
+
- "useMutation" - 뮤테이션 훅
|
|
64
|
+
- "invalidation" - 캐시 무효화
|
|
65
|
+
- "optimistic updates" - 낙관적 업데이트
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Prisma
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
토픽 예시:
|
|
72
|
+
- "findMany" - 다중 조회
|
|
73
|
+
- "create" - 생성
|
|
74
|
+
- "relations" - 관계 쿼리
|
|
75
|
+
- "transactions" - 트랜잭션
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Zod
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
토픽 예시:
|
|
82
|
+
- "object" - 객체 스키마
|
|
83
|
+
- "email" - 이메일 검증 (v4)
|
|
84
|
+
- "transform" - 변환
|
|
85
|
+
- "refinement" - 커스텀 검증
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Tailwind CSS
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
토픽 예시:
|
|
92
|
+
- "configuration" - 설정
|
|
93
|
+
- "theme" - 테마 커스터마이징
|
|
94
|
+
- "responsive" - 반응형
|
|
95
|
+
- "dark mode" - 다크 모드
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Better Auth
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
토픽 예시:
|
|
102
|
+
- "setup" - 초기 설정
|
|
103
|
+
- "session" - 세션 관리
|
|
104
|
+
- "providers" - OAuth 설정
|
|
105
|
+
- "2fa" - 이중 인증
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## 사용 시점
|
|
111
|
+
|
|
112
|
+
### ✅ 반드시 사용
|
|
113
|
+
|
|
114
|
+
| 상황 | 이유 |
|
|
115
|
+
|------|------|
|
|
116
|
+
| 새 API 사용 | 정확한 시그니처 확인 |
|
|
117
|
+
| 버전 업그레이드 | 변경사항 확인 |
|
|
118
|
+
| 에러 해결 | 올바른 사용법 확인 |
|
|
119
|
+
| 고급 기능 | 옵션/설정 확인 |
|
|
120
|
+
|
|
121
|
+
### ❌ 사용 불필요
|
|
122
|
+
|
|
123
|
+
| 상황 | 이유 |
|
|
124
|
+
|------|------|
|
|
125
|
+
| 기본 문법 | 이미 문서화됨 |
|
|
126
|
+
| 내부 코드 | Context7 범위 외 |
|
|
127
|
+
| 비즈니스 로직 | 라이브러리 무관 |
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 실전 예시
|
|
132
|
+
|
|
133
|
+
### 예시 1: TanStack Query 캐시 무효화
|
|
134
|
+
|
|
135
|
+
```
|
|
136
|
+
상황: mutation 후 목록 갱신이 안됨
|
|
137
|
+
|
|
138
|
+
1. Context7로 "invalidation" 토픽 조회
|
|
139
|
+
2. queryClient.invalidateQueries 사용법 확인
|
|
140
|
+
3. 올바른 queryKey 패턴 적용
|
|
141
|
+
|
|
142
|
+
결과:
|
|
143
|
+
queryClient.invalidateQueries({ queryKey: ['users'] })
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### 예시 2: Prisma 관계 쿼리
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
상황: User와 Post를 함께 조회하고 싶음
|
|
150
|
+
|
|
151
|
+
1. Context7로 "relations" 토픽 조회
|
|
152
|
+
2. include 옵션 사용법 확인
|
|
153
|
+
|
|
154
|
+
결과:
|
|
155
|
+
prisma.user.findUnique({
|
|
156
|
+
where: { id },
|
|
157
|
+
include: { posts: true }
|
|
158
|
+
})
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### 예시 3: Zod v4 마이그레이션
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
상황: Zod v3 → v4 업그레이드
|
|
165
|
+
|
|
166
|
+
1. Context7로 "migration" 또는 "email" 토픽 조회
|
|
167
|
+
2. v4 새 API 확인
|
|
168
|
+
|
|
169
|
+
결과:
|
|
170
|
+
// v3: z.string().email()
|
|
171
|
+
// v4: z.email()
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Sequential Thinking과 함께 사용
|
|
177
|
+
|
|
178
|
+
```
|
|
179
|
+
복잡한 구현 시:
|
|
180
|
+
|
|
181
|
+
1. Sequential Thinking으로 구현 계획
|
|
182
|
+
↓
|
|
183
|
+
2. 필요한 라이브러리 기능 파악
|
|
184
|
+
↓
|
|
185
|
+
3. Context7로 각 기능 문서 조회
|
|
186
|
+
↓
|
|
187
|
+
4. 문서 기반 구현
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## 주의사항
|
|
193
|
+
|
|
194
|
+
- **최신 문서**: Context7은 최신 공식 문서 제공
|
|
195
|
+
- **버전 확인**: 프로젝트 버전과 문서 버전 일치 확인
|
|
196
|
+
- **토픽 선택**: 구체적인 토픽으로 조회 시 더 정확한 결과
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## 참고
|
|
201
|
+
|
|
202
|
+
- 문서가 충분하지 않으면 다른 토픽으로 재조회
|
|
203
|
+
- 여러 라이브러리 문서를 연속으로 조회 가능
|
|
204
|
+
- Sequential Thinking과 조합하여 체계적 구현
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# MCP (Model Context Protocol)
|
|
2
|
+
|
|
3
|
+
> Claude Code 작업 효율성을 높이는 MCP 서버 활용 가이드
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 🚨 필수 사용 규칙
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
✅ 코드베이스 검색 → sgrep 사용 (grep/rg 금지)
|
|
11
|
+
✅ 복잡한 분석/디버깅 → Sequential Thinking 사용
|
|
12
|
+
✅ 라이브러리 문서 조회 → Context7 사용
|
|
13
|
+
✅ 도구 조합: sgrep로 위치 파악 → Sequential로 분석 → Context7로 문서 확인
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 🚀 Quick Reference
|
|
19
|
+
|
|
20
|
+
### Sequential Thinking - 복잡한 문제 해결
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
사용 시점:
|
|
24
|
+
- 버그 분석 및 디버깅
|
|
25
|
+
- 아키텍처 설계
|
|
26
|
+
- 복잡한 로직 구현
|
|
27
|
+
- 코드 리팩토링 계획
|
|
28
|
+
- 성능 최적화 분석
|
|
29
|
+
|
|
30
|
+
사용법: 문제를 단계별로 분해하여 체계적으로 해결
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Context7 - 라이브러리 문서 조회
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
사용 시점:
|
|
37
|
+
- API 사용법 확인
|
|
38
|
+
- 라이브러리 최신 문법 확인
|
|
39
|
+
- 공식 문서 기반 구현
|
|
40
|
+
- 버전별 변경사항 확인
|
|
41
|
+
|
|
42
|
+
사용법:
|
|
43
|
+
1. resolve-library-id로 라이브러리 ID 조회
|
|
44
|
+
2. get-library-docs로 문서 가져오기
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 📁 문서 구조
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
docs/mcp/
|
|
53
|
+
├── index.md # 이 문서 (개요)
|
|
54
|
+
├── sgrep.md # 코드베이스 검색
|
|
55
|
+
├── sequential-thinking.md # Sequential Thinking 상세
|
|
56
|
+
└── context7.md # Context7 상세
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 📋 도구 목록
|
|
62
|
+
|
|
63
|
+
| 도구 | 용도 | 사용 시점 |
|
|
64
|
+
|-----|------|----------|
|
|
65
|
+
| [sgrep](./sgrep.md) | 코드베이스 검색 | 코드 위치 파악, 자연어 검색 |
|
|
66
|
+
| [Sequential Thinking](./sequential-thinking.md) | 체계적 문제 해결 | 복잡한 분석, 디버깅, 설계 |
|
|
67
|
+
| [Context7](./context7.md) | 라이브러리 문서 | API 확인, 최신 문법 |
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## ⚡ 작업별 MCP 선택 가이드
|
|
72
|
+
|
|
73
|
+
### 버그 수정
|
|
74
|
+
```
|
|
75
|
+
1. sgrep로 관련 코드 위치 파악
|
|
76
|
+
2. Sequential Thinking으로 문제 분석
|
|
77
|
+
3. 원인 파악 후 Context7로 관련 API 확인
|
|
78
|
+
4. 수정 구현
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### 새 기능 구현
|
|
82
|
+
```
|
|
83
|
+
1. sgrep로 기존 패턴 검색
|
|
84
|
+
2. Sequential Thinking으로 구현 계획 수립
|
|
85
|
+
3. Context7로 사용할 라이브러리 문서 확인
|
|
86
|
+
4. 단계별 구현
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 라이브러리 사용
|
|
90
|
+
```
|
|
91
|
+
1. Context7로 공식 문서 조회
|
|
92
|
+
2. 필요시 Sequential Thinking으로 복잡한 통합 분석
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### 성능 최적화
|
|
96
|
+
```
|
|
97
|
+
1. sgrep로 병목 의심 코드 검색
|
|
98
|
+
2. Sequential Thinking으로 병목 분석
|
|
99
|
+
3. Context7로 최적화 관련 API 확인
|
|
100
|
+
4. 개선 구현
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### 코드베이스 탐색
|
|
104
|
+
```
|
|
105
|
+
1. sgrep로 자연어 쿼리 검색
|
|
106
|
+
2. 관련 코드 위치 파악
|
|
107
|
+
3. 필요시 Sequential Thinking으로 흐름 분석
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## 🔗 관련 문서
|
|
113
|
+
|
|
114
|
+
- [TanStack Start](../library/tanstack-start/index.md) - Server Functions
|
|
115
|
+
- [Prisma](../library/prisma/index.md) - ORM
|
|
116
|
+
- [Zod](../library/zod/index.md) - Validation
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# Sequential Thinking MCP
|
|
2
|
+
|
|
3
|
+
> 복잡한 문제를 체계적으로 분해하고 해결하는 사고 도구
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 🚀 Quick Reference
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
✅ 사용 필수 상황:
|
|
11
|
+
- 버그 원인 분석
|
|
12
|
+
- 아키텍처 설계
|
|
13
|
+
- 복잡한 로직 구현
|
|
14
|
+
- 리팩토링 계획
|
|
15
|
+
- 성능 최적화
|
|
16
|
+
- 다단계 작업 계획
|
|
17
|
+
|
|
18
|
+
❌ 불필요한 상황:
|
|
19
|
+
- 단순 코드 수정
|
|
20
|
+
- 명확한 API 호출
|
|
21
|
+
- 복사/붙여넣기 작업
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 핵심 개념
|
|
27
|
+
|
|
28
|
+
Sequential Thinking은 복잡한 문제를 **단계별로 분해**하여 체계적으로 해결하는 사고 방식입니다.
|
|
29
|
+
|
|
30
|
+
### 작동 방식
|
|
31
|
+
|
|
32
|
+
1. **문제 정의**: 해결해야 할 문제 명확화
|
|
33
|
+
2. **분해**: 작은 단계로 나누기
|
|
34
|
+
3. **순차 분석**: 각 단계 순서대로 분석
|
|
35
|
+
4. **검증**: 각 단계 결과 검증
|
|
36
|
+
5. **종합**: 최종 결론 도출
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 사용 시점
|
|
41
|
+
|
|
42
|
+
### ✅ 반드시 사용
|
|
43
|
+
|
|
44
|
+
| 상황 | 이유 |
|
|
45
|
+
|------|------|
|
|
46
|
+
| 버그 디버깅 | 원인 추적에 체계적 접근 필요 |
|
|
47
|
+
| 시스템 설계 | 구성 요소 간 관계 분석 |
|
|
48
|
+
| 복잡한 로직 | 단계별 흐름 파악 |
|
|
49
|
+
| 리팩토링 | 영향 범위 분석 |
|
|
50
|
+
| 성능 분석 | 병목 지점 식별 |
|
|
51
|
+
|
|
52
|
+
### ❌ 사용 불필요
|
|
53
|
+
|
|
54
|
+
| 상황 | 이유 |
|
|
55
|
+
|------|------|
|
|
56
|
+
| 단순 CRUD | 패턴이 명확함 |
|
|
57
|
+
| 스타일 수정 | 분석 불필요 |
|
|
58
|
+
| 오타 수정 | 즉시 수정 가능 |
|
|
59
|
+
| 문서 확인 | Context7 사용 |
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 실전 예시
|
|
64
|
+
|
|
65
|
+
### 예시 1: 버그 디버깅
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
문제: "로그인 후 세션이 유지되지 않음"
|
|
69
|
+
|
|
70
|
+
Step 1: 증상 파악
|
|
71
|
+
- 로그인 성공 후 페이지 이동 시 로그아웃됨
|
|
72
|
+
- 새로고침 시 세션 사라짐
|
|
73
|
+
|
|
74
|
+
Step 2: 가설 수립
|
|
75
|
+
- 쿠키 설정 문제?
|
|
76
|
+
- 세션 저장소 문제?
|
|
77
|
+
- 미들웨어 문제?
|
|
78
|
+
|
|
79
|
+
Step 3: 검증
|
|
80
|
+
- 쿠키 확인 → httpOnly, secure 설정 확인
|
|
81
|
+
- 세션 저장소 확인 → Redis 연결 상태 확인
|
|
82
|
+
- 미들웨어 확인 → 세션 검증 로직 확인
|
|
83
|
+
|
|
84
|
+
Step 4: 원인 특정
|
|
85
|
+
- 쿠키 sameSite 설정이 'strict'로 되어 있어
|
|
86
|
+
cross-origin 요청 시 쿠키 미전송
|
|
87
|
+
|
|
88
|
+
Step 5: 해결
|
|
89
|
+
- sameSite: 'lax'로 변경
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 예시 2: 아키텍처 설계
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
문제: "사용자 알림 시스템 설계"
|
|
96
|
+
|
|
97
|
+
Step 1: 요구사항 정리
|
|
98
|
+
- 실시간 알림 (WebSocket)
|
|
99
|
+
- 이메일 알림
|
|
100
|
+
- 푸시 알림
|
|
101
|
+
- 알림 히스토리
|
|
102
|
+
|
|
103
|
+
Step 2: 구성 요소 식별
|
|
104
|
+
- NotificationService (핵심 로직)
|
|
105
|
+
- WebSocketHandler (실시간)
|
|
106
|
+
- EmailProvider (이메일)
|
|
107
|
+
- PushProvider (푸시)
|
|
108
|
+
- NotificationRepository (저장)
|
|
109
|
+
|
|
110
|
+
Step 3: 데이터 흐름 설계
|
|
111
|
+
- 이벤트 발생 → NotificationService
|
|
112
|
+
- NotificationService → 채널별 분배
|
|
113
|
+
- 각 Provider → 전송
|
|
114
|
+
- Repository → 저장
|
|
115
|
+
|
|
116
|
+
Step 4: 인터페이스 정의
|
|
117
|
+
- INotificationProvider
|
|
118
|
+
- INotificationRepository
|
|
119
|
+
- NotificationEvent 타입
|
|
120
|
+
|
|
121
|
+
Step 5: 구현 순서 결정
|
|
122
|
+
1. 타입/인터페이스 정의
|
|
123
|
+
2. Repository 구현
|
|
124
|
+
3. Service 핵심 로직
|
|
125
|
+
4. Provider 구현
|
|
126
|
+
5. WebSocket 통합
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### 예시 3: 성능 최적화
|
|
130
|
+
|
|
131
|
+
```
|
|
132
|
+
문제: "목록 페이지 로딩 3초 이상"
|
|
133
|
+
|
|
134
|
+
Step 1: 현재 상태 측정
|
|
135
|
+
- API 응답: 2.5초
|
|
136
|
+
- 렌더링: 0.5초
|
|
137
|
+
|
|
138
|
+
Step 2: API 분석
|
|
139
|
+
- 쿼리 확인: N+1 문제 발견
|
|
140
|
+
- 데이터 양: 1000개 전체 로딩
|
|
141
|
+
|
|
142
|
+
Step 3: 최적화 방안
|
|
143
|
+
- N+1 해결: include로 조인
|
|
144
|
+
- 페이지네이션: 20개씩 로딩
|
|
145
|
+
- 인덱스: 자주 조회하는 컬럼
|
|
146
|
+
|
|
147
|
+
Step 4: 구현
|
|
148
|
+
- Prisma include 추가
|
|
149
|
+
- 커서 기반 페이지네이션
|
|
150
|
+
- DB 인덱스 생성
|
|
151
|
+
|
|
152
|
+
Step 5: 결과 측정
|
|
153
|
+
- API 응답: 0.3초 (88% 개선)
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Context7과 함께 사용
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
복잡한 문제 해결 시:
|
|
162
|
+
|
|
163
|
+
1. Sequential Thinking으로 문제 분석
|
|
164
|
+
↓
|
|
165
|
+
2. 필요한 라이브러리 API 파악
|
|
166
|
+
↓
|
|
167
|
+
3. Context7로 공식 문서 확인
|
|
168
|
+
↓
|
|
169
|
+
4. Sequential Thinking으로 구현 계획
|
|
170
|
+
↓
|
|
171
|
+
5. 구현
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## 참고
|
|
177
|
+
|
|
178
|
+
- 복잡한 문제일수록 단계를 더 세분화
|
|
179
|
+
- 각 단계에서 가정과 검증을 명확히
|
|
180
|
+
- 필요시 이전 단계로 돌아가 재분석
|