Skip to content

Commit 0a2bc4f

Browse files
jammy0903claude
andcommitted
fix(ai): Increase Ollama timeout from 30s to 90s for model loading
- Problem: qwen2.5-coder:1.5b takes ~70s to load from disk - Solution: Increase timeout to 90s to accommodate model loading time - Recommendation: Keep model in memory with 'keep_alive: -1' for instant responses Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
1 parent 78613ad commit 0a2bc4f

32 files changed

Lines changed: 3387 additions & 575 deletions

deployment-check.sh

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#!/bin/bash
2+
3+
echo "🔍 CodeInsight Deployment Health Check"
4+
echo "========================================"
5+
echo ""
6+
7+
# Backend URL (수정 필요!)
8+
BACKEND_URL="https://codeinsight-backend.onrender.com"
9+
10+
# Frontend URL (수정 필요!)
11+
FRONTEND_URL="https://code-insight.vercel.app"
12+
13+
echo "📍 Backend URL: $BACKEND_URL"
14+
echo "📍 Frontend URL: $FRONTEND_URL"
15+
echo ""
16+
17+
# Backend Health Check
18+
echo "🏥 Checking backend health..."
19+
if curl -f -s "$BACKEND_URL/health" > /dev/null 2>&1; then
20+
echo "✅ Backend is healthy!"
21+
curl -s "$BACKEND_URL/health" | jq '.' 2>/dev/null || curl -s "$BACKEND_URL/health"
22+
else
23+
echo "❌ Backend health check failed!"
24+
echo "💡 Tip: Backend might still be deploying (first deploy takes 10-15 minutes)"
25+
fi
26+
27+
echo ""
28+
echo "🌐 Checking frontend..."
29+
if curl -f -s -o /dev/null "$FRONTEND_URL"; then
30+
echo "✅ Frontend is accessible!"
31+
else
32+
echo "❌ Frontend is not accessible!"
33+
echo "💡 Tip: Check Vercel deployment logs"
34+
fi
35+
36+
echo ""
37+
echo "✅ Deployment check complete!"
38+
echo "🔗 Open in browser:"
39+
echo " Frontend: $FRONTEND_URL"
40+
echo " Backend: $BACKEND_URL/health"

packages/backend/prisma/content/javascript/curriculum.json

