@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.
Files changed (78) hide show
  1. package/dist/index.d.ts +2 -0
  2. package/dist/index.js +297 -0
  3. package/package.json +47 -0
  4. package/templates/hono/CLAUDE.md +376 -0
  5. package/templates/hono/docs/deployment/cloudflare.md +328 -0
  6. package/templates/hono/docs/deployment/index.md +291 -0
  7. package/templates/hono/docs/git/index.md +180 -0
  8. package/templates/hono/docs/library/hono/error-handling.md +400 -0
  9. package/templates/hono/docs/library/hono/index.md +241 -0
  10. package/templates/hono/docs/library/hono/middleware.md +334 -0
  11. package/templates/hono/docs/library/hono/rpc.md +454 -0
  12. package/templates/hono/docs/library/hono/validation.md +328 -0
  13. package/templates/hono/docs/library/prisma/index.md +427 -0
  14. package/templates/hono/docs/library/zod/index.md +413 -0
  15. package/templates/hono/docs/mcp/context7.md +106 -0
  16. package/templates/hono/docs/mcp/index.md +94 -0
  17. package/templates/hono/docs/mcp/sequential-thinking.md +101 -0
  18. package/templates/hono/docs/mcp/sgrep.md +105 -0
  19. package/templates/hono/docs/skills/gemini-review/SKILL.md +220 -0
  20. package/templates/hono/docs/skills/gemini-review/references/checklists.md +136 -0
  21. package/templates/hono/docs/skills/gemini-review/references/prompt-templates.md +303 -0
  22. package/templates/tanstack-start/CLAUDE.md +279 -0
  23. package/templates/tanstack-start/docs/architecture/architecture.md +547 -0
  24. package/templates/tanstack-start/docs/deployment/cloudflare.md +346 -0
  25. package/templates/tanstack-start/docs/deployment/index.md +102 -0
  26. package/templates/tanstack-start/docs/deployment/nitro.md +211 -0
  27. package/templates/tanstack-start/docs/deployment/railway.md +364 -0
  28. package/templates/tanstack-start/docs/deployment/vercel.md +287 -0
  29. package/templates/tanstack-start/docs/design/accessibility.md +433 -0
  30. package/templates/tanstack-start/docs/design/color.md +235 -0
  31. package/templates/tanstack-start/docs/design/components.md +409 -0
  32. package/templates/tanstack-start/docs/design/index.md +107 -0
  33. package/templates/tanstack-start/docs/design/safe-area.md +317 -0
  34. package/templates/tanstack-start/docs/design/spacing.md +341 -0
  35. package/templates/tanstack-start/docs/design/tailwind-setup.md +470 -0
  36. package/templates/tanstack-start/docs/design/typography.md +324 -0
  37. package/templates/tanstack-start/docs/git/index.md +203 -0
  38. package/templates/tanstack-start/docs/guides/best-practices.md +753 -0
  39. package/templates/tanstack-start/docs/guides/getting-started.md +304 -0
  40. package/templates/tanstack-start/docs/guides/husky-lint-staged.md +303 -0
  41. package/templates/tanstack-start/docs/guides/prettier.md +189 -0
  42. package/templates/tanstack-start/docs/guides/project-templates.md +710 -0
  43. package/templates/tanstack-start/docs/library/better-auth/2fa.md +136 -0
  44. package/templates/tanstack-start/docs/library/better-auth/advanced.md +138 -0
  45. package/templates/tanstack-start/docs/library/better-auth/index.md +83 -0
  46. package/templates/tanstack-start/docs/library/better-auth/plugins.md +111 -0
  47. package/templates/tanstack-start/docs/library/better-auth/session.md +127 -0
  48. package/templates/tanstack-start/docs/library/better-auth/setup.md +123 -0
  49. package/templates/tanstack-start/docs/library/prisma/crud.md +218 -0
  50. package/templates/tanstack-start/docs/library/prisma/index.md +165 -0
  51. package/templates/tanstack-start/docs/library/prisma/relations.md +191 -0
  52. package/templates/tanstack-start/docs/library/prisma/schema.md +177 -0
  53. package/templates/tanstack-start/docs/library/prisma/setup.md +156 -0
  54. package/templates/tanstack-start/docs/library/prisma/transactions.md +140 -0
  55. package/templates/tanstack-start/docs/library/tanstack-query/index.md +146 -0
  56. package/templates/tanstack-start/docs/library/tanstack-query/invalidation.md +146 -0
  57. package/templates/tanstack-start/docs/library/tanstack-query/optimistic-updates.md +196 -0
  58. package/templates/tanstack-start/docs/library/tanstack-query/setup.md +110 -0
  59. package/templates/tanstack-start/docs/library/tanstack-query/use-mutation.md +170 -0
  60. package/templates/tanstack-start/docs/library/tanstack-query/use-query.md +173 -0
  61. package/templates/tanstack-start/docs/library/tanstack-start/auth-patterns.md +171 -0
  62. package/templates/tanstack-start/docs/library/tanstack-start/index.md +114 -0
  63. package/templates/tanstack-start/docs/library/tanstack-start/middleware.md +142 -0
  64. package/templates/tanstack-start/docs/library/tanstack-start/routing.md +163 -0
  65. package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +128 -0
  66. package/templates/tanstack-start/docs/library/tanstack-start/setup.md +85 -0
  67. package/templates/tanstack-start/docs/library/zod/basic-types.md +186 -0
  68. package/templates/tanstack-start/docs/library/zod/complex-types.md +204 -0
  69. package/templates/tanstack-start/docs/library/zod/index.md +186 -0
  70. package/templates/tanstack-start/docs/library/zod/transforms.md +174 -0
  71. package/templates/tanstack-start/docs/library/zod/validation.md +208 -0
  72. package/templates/tanstack-start/docs/mcp/context7.md +204 -0
  73. package/templates/tanstack-start/docs/mcp/index.md +116 -0
  74. package/templates/tanstack-start/docs/mcp/sequential-thinking.md +180 -0
  75. package/templates/tanstack-start/docs/mcp/sgrep.md +174 -0
  76. package/templates/tanstack-start/docs/skills/gemini-review/SKILL.md +220 -0
  77. package/templates/tanstack-start/docs/skills/gemini-review/references/checklists.md +150 -0
  78. package/templates/tanstack-start/docs/skills/gemini-review/references/prompt-templates.md +293 -0
