@kood/claude-code 0.1.2 → 0.1.4
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 +129 -5
- package/package.json +2 -2
- package/templates/hono/CLAUDE.md +20 -2
- package/templates/hono/docs/architecture/architecture.md +909 -0
- package/templates/hono/docs/commands/git.md +275 -0
- package/templates/hono/docs/deployment/cloudflare.md +527 -190
- package/templates/hono/docs/deployment/docker.md +514 -0
- package/templates/hono/docs/deployment/index.md +179 -214
- package/templates/hono/docs/deployment/railway.md +416 -0
- package/templates/hono/docs/deployment/vercel.md +567 -0
- package/templates/hono/docs/library/ai-sdk/index.md +427 -0
- package/templates/hono/docs/library/ai-sdk/openrouter.md +479 -0
- package/templates/hono/docs/library/ai-sdk/providers.md +468 -0
- package/templates/hono/docs/library/ai-sdk/streaming.md +447 -0
- package/templates/hono/docs/library/ai-sdk/structured-output.md +493 -0
- package/templates/hono/docs/library/ai-sdk/tools.md +513 -0
- package/templates/hono/docs/library/hono/env-setup.md +458 -0
- package/templates/hono/docs/library/hono/index.md +1 -3
- package/templates/hono/docs/library/pino/index.md +437 -0
- package/templates/hono/docs/library/prisma/cloudflare-d1.md +503 -0
- package/templates/hono/docs/library/prisma/config.md +362 -0
- package/templates/hono/docs/library/prisma/index.md +86 -13
- package/templates/hono/docs/skills/gemini-review/SKILL.md +116 -116
- package/templates/hono/docs/skills/gemini-review/references/checklists.md +125 -125
- package/templates/hono/docs/skills/gemini-review/references/prompt-templates.md +191 -191
- package/templates/npx/CLAUDE.md +309 -0
- package/templates/npx/docs/commands/git.md +275 -0
- package/templates/npx/docs/library/commander/index.md +164 -0
- package/templates/npx/docs/library/fs-extra/index.md +171 -0
- package/templates/npx/docs/library/prompts/index.md +253 -0
- package/templates/npx/docs/mcp/index.md +60 -0
- package/templates/npx/docs/skills/gemini-review/SKILL.md +220 -0
- package/templates/npx/docs/skills/gemini-review/references/checklists.md +134 -0
- package/templates/npx/docs/skills/gemini-review/references/prompt-templates.md +301 -0
- package/templates/tanstack-start/CLAUDE.md +43 -5
- package/templates/tanstack-start/docs/architecture/architecture.md +134 -4
- package/templates/tanstack-start/docs/commands/git.md +275 -0
- package/templates/tanstack-start/docs/deployment/cloudflare.md +223 -50
- package/templates/tanstack-start/docs/deployment/index.md +320 -30
- package/templates/tanstack-start/docs/deployment/nitro.md +195 -14
- package/templates/tanstack-start/docs/deployment/railway.md +302 -150
- package/templates/tanstack-start/docs/deployment/vercel.md +345 -75
- package/templates/tanstack-start/docs/guides/best-practices.md +203 -1
- package/templates/tanstack-start/docs/guides/env-setup.md +450 -0
- package/templates/tanstack-start/docs/library/ai-sdk/hooks.md +472 -0
- package/templates/tanstack-start/docs/library/ai-sdk/index.md +264 -0
- package/templates/tanstack-start/docs/library/ai-sdk/openrouter.md +371 -0
- package/templates/tanstack-start/docs/library/ai-sdk/providers.md +403 -0
- package/templates/tanstack-start/docs/library/ai-sdk/streaming.md +320 -0
- package/templates/tanstack-start/docs/library/ai-sdk/structured-output.md +454 -0
- package/templates/tanstack-start/docs/library/ai-sdk/tools.md +473 -0
- package/templates/tanstack-start/docs/library/pino/index.md +320 -0
- package/templates/tanstack-start/docs/library/prisma/cloudflare-d1.md +404 -0
- package/templates/tanstack-start/docs/library/prisma/config.md +377 -0
- package/templates/tanstack-start/docs/library/prisma/index.md +3 -5
- package/templates/tanstack-start/docs/library/prisma/schema.md +123 -25
- package/templates/tanstack-start/docs/library/prisma/setup.md +0 -7
- package/templates/tanstack-start/docs/library/tanstack-start/server-functions.md +80 -2
- package/templates/tanstack-start/docs/skills/gemini-review/SKILL.md +116 -116
- package/templates/tanstack-start/docs/skills/gemini-review/references/checklists.md +138 -144
- package/templates/tanstack-start/docs/skills/gemini-review/references/prompt-templates.md +186 -187
- package/templates/hono/docs/git/index.md +0 -180
- package/templates/tanstack-start/docs/git/index.md +0 -203
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
# Hono - 환경 변수 설정
|
|
2
|
+
|
|
3
|
+
> **상위 문서**: [Hono](./index.md)
|
|
4
|
+
|
|
5
|
+
환경별 `.env` 파일 설정 및 타입 안전한 환경 변수 관리 방법입니다.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 환경별 .env 파일 구조
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
프로젝트/
|
|
13
|
+
├── .env # 기본 환경 변수 (공통)
|
|
14
|
+
├── .env.development # 개발 환경
|
|
15
|
+
├── .env.production # 프로덕션 환경
|
|
16
|
+
├── .env.local # 로컬 개발 (gitignore)
|
|
17
|
+
├── .env.example # 예시 파일 (커밋용)
|
|
18
|
+
└── src/
|
|
19
|
+
└── env.ts # 환경 변수 검증 및 타입
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 설치
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npm install dotenv
|
|
28
|
+
npm install -D @types/node
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 환경 변수 파일 예시
|
|
34
|
+
|
|
35
|
+
### .env.example (커밋용 템플릿)
|
|
36
|
+
|
|
37
|
+
```env
|
|
38
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
39
|
+
# 환경 변수 템플릿
|
|
40
|
+
# 복사 후 .env.local 로 저장하여 사용
|
|
41
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
42
|
+
|
|
43
|
+
# 앱 설정
|
|
44
|
+
NODE_ENV=development
|
|
45
|
+
PORT=3000
|
|
46
|
+
|
|
47
|
+
# 데이터베이스
|
|
48
|
+
DATABASE_URL=postgresql://user:password@localhost:5432/mydb
|
|
49
|
+
|
|
50
|
+
# 인증
|
|
51
|
+
JWT_SECRET=your-secret-key-here
|
|
52
|
+
JWT_EXPIRES_IN=7d
|
|
53
|
+
|
|
54
|
+
# 외부 서비스
|
|
55
|
+
OPENAI_API_KEY=sk-xxx
|
|
56
|
+
REDIS_URL=redis://localhost:6379
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### .env.development
|
|
60
|
+
|
|
61
|
+
```env
|
|
62
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
63
|
+
# 개발 환경 설정
|
|
64
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
65
|
+
|
|
66
|
+
NODE_ENV=development
|
|
67
|
+
PORT=3000
|
|
68
|
+
|
|
69
|
+
# 개발용 데이터베이스
|
|
70
|
+
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/myapp_dev
|
|
71
|
+
|
|
72
|
+
# 개발용 시크릿 (짧은 값 OK)
|
|
73
|
+
JWT_SECRET=dev-secret-key
|
|
74
|
+
JWT_EXPIRES_IN=1d
|
|
75
|
+
|
|
76
|
+
# 개발용 외부 서비스
|
|
77
|
+
OPENAI_API_KEY=sk-dev-xxx
|
|
78
|
+
REDIS_URL=redis://localhost:6379
|
|
79
|
+
|
|
80
|
+
# 개발용 옵션
|
|
81
|
+
LOG_LEVEL=debug
|
|
82
|
+
CORS_ORIGIN=http://localhost:5173
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### .env.production
|
|
86
|
+
|
|
87
|
+
```env
|
|
88
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
89
|
+
# 프로덕션 환경 설정
|
|
90
|
+
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
91
|
+
|
|
92
|
+
NODE_ENV=production
|
|
93
|
+
PORT=8080
|
|
94
|
+
|
|
95
|
+
# 프로덕션 데이터베이스
|
|
96
|
+
DATABASE_URL=postgresql://user:strongpassword@prod-db.example.com:5432/myapp
|
|
97
|
+
|
|
98
|
+
# 프로덕션 시크릿 (강력한 값 필수)
|
|
99
|
+
JWT_SECRET=super-secure-production-secret-key-at-least-32-chars
|
|
100
|
+
JWT_EXPIRES_IN=7d
|
|
101
|
+
|
|
102
|
+
# 프로덕션 외부 서비스
|
|
103
|
+
OPENAI_API_KEY=sk-prod-xxx
|
|
104
|
+
REDIS_URL=redis://prod-redis.example.com:6379
|
|
105
|
+
|
|
106
|
+
# 프로덕션 옵션
|
|
107
|
+
LOG_LEVEL=info
|
|
108
|
+
CORS_ORIGIN=https://myapp.com
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## 타입 안전한 환경 변수 (Zod)
|
|
114
|
+
|
|
115
|
+
### src/env.ts
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
// src/env.ts
|
|
119
|
+
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
120
|
+
// 환경 변수 검증 및 타입 정의
|
|
121
|
+
// 앱 시작 시 자동으로 환경 변수를 검증합니다
|
|
122
|
+
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
123
|
+
import { z } from 'zod'
|
|
124
|
+
|
|
125
|
+
// 환경 변수 스키마
|
|
126
|
+
const envSchema = z.object({
|
|
127
|
+
// 앱 설정
|
|
128
|
+
NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),
|
|
129
|
+
PORT: z.coerce.number().default(3000),
|
|
130
|
+
|
|
131
|
+
// 데이터베이스
|
|
132
|
+
DATABASE_URL: z.string().url(),
|
|
133
|
+
|
|
134
|
+
// 인증
|
|
135
|
+
JWT_SECRET: z.string().min(16),
|
|
136
|
+
JWT_EXPIRES_IN: z.string().default('7d'),
|
|
137
|
+
|
|
138
|
+
// 외부 서비스 (선택적)
|
|
139
|
+
OPENAI_API_KEY: z.string().optional(),
|
|
140
|
+
REDIS_URL: z.string().url().optional(),
|
|
141
|
+
|
|
142
|
+
// 옵션
|
|
143
|
+
LOG_LEVEL: z.enum(['debug', 'info', 'warn', 'error']).default('info'),
|
|
144
|
+
CORS_ORIGIN: z.string().default('*'),
|
|
145
|
+
})
|
|
146
|
+
|
|
147
|
+
// 환경 변수 타입 추출
|
|
148
|
+
export type Env = z.infer<typeof envSchema>
|
|
149
|
+
|
|
150
|
+
// 환경 변수 파싱 및 검증
|
|
151
|
+
const parseEnv = (): Env => {
|
|
152
|
+
const result = envSchema.safeParse(process.env)
|
|
153
|
+
|
|
154
|
+
if (!result.success) {
|
|
155
|
+
console.error('❌ 환경 변수 검증 실패:')
|
|
156
|
+
console.error(result.error.format())
|
|
157
|
+
process.exit(1)
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return result.data
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// 검증된 환경 변수 export
|
|
164
|
+
export const env = parseEnv()
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## dotenv 설정
|
|
170
|
+
|
|
171
|
+
### src/index.ts (진입점)
|
|
172
|
+
|
|
173
|
+
```typescript
|
|
174
|
+
// src/index.ts
|
|
175
|
+
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
176
|
+
// Hono 앱 진입점
|
|
177
|
+
// dotenv는 가장 먼저 import해야 합니다
|
|
178
|
+
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
179
|
+
import 'dotenv/config' // ⚠️ 반드시 최상단!
|
|
180
|
+
import { serve } from '@hono/node-server'
|
|
181
|
+
import { app } from './app'
|
|
182
|
+
import { env } from './env'
|
|
183
|
+
|
|
184
|
+
serve({
|
|
185
|
+
fetch: app.fetch,
|
|
186
|
+
port: env.PORT,
|
|
187
|
+
}, (info) => {
|
|
188
|
+
console.log(`🚀 Server running on http://localhost:${info.port}`)
|
|
189
|
+
console.log(`📍 Environment: ${env.NODE_ENV}`)
|
|
190
|
+
})
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### 환경별 dotenv 로드
|
|
194
|
+
|
|
195
|
+
```typescript
|
|
196
|
+
// src/load-env.ts
|
|
197
|
+
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
198
|
+
// 환경별 .env 파일 로드
|
|
199
|
+
// NODE_ENV에 따라 적절한 파일을 로드합니다
|
|
200
|
+
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
201
|
+
import { config } from 'dotenv'
|
|
202
|
+
import path from 'node:path'
|
|
203
|
+
|
|
204
|
+
const loadEnv = () => {
|
|
205
|
+
const nodeEnv = process.env.NODE_ENV || 'development'
|
|
206
|
+
|
|
207
|
+
// 로드 순서: .env.local → .env.{환경} → .env
|
|
208
|
+
const envFiles = [
|
|
209
|
+
`.env.local`, // 로컬 오버라이드 (gitignore)
|
|
210
|
+
`.env.${nodeEnv}`, // 환경별 설정
|
|
211
|
+
`.env`, // 기본 설정
|
|
212
|
+
]
|
|
213
|
+
|
|
214
|
+
envFiles.forEach((file) => {
|
|
215
|
+
config({ path: path.resolve(process.cwd(), file) })
|
|
216
|
+
})
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
loadEnv()
|
|
220
|
+
|
|
221
|
+
export {}
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
```typescript
|
|
225
|
+
// src/index.ts
|
|
226
|
+
import './load-env' // ⚠️ 반드시 최상단!
|
|
227
|
+
import { serve } from '@hono/node-server'
|
|
228
|
+
import { app } from './app'
|
|
229
|
+
import { env } from './env'
|
|
230
|
+
|
|
231
|
+
// ... 나머지 코드
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## Hono Bindings 타입 정의
|
|
237
|
+
|
|
238
|
+
### src/types/hono.ts
|
|
239
|
+
|
|
240
|
+
```typescript
|
|
241
|
+
// src/types/hono.ts
|
|
242
|
+
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
243
|
+
// Hono 앱 타입 정의
|
|
244
|
+
// Bindings, Variables 등 전역 타입을 정의합니다
|
|
245
|
+
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
246
|
+
import type { Env } from '../env'
|
|
247
|
+
|
|
248
|
+
// 환경 변수 Bindings
|
|
249
|
+
export type Bindings = Env
|
|
250
|
+
|
|
251
|
+
// 요청 간 공유 변수
|
|
252
|
+
export type Variables = {
|
|
253
|
+
requestId: string
|
|
254
|
+
userId?: string
|
|
255
|
+
user?: {
|
|
256
|
+
id: string
|
|
257
|
+
email: string
|
|
258
|
+
role: string
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// Hono 앱 타입
|
|
263
|
+
export type HonoEnv = {
|
|
264
|
+
Bindings: Bindings
|
|
265
|
+
Variables: Variables
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### src/app.ts
|
|
270
|
+
|
|
271
|
+
```typescript
|
|
272
|
+
// src/app.ts
|
|
273
|
+
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
274
|
+
// Hono 앱 설정
|
|
275
|
+
// ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
276
|
+
import { Hono } from 'hono'
|
|
277
|
+
import { cors } from 'hono/cors'
|
|
278
|
+
import { logger } from 'hono/logger'
|
|
279
|
+
import type { HonoEnv } from './types/hono'
|
|
280
|
+
import { env } from './env'
|
|
281
|
+
|
|
282
|
+
export const app = new Hono<HonoEnv>()
|
|
283
|
+
|
|
284
|
+
// 미들웨어 설정
|
|
285
|
+
app.use('*', logger())
|
|
286
|
+
app.use('*', cors({ origin: env.CORS_ORIGIN }))
|
|
287
|
+
|
|
288
|
+
// 환경 변수 바인딩 미들웨어 (Node.js용)
|
|
289
|
+
app.use('*', async (c, next) => {
|
|
290
|
+
// Node.js에서는 process.env를 c.env로 바인딩
|
|
291
|
+
Object.assign(c.env, env)
|
|
292
|
+
await next()
|
|
293
|
+
})
|
|
294
|
+
|
|
295
|
+
// 라우트
|
|
296
|
+
app.get('/', (c) => {
|
|
297
|
+
return c.json({
|
|
298
|
+
message: 'Hello Hono!',
|
|
299
|
+
environment: c.env.NODE_ENV,
|
|
300
|
+
})
|
|
301
|
+
})
|
|
302
|
+
|
|
303
|
+
app.get('/health', (c) => {
|
|
304
|
+
return c.json({
|
|
305
|
+
status: 'ok',
|
|
306
|
+
timestamp: new Date().toISOString(),
|
|
307
|
+
})
|
|
308
|
+
})
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
## Cloudflare Workers 환경
|
|
314
|
+
|
|
315
|
+
Cloudflare Workers에서는 `wrangler.toml`과 `.dev.vars`를 사용합니다.
|
|
316
|
+
|
|
317
|
+
### wrangler.toml
|
|
318
|
+
|
|
319
|
+
```toml
|
|
320
|
+
name = "my-hono-app"
|
|
321
|
+
main = "src/index.ts"
|
|
322
|
+
compatibility_date = "2024-01-01"
|
|
323
|
+
|
|
324
|
+
[vars]
|
|
325
|
+
NODE_ENV = "production"
|
|
326
|
+
LOG_LEVEL = "info"
|
|
327
|
+
|
|
328
|
+
# 개발 환경 오버라이드
|
|
329
|
+
[env.development.vars]
|
|
330
|
+
NODE_ENV = "development"
|
|
331
|
+
LOG_LEVEL = "debug"
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### .dev.vars (개발용 시크릿)
|
|
335
|
+
|
|
336
|
+
```env
|
|
337
|
+
# ⚠️ 이 파일은 gitignore에 추가해야 합니다
|
|
338
|
+
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/myapp_dev
|
|
339
|
+
JWT_SECRET=dev-secret-key
|
|
340
|
+
OPENAI_API_KEY=sk-dev-xxx
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
### wrangler 시크릿 설정 (프로덕션)
|
|
344
|
+
|
|
345
|
+
```bash
|
|
346
|
+
# 시크릿 추가
|
|
347
|
+
wrangler secret put DATABASE_URL
|
|
348
|
+
wrangler secret put JWT_SECRET
|
|
349
|
+
wrangler secret put OPENAI_API_KEY
|
|
350
|
+
|
|
351
|
+
# 시크릿 목록 확인
|
|
352
|
+
wrangler secret list
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
---
|
|
356
|
+
|
|
357
|
+
## .gitignore 설정
|
|
358
|
+
|
|
359
|
+
```gitignore
|
|
360
|
+
# 환경 변수 파일
|
|
361
|
+
.env
|
|
362
|
+
.env.local
|
|
363
|
+
.env.*.local
|
|
364
|
+
.dev.vars
|
|
365
|
+
|
|
366
|
+
# 커밋해도 되는 파일
|
|
367
|
+
!.env.example
|
|
368
|
+
!.env.development
|
|
369
|
+
!.env.production
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
⚠️ **주의**: `.env.development`와 `.env.production`에는 **실제 시크릿을 절대 넣지 마세요!**
|
|
373
|
+
- 실제 시크릿은 `.env.local` 또는 CI/CD 환경 변수로 관리
|
|
374
|
+
- `.env.development`, `.env.production`은 기본값과 플레이스홀더만 포함
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
## package.json 스크립트
|
|
379
|
+
|
|
380
|
+
```json
|
|
381
|
+
{
|
|
382
|
+
"scripts": {
|
|
383
|
+
"dev": "NODE_ENV=development tsx watch src/index.ts",
|
|
384
|
+
"build": "tsc",
|
|
385
|
+
"start": "NODE_ENV=production node dist/index.js",
|
|
386
|
+
"start:dev": "NODE_ENV=development node dist/index.js",
|
|
387
|
+
"typecheck": "tsc --noEmit"
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
### cross-env 사용 (Windows 호환)
|
|
393
|
+
|
|
394
|
+
```bash
|
|
395
|
+
npm install -D cross-env
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
```json
|
|
399
|
+
{
|
|
400
|
+
"scripts": {
|
|
401
|
+
"dev": "cross-env NODE_ENV=development tsx watch src/index.ts",
|
|
402
|
+
"start": "cross-env NODE_ENV=production node dist/index.js"
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
---
|
|
408
|
+
|
|
409
|
+
## 환경 변수 사용 예시
|
|
410
|
+
|
|
411
|
+
### 라우트에서 사용
|
|
412
|
+
|
|
413
|
+
```typescript
|
|
414
|
+
// src/routes/users.ts
|
|
415
|
+
import { Hono } from 'hono'
|
|
416
|
+
import type { HonoEnv } from '../types/hono'
|
|
417
|
+
import { env } from '../env'
|
|
418
|
+
|
|
419
|
+
const users = new Hono<HonoEnv>()
|
|
420
|
+
|
|
421
|
+
users.get('/', (c) => {
|
|
422
|
+
// 방법 1: env 모듈에서 직접 가져오기 (권장)
|
|
423
|
+
const dbUrl = env.DATABASE_URL
|
|
424
|
+
|
|
425
|
+
// 방법 2: context에서 가져오기
|
|
426
|
+
const nodeEnv = c.env.NODE_ENV
|
|
427
|
+
|
|
428
|
+
return c.json({ environment: nodeEnv })
|
|
429
|
+
})
|
|
430
|
+
|
|
431
|
+
export { users }
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
### 조건부 로직
|
|
435
|
+
|
|
436
|
+
```typescript
|
|
437
|
+
import { env } from '../env'
|
|
438
|
+
|
|
439
|
+
// 개발 환경에서만 실행
|
|
440
|
+
if (env.NODE_ENV === 'development') {
|
|
441
|
+
console.log('🔧 Development mode')
|
|
442
|
+
// 개발용 설정...
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
// 프로덕션에서만 실행
|
|
446
|
+
if (env.NODE_ENV === 'production') {
|
|
447
|
+
// 프로덕션 최적화...
|
|
448
|
+
}
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
---
|
|
452
|
+
|
|
453
|
+
## 관련 문서
|
|
454
|
+
|
|
455
|
+
- [Hono 개요](./index.md)
|
|
456
|
+
- [미들웨어](./middleware.md)
|
|
457
|
+
- [Zod 검증](./validation.md)
|
|
458
|
+
- [Cloudflare 배포](../deployment/cloudflare.md)
|
|
@@ -21,9 +21,6 @@ bun add hono
|
|
|
21
21
|
|
|
22
22
|
# yarn
|
|
23
23
|
yarn add hono
|
|
24
|
-
|
|
25
|
-
# pnpm
|
|
26
|
-
pnpm add hono
|
|
27
24
|
```
|
|
28
25
|
|
|
29
26
|
---
|
|
@@ -235,6 +232,7 @@ app.get('/me', (c) => {
|
|
|
235
232
|
|
|
236
233
|
## 관련 문서
|
|
237
234
|
|
|
235
|
+
- [환경 변수 설정](./env-setup.md) - .env.development, .env.production 설정 ⭐
|
|
238
236
|
- [미들웨어](./middleware.md)
|
|
239
237
|
- [Zod 검증](./validation.md)
|
|
240
238
|
- [에러 처리](./error-handling.md)
|