1
느린 근본원인 Top 3
① 홈(/) 자녀전환 워터폴 = 단일 최악.
app/page.tsx — getUser→children→meal_logs 순차 await + ingredients-light.json(45KB) 2회 fetch + meal_logs를 7·56·90일 3개 윈도 따로 풀스캔. 'use client'라 전부 브라우저에서 직렬.② care/page.tsx 무제한 meal_logs. 날짜 상한 없이 전체 이력 풀로드 + children 테이블 3~4회 따로 쿼리. 기록 쌓일수록 선형 증가.
③ 코치 크론 per-child 직렬 루프(장애 아님 — 50s 가드+라운드로빈 有, 자녀↑시 처리량 한계만).
2
P0 처방 — 구현·배포 완료
| P0 | 처방 | 파일 | 상태 |
|---|---|---|---|
| P0-1 | ingredients-light 중복 fetch 제거 + catMap 메모이즈 | app/page.tsx | 완료 |
| P0-2 | meal_logs 7·56·90일 3윈도 동시 발사(await 전 트리거) | app/page.tsx | 완료 |
| P0-3 | care meal_logs 365일 상한(다년 누적 차단·미래 식단표 유지) | app/care/page.tsx | 완료 |
| P0-4 | children 3쿼리→1 | — | 보류 컬럼 부재시 메인로드 실패 위험 = 의도된 안전패턴(홈도 분리). 미적용. |
| P0-5 | 정적 JSON 모듈스코프 1회 로더 신설·공용 | lib/staticData.ts (신규) · 홈·care·report | 완료 |
검증: tsc --noEmit 내 파일 0 에러 · next build 통과 · 코칭 세션 파일(coach*.ts·food-graph.json) 무변경.
3
P1 / P2 — 구현·배포 완료
⚠️ Next 16 핵심: cookies()를 읽는 페이지는 무조건 동적 → revalidate 무효. 그래서 ISR은 쿠키 안 읽는 공개 페이지만 적용.
| 항목 | 적용 |
|---|---|
| blog/[slug] | SSG+ISR ● 쿠키無 admin 클라(공개글 필터)+generateStaticParams+revalidate=1d. 빌드 확인 ● 1d 1y |
| recipe/[id] | getUser(쿠키)라 ISR 무효 → 중복쿼리 cache() dedup + getUser 병렬(force-dynamic 유지) |
| plan | composePlan(DB) unstable_cache 입력별 1h 캐시 |
| tips | allSeeds() 모듈 호이스팅(렌더마다 재계산 제거) |
| 홈(P2-2) | 코치편지 크론 fetch 5s AbortController 타임아웃 → 초과 시 어제 편지 즉시(30s 멈춤 제거) |
| admin(P2-1) | 보류 전부 auth 동적+모더레이션 실시간 필요 → ISR 무효·부적합 |
tsc 0에러 · next build 통과 · 코칭 세션 파일 무변경.
4
정적 데이터 전략 + 오탐 정정
| 데이터 | 처리 |
|---|---|
ingredients-light.json 45KB | HTTP Cache(next.config) 이미 有 + P0-5 모듈캐시로 중복·재파싱 제거 |
food-graph.json 156KB | 서버 lib import — graphSource.ts만 경유(클라 노출 금지·SQL 전환 단일 진입점). 신규 로더는 클라 /public 전용 |
오탐 정정: next.config Cache-Control 이미 있음 · health force-dynamic 정상 · NUTRI_MAP 이미 모듈상수 · 홈 Server Component 전환은 회귀위험 커 비권장.
5
안전수칙 — 코칭 세션 충돌 회피
코칭 세션이 같은 레포에서 활발히 작업(
①
food-graph.json·gen-food-graph.py·coach-data.test.ts·dietary4u 스크립트). 캐시 작업은 겹치는 파일 0 확인 후 진행했다.①
lib/coach*.ts·app/api/cron/coach 본문 로직 건드리지 않음 ② food-graph.json·graphSource.ts 수정 금지(데이터/코칭 소유) ③ 새 로더는 클라 /public JSON 전용 ④ 모든 변경 additive·폴백 보존.