@@ -0,0 +1,547 @@
1
+ # Architecture
2
+
3
+ TanStack Start 애플리케이션의 기술 아키텍처 가이드입니다.
4
+
5
+ ## System Overview
6
+
7
+ ```
8
+ ┌─────────────────────────────────────────────────────────────────┐
9
+ │ Client (Browser) │
10
+ │ │
11
+ │ ┌────────────────┐ ┌────────────────┐ ┌───────────────┐ │
12
+ │ │ React Router │───▶│ TanStack Query │───▶│ React UI │ │
13
+ │ │ (Navigation) │◀───│ (Caching) │◀───│ (Components) │ │
14
+ │ └────────────────┘ └───────┬────────┘ └───────────────┘ │
15
+ │ │ │
16
+ └────────────────────────────────┼─────────────────────────────────┘
17
+
18
+
19
+ ┌─────────────────────────────────────────────────────────────────┐
20
+ │ TanStack Start Server │
21
+ │ │
22
+ │ ┌────────────────────────────────────────────────────────────┐ │
23
+ │ │ Server Functions │ │
24
+ │ │ - createServerFn({ method: 'GET' }) → Queries │ │
25
+ │ │ - createServerFn({ method: 'POST' }) → Mutations │ │
26
+ │ └────────────────────────────┬───────────────────────────────┘ │
27
+ │ │ │
28
+ │ ┌────────────────────────────▼───────────────────────────────┐ │
29
+ │ │ Services Layer │ │
30
+ │ │ - Zod Validation │ │
31
+ │ │ - Business Logic │ │
32
+ │ │ - Data Transformation │ │
33
+ │ └────────────────────────────┬───────────────────────────────┘ │
34
+ │ │ │
35
+ └───────────────────────────────┼──────────────────────────────────┘
36
+
37
+
38
+ ┌─────────────────────────────────────────────────────────────────┐
39
+ │ Database Layer │
40
+ │ │
41
+ │ ┌────────────────┐ ┌────────────────┐ ┌───────────────┐ │
42
+ │ │ Prisma Client │───▶│ PostgreSQL │ │ Redis │ │
43
+ │ │ (ORM) │ │ (Primary) │ │ (Cache) │ │
44
+ │ └────────────────┘ └────────────────┘ └───────────────┘ │
45
+ │ │
46
+ └─────────────────────────────────────────────────────────────────┘
47
+ ```
48
+
49
+ ## Project Structure
50
+
51
+ ```
52
+ my-app/
53
+ ├── src/
54
+ │ ├── routes/ # 파일 기반 라우팅
55
+ │ │ ├── __root.tsx # Root layout
56
+ │ │ ├── index.tsx # Home (/)
57
+ │ │ └── users/
58
+ │ │ ├── index.tsx # /users
59
+ │ │ ├── $id.tsx # /users/:id
60
+ │ │ ├── route.tsx # route 설정 (선택)
61
+ │ │ ├── -components/ # 페이지 전용 컴포넌트
62
+ │ │ │ └── user-card.tsx
63
+ │ │ ├── -sections/ # 섹션 분리
64
+ │ │ │ ├── user-list-section.tsx
65
+ │ │ │ └── user-filter-section.tsx
66
+ │ │ └── -hooks/ # 페이지 전용 훅
67
+ │ │ └── use-users.ts
68
+ │ ├── components/ # 공통 컴포넌트
69
+ │ │ └── ui/
70
+ │ │ ├── button.tsx
71
+ │ │ ├── input.tsx
72
+ │ │ └── modal.tsx
73
+ │ ├── database/ # 데이터베이스 관련
74
+ │ │ ├── prisma.ts # Prisma Client 싱글톤
75
+ │ │ └── seed.ts # 시드 데이터 (선택)
76
+ │ ├── services/ # 도메인별 서비스 레이어
77
+ │ │ ├── user/
78
+ │ │ │ ├── index.ts # 진입점 (re-export)
79
+ │ │ │ ├── schemas.ts # Zod 스키마
80
+ │ │ │ ├── queries.ts # GET 요청
81
+ │ │ │ └── mutations.ts # POST 요청
82
+ │ │ ├── auth/
83
+ │ │ │ ├── index.ts
84
+ │ │ │ ├── schemas.ts
85
+ │ │ │ ├── queries.ts
86
+ │ │ │ └── mutations.ts
87
+ │ │ └── post/
88
+ │ │ ├── index.ts
89
+ │ │ ├── schemas.ts
90
+ │ │ ├── queries.ts
91
+ │ │ └── mutations.ts
92
+ │ ├── lib/ # 공통 유틸리티
93
+ │ │ ├── query-client.ts
94
+ │ │ └── utils.ts
95
+ │ ├── hooks/ # 공통 훅
96
+ │ │ └── use-auth.ts
97
+ │ ├── types/ # 타입 정의
98
+ │ │ └── index.ts
99
+ │ └── styles/
100
+ │ └── app.css
101
+ ├── generated/
102
+ │ └── prisma/ # Prisma Client 출력
103
+ ├── prisma/
104
+ │ └── schema.prisma
105
+ ├── app.config.ts
106
+ ├── package.json
107
+ └── tsconfig.json
108
+ ```
109
+
110
+ ## Layer Architecture
111
+
112
+ ### 1. Routes Layer (Presentation)
113
+
114
+ 파일 기반 라우팅으로 페이지를 구성합니다.
115
+
116
+ ```
117
+ routes/<route-name>/
118
+ ├── index.tsx # 페이지 컴포넌트
119
+ ├── route.tsx # route 설정 (loader, beforeLoad)
120
+ ├── -components/ # 페이지 전용 컴포넌트
121
+ ├── -sections/ # 섹션 분리 (복잡한 경우)
122
+ └── -hooks/ # 페이지 전용 훅
123
+ ```
124
+
125
+ **특징**:
126
+ - `-` 접두사 폴더는 라우트에서 제외
127
+ - 페이지별로 컴포넌트, 섹션, 훅을 분리
128
+ - Section은 UI 영역 단위, Component는 재사용 단위
129
+
130
+ ```tsx
131
+ // routes/users/index.tsx
132
+ import { createFileRoute } from '@tanstack/react-router'
133
+ import { UserListSection } from './-sections/user-list-section'
134
+ import { UserFilterSection } from './-sections/user-filter-section'
135
+
136
+ export const Route = createFileRoute('/users/')({
137
+ component: UsersPage,
138
+ })
139
+
140
+ const UsersPage = (): JSX.Element => {
141
+ return (
142
+ <div className="container mx-auto p-4">
143
+ <h1 className="text-2xl font-bold mb-4">Users</h1>
144
+ <UserFilterSection />
145
+ <UserListSection />
146
+ </div>
147
+ )
148
+ }
149
+ ```
150
+
151
+ ### 2. Services Layer (Business Logic)
152
+
153
+ 도메인별로 서비스를 구성합니다.
154
+
155
+ ```
156
+ services/<domain>/
157
+ ├── index.ts # 진입점 (re-export)
158
+ ├── schemas.ts # Zod 스키마
159
+ ├── queries.ts # GET 요청 (읽기)
160
+ └── mutations.ts # POST 요청 (쓰기)
161
+ ```
162
+
163
+ **Schemas** - 입력 검증:
164
+
165
+ ```typescript
166
+ // services/user/schemas.ts
167
+ import { z } from 'zod'
168
+
169
+ export const createUserSchema = z.object({
170
+ email: z.email(),
171
+ name: z.string().min(1).max(100).trim(),
172
+ })
173
+
174
+ export type CreateUserInput = z.infer<typeof createUserSchema>
175
+ ```
176
+
177
+ **Queries** - 읽기 작업:
178
+
179
+ ```typescript
180
+ // services/user/queries.ts
181
+ import { createServerFn } from '@tanstack/react-start'
182
+ import { prisma } from '@/database/prisma'
183
+
184
+ export const getUsers = createServerFn({ method: 'GET' })
185
+ .handler(async () => {
186
+ return prisma.user.findMany({
187
+ orderBy: { createdAt: 'desc' },
188
+ })
189
+ })
190
+ ```
191
+
192
+ **Mutations** - 쓰기 작업:
193
+
194
+ ```typescript
195
+ // services/user/mutations.ts
196
+ import { createServerFn } from '@tanstack/react-start'
197
+ import { prisma } from '@/database/prisma'
198
+ import { createUserSchema } from './schemas'
199
+
200
+ export const createUser = createServerFn({ method: 'POST' })
201
+ .inputValidator(createUserSchema)
202
+ .handler(async ({ data }) => {
203
+ return prisma.user.create({ data })
204
+ })
205
+ ```
206
+
207
+ ### 3. Database Layer (Data Access)
208
+
209
+ Prisma를 통한 데이터 액세스를 담당합니다.
210
+
211
+ ```typescript
212
+ // database/prisma.ts
213
+ import { PrismaClient } from '../../generated/prisma'
214
+
215
+ const globalForPrisma = globalThis as unknown as {
216
+ prisma: PrismaClient | undefined
217
+ }
218
+
219
+ export const prisma =
220
+ globalForPrisma.prisma ??
221
+ new PrismaClient({
222
+ log: process.env.NODE_ENV === 'development' ? ['query'] : [],
223
+ })
224
+
225
+ if (process.env.NODE_ENV !== 'production') {
226
+ globalForPrisma.prisma = prisma
227
+ }
228
+ ```
229
+
230
+ ## Data Flow
231
+
232
+ ### Query Flow (읽기)
233
+
234
+ ```
235
+ 1. User navigates to page
236
+
237
+ 2. Page Hook calls useQuery
238
+
239
+
240
+ ┌─────────────────┐
241
+ │ TanStack Query │ ◀── Cache check
242
+ └────────┬────────┘
243
+ │ Cache miss
244
+
245
+ ┌─────────────────┐
246
+ │ Server Function│ ← getUsers()
247
+ │ (method: GET) │
248
+ └────────┬────────┘
249
+
250
+
251
+ ┌─────────────────┐
252
+ │ Prisma Query │
253
+ └────────┬────────┘
254
+
255
+
256
+ ┌─────────────────┐
257
+ │ Database │
258
+ └─────────────────┘
259
+ ```
260
+
261
+ ### Mutation Flow (쓰기)
262
+
263
+ ```
264
+ 1. User submits form
265
+
266
+ 2. Page Hook calls useMutation
267
+
268
+
269
+ ┌─────────────────┐
270
+ │ useMutation │
271
+ └────────┬────────┘
272
+
273
+
274
+ ┌─────────────────┐
275
+ │ Server Function│ ← createUser()
276
+ │ (method: POST) │
277
+ └────────┬────────┘
278
+
279
+
280
+ ┌─────────────────┐
281
+ │ Zod Validation │ ← Schema check
282
+ └────────┬────────┘
283
+ │ Valid
284
+
285
+ ┌─────────────────┐
286
+ │ Prisma Mutation│
287
+ └────────┬────────┘
288
+
289
+
290
+ ┌─────────────────┐
291
+ │ Database │
292
+ └────────┬────────┘
293
+
294
+
295
+ ┌─────────────────┐
296
+ │ Cache Invalidate│ ← invalidateQueries
297
+ └─────────────────┘
298
+ ```
299
+
300
+ ## Component Patterns
301
+
302
+ ### Page Hook Pattern
303
+
304
+ ```typescript
305
+ // routes/users/-hooks/use-users.ts
306
+ import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
307
+ import { getUsers, createUser, deleteUser } from '@/services/user'
308
+
309
+ export const useUsers = () => {
310
+ const queryClient = useQueryClient()
311
+
312
+ const { data: users, isLoading, error } = useQuery({
313
+ queryKey: ['users'],
314
+ queryFn: () => getUsers(),
315
+ })
316
+
317
+ const createMutation = useMutation({
318
+ mutationFn: createUser,
319
+ onSuccess: () => {
320
+ queryClient.invalidateQueries({ queryKey: ['users'] })
321
+ },
322
+ })
323
+
324
+ return {
325
+ users,
326
+ isLoading,
327
+ error,
328
+ createUser: createMutation.mutate,
329
+ isCreating: createMutation.isPending,
330
+ }
331
+ }
332
+ ```
333
+
334
+ ### Section Pattern
335
+
336
+ ```tsx
337
+ // routes/users/-sections/user-list-section.tsx
338
+ import { useUsers } from '../-hooks/use-users'
339
+ import { UserCard } from '../-components/user-card'
340
+
341
+ export const UserListSection = (): JSX.Element => {
342
+ const { users, isLoading, error } = useUsers()
343
+
344
+ if (isLoading) return <div>Loading...</div>
345
+ if (error) return <div>Error: {error.message}</div>
346
+
347
+ return (
348
+ <div className="grid gap-4 md:grid-cols-2 lg:grid-cols-3">
349
+ {users?.map((user) => (
350
+ <UserCard key={user.id} user={user} />
351
+ ))}
352
+ </div>
353
+ )
354
+ }
355
+ ```
356
+
357
+ ## Technology Stack
358
+
359
+ ### Core Framework
360
+
361
+ | Technology | Purpose | Version |
362
+ |------------|---------|---------|
363
+ | TanStack Start | Full-stack Framework | latest |
364
+ | TanStack Router | File-based Routing | latest |
365
+ | TanStack Query | Data Fetching & Caching | latest |
366
+ | React | UI Library | 18+ |
367
+
368
+ ### Backend
369
+
370
+ | Technology | Purpose | Version |
371
+ |------------|---------|---------|
372
+ | Prisma | ORM | 7.x |
373
+ | Zod | Validation | 4.x |
374
+ | Nitro | Server Runtime | latest |
375
+
376
+ ### Database
377
+
378
+ | Technology | Purpose |
379
+ |------------|---------|
380
+ | PostgreSQL | Primary Database |
381
+ | Redis | Caching (선택) |
382
+
383
+ ## TypeScript Configuration
384
+
385
+ ```json
386
+ {
387
+ "compilerOptions": {
388
+ "target": "ES2022",
389
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
390
+ "module": "ESNext",
391
+ "moduleResolution": "bundler",
392
+ "jsx": "react-jsx",
393
+ "strict": true,
394
+ "noUnusedLocals": true,
395
+ "noUnusedParameters": true,
396
+ "paths": {
397
+ "@/*": ["./src/*"]
398
+ }
399
+ },
400
+ "include": ["src/**/*", "*.config.ts"]
401
+ }
402
+ ```
403
+
404
+ ## Deployment Architecture
405
+
406
+ ### Vercel
407
+
408
+ ```
409
+ ┌─────────────────────────────────────┐
410
+ │ Vercel Platform │
411
+ │ │
412
+ │ ┌─────────────┐ ┌─────────────┐ │
413
+ │ │ Edge │ │ Serverless │ │
414
+ │ │ Functions │ │ Functions │ │
415
+ │ └─────────────┘ └─────────────┘ │
416
+ │ │
417
+ └───────────────────┬─────────────────┘
418
+
419
+
420
+ ┌───────────────┐
421
+ │ Database │
422
+ │ (Neon/Supabase) │
423
+ └───────────────┘
424
+ ```
425
+
426
+ ### Railway / Cloudflare
427
+
428
+ ```
429
+ ┌─────────────────────────────────────┐
430
+ │ Platform (Railway/CF) │
431
+ │ │
432
+ │ ┌─────────────────────────────┐ │
433
+ │ │ Node.js / Workers │ │
434
+ │ │ (Full-stack Server) │ │
435
+ │ └─────────────────────────────┘ │
436
+ │ │
437
+ └───────────────────┬─────────────────┘
438
+
439
+
440
+ ┌───────────────┐
441
+ │ Database │
442
+ │ (PostgreSQL) │
443
+ └───────────────┘
444
+ ```
445
+
446
+ ## Documentation Structure
447
+
448
+ ```
449
+ docs/
450
+ ├── guides/ # 개발 가이드
451
+ │ ├── getting-started.md # 시작 가이드
452
+ │ ├── best-practices.md # 모범 사례
453
+ │ └── project-templates.md # 템플릿
454
+ ├── library/ # 라이브러리 레퍼런스
455
+ │ ├── tanstack-start/ # TanStack Start
456
+ │ ├── tanstack-query/ # TanStack Query
457
+ │ ├── prisma/ # Prisma
458
+ │ ├── zod/ # Zod
459
+ │ └── better-auth/ # Better Auth
460
+ ├── deployment/ # 배포 가이드
461
+ │ ├── nitro.md # Nitro 설정
462
+ │ ├── vercel.md # Vercel 배포
463
+ │ ├── cloudflare.md # Cloudflare 배포
464
+ │ └── railway.md # Railway 배포
465
+ └── architecture/ # 아키텍처
466
+ └── architecture.md # 시스템 아키텍처
467
+ ```
468
+
469
+ ## Security Considerations
470
+
471
+ ### Input Validation
472
+
473
+ 모든 서버 함수에서 Zod를 통한 입력 검증:
474
+
475
+ ```typescript
476
+ export const createUser = createServerFn({ method: 'POST' })
477
+ .inputValidator(createUserSchema) // 자동 검증
478
+ .handler(async ({ data }) => {
479
+ // data는 이미 검증됨
480
+ })
481
+ ```
482
+
483
+ ### Environment Variables
484
+
485
+ ```typescript
486
+ // lib/env.ts
487
+ import { z } from 'zod'
488
+
489
+ const envSchema = z.object({
490
+ NODE_ENV: z.enum(['development', 'production', 'test']),
491
+ DATABASE_URL: z.url(),
492
+ API_SECRET: z.string().min(32),
493
+ })
494
+
495
+ export const env = envSchema.parse(process.env)
496
+ ```
497
+
498
+ ### Authentication
499
+
500
+ Better Auth를 통한 인증 관리:
501
+
502
+ ```typescript
503
+ // services/auth/index.ts
504
+ import { betterAuth } from 'better-auth'
505
+ import { prismaAdapter } from 'better-auth/adapters/prisma'
506
+
507
+ export const auth = betterAuth({
508
+ database: prismaAdapter(prisma),
509
+ emailAndPassword: { enabled: true },
510
+ })
511
+ ```
512
+
513
+ ## Performance Considerations
514
+
515
+ ### Caching Strategy
516
+
517
+ ```typescript
518
+ // TanStack Query 캐싱
519
+ const { data } = useQuery({
520
+ queryKey: ['users'],
521
+ queryFn: () => getUsers(),
522
+ staleTime: 60 * 1000, // 1분간 fresh
523
+ gcTime: 5 * 60 * 1000, // 5분간 캐시 유지
524
+ })
525
+ ```
526
+
527
+ ### Database Optimization
528
+
529
+ ```typescript
530
+ // Prisma 쿼리 최적화
531
+ const users = await prisma.user.findMany({
532
+ select: { // 필요한 필드만 선택
533
+ id: true,
534
+ name: true,
535
+ email: true,
536
+ },
537
+ take: 20, // 페이지네이션
538
+ skip: (page - 1) * 20,
539
+ })
540
+ ```
541
+
542
+ ## Related Documentation
543
+
544
+ - [Getting Started](../guides/getting-started.md) - 프로젝트 시작 가이드
545
+ - [Best Practices](../guides/best-practices.md) - 개발 모범 사례
546
+ - [Project Templates](../guides/project-templates.md) - 프로젝트 템플릿
547
+ - [Deployment](../deployment/index.md) - 배포 가이드