Lines changed: 246 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,23 @@
2424
{
2525
"name": "Runtime Model",
2626
"description": "JavaScript 실행 환경 이해",
27-
"chapters": [1]
27+
"chapters": [
28+
1
29+
]
2830
},
2931
{
3032
"name": "Async Programming",
3133
"description": "비동기 프로그래밍의 핵심",
32-
"chapters": [2]
34+
"chapters": [
35+
2
36+
]
3337
},
3438
{
3539
"name": "Scope & Closure",
3640
"description": "스코프와 클로저 깊이 이해",
37-
"chapters": [3]
41+
"chapters": [
42+
3
43+
]
3844
}
3945
],
4046
"chapters": [
@@ -165,6 +171,242 @@
165171
"estimatedTime": 10
166172
}
167173
]
174+
},
175+
{
176+
"id": "js-4",
177+
"order": 4,
178+
"title": "비동기 패턴 (Async Patterns)",
179+
"description": "콜백, Promise, Async/Await의 진화 과정과 에러 핸들링",
180+
"keyQuestion": "왜 Promise는 콜백 지옥의 해결책일까?",
181+
"part": "async",
182+
"partLabel": "비동기/패턴",
183+
"misconceptions": [
184+
"비동기 함수는 병렬로 실행된다"
185+
],
186+
"lessons": [
187+
{
188+
"id": "js-4-1",
189+
"order": 1,
190+
"title": "콜백 패턴과 한계",
191+
"description": "콜백 지옥과 제어권 역전 문제",
192+
"difficulty": "basic",
193+
"estimatedTime": 10
194+
},
195+
{
196+
"id": "js-4-2",
197+
"order": 2,
198+
"title": "Promise 기초",
199+
"description": "Promise 체이닝과 상태 관리",
200+
"difficulty": "intermediate",
201+
"estimatedTime": 15
202+
},
203+
{
204+
"id": "js-4-3",
205+
"order": 3,
206+
"title": "Async/Await",
207+
"description": "동기 코드처럼 작성하는 비동기 로직",
208+
"difficulty": "intermediate",
209+
"estimatedTime": 12
210+
},
211+
{
212+
"id": "js-4-4",
213+
"order": 4,
214+
"title": "비동기 에러 핸들링",
215+
"description": "try-catch와 .catch()의 올바른 사용",
216+
"difficulty": "intermediate",
217+
"estimatedTime": 10
218+
}
219+
]
220+
},
221+
{
222+
"id": "js-5",
223+
"order": 5,
224+
"title": "메모리와 불변성",
225+
"description": "자바스크립트의 메모리 관리와 불변성 패턴",
226+
"keyQuestion": "const로 선언한 객체는 왜 수정할 수 있을까?",
227+
"part": "memory",
228+
"partLabel": "메모리",
229+
"misconceptions": [
230+
"모든 변수는 스택에 저장된다"
231+
],
232+
"lessons": [
233+
{
234+
"id": "js-5-1",
235+
"order": 1,
236+
"title": "원시타입 vs 참조타입",
237+
"description": "Stack과 Heap의 메모리 할당 차이",
238+
"difficulty": "basic",
239+
"estimatedTime": 10
240+
},
241+
{
242+
"id": "js-5-2",
243+
"order": 2,
244+
"title": "얕은 복사와 깊은 복사",
245+
"description": "객체 복사의 함정과 해결책",
246+
"difficulty": "intermediate",
247+
"estimatedTime": 12
248+
},
249+
{
250+
"id": "js-5-3",
251+
"order": 3,
252+
"title": "불변성 패턴",
253+
"description": "불변성이 리액트와 상태관리에 중요한 이유",
254+
"difficulty": "advanced",
255+
"estimatedTime": 15
256+
}
257+
]
258+
},
259+
{
260+
"id": "js-6",
261+
"order": 6,
262+
"title": "프로토타입과 클래스",
263+
"description": "자바스크립트의 상속 모델인 프로토타입 완벽 해부",
264+
"keyQuestion": "클래스는 프로토타입의 문법 설탕일까?",
265+
"part": "prototype",
266+
"partLabel": "객체지향",
267+
"misconceptions": [
268+
"JS 클래스는 Java 클래스와 같다"
269+
],
270+
"lessons": [
271+
{
272+
"id": "js-6-1",
273+
"order": 1,
274+
"title": "프로토타입 체인",
275+
"description": "[[Prototype]] 링크와 속성 탐색",
276+
"difficulty": "intermediate",
277+
"estimatedTime": 15
278+
},
279+
{
280+
"id": "js-6-2",
281+
"order": 2,
282+
"title": "생성자 함수",
283+
"description": "new 키워드의 내부 동작 원리",
284+
"difficulty": "intermediate",
285+
"estimatedTime": 12
286+
},
287+
{
288+
"id": "js-6-3",
289+
"order": 3,
290+
"title": "ES6 클래스",
291+
"description": "class 키워드와 extends의 실체",
292+
"difficulty": "intermediate",
293+
"estimatedTime": 10
294+
}
295+
]
296+
},
297+
{
298+
"id": "js-7",
299+
"order": 7,
300+
"title": "V8 엔진 심화",
301+
"description": "자바스크립트 엔진 내부의 최적화 원리",
302+
"keyQuestion": "왜 객체의 속성 순서를 지키는 것이 성능에 좋을까?",
303+
"part": "internal",
304+
"partLabel": "엔진심화",
305+
"misconceptions": [
306+
"JS 객체는 해시맵이다"
307+
],
308+
"lessons": [
309+
{
310+
"id": "js-7-1",
311+
"order": 1,
312+
"title": "히든 클래스 (Shapes)",
313+
"description": "객체 속성 접근 속도를 높이는 V8의 마법",
314+
"difficulty": "advanced",
315+
"estimatedTime": 20
316+
},
317+
{
318+
"id": "js-7-2",
319+
"order": 2,
320+
"title": "V8 메모리 구조",
321+
"description": "Young/Old Generation과 가비지 컬렉션",
322+
"difficulty": "advanced",
323+
"estimatedTime": 15
324+
},
325+
{
326+
"id": "js-7-3",
327+
"order": 3,
328+
"title": "최적화 킬러",
329+
"description": "Deoptimization을 유발하는 코드 패턴",
330+
"difficulty": "expert",
331+
"estimatedTime": 15
332+
}
333+
]
334+
},
335+
{
336+
"id": "js-8",
337+
"order": 8,
338+
"title": "렌더링 성능 최적화",
339+
"description": "브라우저 렌더링 파이프라인과 프레임 예산",
340+
"keyQuestion": "애니메이션이 버벅이는 진짜 이유는?",
341+
"part": "perf",
342+
"partLabel": "성능",
343+
"misconceptions": [
344+
"setTimeout은 정확하다"
345+
],
346+
"lessons": [
347+
{
348+
"id": "js-8-1",
349+
"order": 1,
350+
"title": "렌더링 파이프라인",
351+
"description": "JS가 픽셀이 되기까지의 과정",
352+
"difficulty": "advanced",
353+
"estimatedTime": 15
354+
},
355+
{
356+
"id": "js-8-2",
357+
"order": 2,
358+
"title": "rAF vs setTimeout",
359+
"description": "프레임 예산(16.6ms)과 동기화",
360+
"difficulty": "advanced",
361+
"estimatedTime": 12
362+
},
363+
{
364+
"id": "js-8-3",
365+
"order": 3,
366+
"title": "태스크 스플리팅",
367+
"description": "Long Task 쪼개기와 Yielding",
368+
"difficulty": "expert",
369+
"estimatedTime": 15
370+
}
371+
]
372+
},
373+
{
374+
"id": "js-9",
375+
"order": 9,
376+
"title": "메타프로그래밍",
377+
"description": "언어의 기본 동작을 재정의하는 고급 기능",
378+
"keyQuestion": "라이브러리는 어떻게 변수 변경을 감지할까?",
379+
"part": "meta",
380+
"partLabel": "메타",
381+
"misconceptions": [
382+
"Proxy는 원본을 복사한다"
383+
],
384+
"lessons": [
385+
{
386+
"id": "js-9-1",
387+
"order": 1,
388+
"title": "Proxy와 Reflect",
389+
"description": "객체 조작 가로채기 (Traps)",
390+
"difficulty": "expert",
391+
"estimatedTime": 15
392+
},
393+
{
394+
"id": "js-9-2",
395+
"order": 2,
396+
"title": "제너레이터",
397+
"description": "함수의 일시 정지와 재개",
398+
"difficulty": "advanced",
399+
"estimatedTime": 12
400+
},
401+
{
402+
"id": "js-9-3",
403+
"order": 3,
404+
"title": "WeakMap과 메모리",
405+
"description": "약한 참조와 메모리 누수 방지",
406+
"difficulty": "expert",
407+
"estimatedTime": 10
408+
}
409+
]
168410
}
169411
]
170-
}
412+
}

0 commit comments

Comments
 (0)