2026-05-12
2026-05-12 작업 정리 (임시)
하루 동안 머지된 PR과 진단 결과 모음. M12 마일스톤 후반부 진행 + 캐시 일관성 핫픽스.
📦 머지된 PR (11건)
# | 종류 | 제목 | 변경 |
|---|---|---|---|
#44 | feat | T-122 회원가입 API에 학생 학년·반·학번 필드 반영 | BE signupSchema 확장 + FE 폼 (학교 외 단체는 student 옵션 자동 제외) |
#45 | feat | T-123 GET /users/me 응답에 소속 단체·학생 정보 포함 | userSelect에 organization nested + grade/classNo/studentCode |
#46 | feat | T-124 PUT /users/me/org 소속 단체 변경 API | tempToken 재사용, role=student × org_type≠school 거부, 학생 정보 초기화 + |
#47 | feat | T-125 SCR-005 프로필 화면 — 학생 정보·소속 변경 | ProfilePage 5개 서브컴포넌트(기본정보/소속/학생/연동코드 카드 + 변경/재입력 모달) |
#48 | chore | 샘플 학교 2곳 추가 (중·고등학교) | seed.ts SCHOOLS 배열화 |
#49 | feat | Organization에 NEIS 코드 컬럼 + 실제 학교 시드 | 시드 학교를 판곡초/평내중/평내고로 교체, atptCode=J10 |
#50 | feat | NEIS 메뉴 → 알레르기 키워드 사전 자동 보강 | AllergenKeyword 모델 + extract 스크립트 (광역 ATPT/단일 org/limit/offset/reset/dry-run) |
#51 | feat | T-126 학교 통계 API + User.gender 컬럼 | Gender enum, signup에 성별 추가, GET /analytics/school-stats (30분 캐시) |
#52 | feat | T-127 NEIS 학교 검색 공개 API | GET /neis/schools?q= (자동완성용, 30분 캐시) |
#53 | feat | T-128 학교별 메뉴 참고 단가 카탈로그 빌더 | MealPriceCatalog 모델 + 정적 단가 ~40종 + build 스크립트 + AI 어댑터 |
#54 | fix | 모든 mutation에서 analytics·meal 캐시 무효화 보완 | 9개 서비스 패치 + |
🗂️ 누적된 스키마 변경 (마이그레이션)
마이그레이션 | 내용 |
|---|---|
| Organization.atptCode, schoolCode (TEXT, nullable) |
| allergen_keywords 테이블 + FK(CASCADE) + unique(allergenId, keyword) |
| Gender enum (male/female) + User.gender |
| meal_price_catalog 테이블 + FK(CASCADE) + unique(orgId, keyword) |
🛠️ 신규 npm 스크립트
npm run extract-allergen-keywords -- [--atpt=J10] [--org=<id>] [--days=30] [--limit=<N>] [--offset=0] [--reset] [--dry-run]
npm run build-price-catalog -- [--org=<id>] [--months=12] [--reset] [--dry-run]
둘 다 NEIS schoolInfo + mealServiceDietInfo 호출 패턴
--org 생략 시 NEIS 코드 있는 모든 school 단체 순회
🚨 진단·해결한 이슈
1) 대체 메뉴 등록 후 화면 갱신 안 됨 — PR #54로 해결
원인: createAlternatePlan + 7~8개 mutation 서비스가 BE NodeCache(5분 TTL)를 무효화하지 않아 stale 응답 반환
패치: lib/cache.ts에 invalidateOrgAnalyticsCache(orgId) 헬퍼 추가 + 9개 서비스에서 호출
부수적으로 발견한 별개 버그도 같이 패치: createMealPlan(단건), saveGeneratedMealPlan(AI)에서 캐시 무효화 누락
2) Railway 응답 3.59초 — 사용자 작업 필요
원인 추정: Railway region ↔ Supabase region(ap-northeast-2) 미스매치 → 매 쿼리 RTT 100~300ms × 직렬 5~6쿼리
해결: Railway 같은 프로젝트 내 New Service로 asia-southeast1(Singapore) 신규 생성 → 변수 복사 → 도메인 전환 → 기존 삭제. DB 마이그레이션 불필요 (Supabase 그대로)
3) Supabase 무료 플랜 paused (반복 발생)
7일 비활성 시 자동 일시정지
6543/5432 포트는 TCP 응답하지만 Prisma 핸드셰이크 실패 (P1001)
해결: 대시보드 → Restore 클릭
4) NEIS mealServiceDietInfo 단가 필드 부재
T-128 spec의 "NEIS 응답 단가 필드"는 실제로 존재하지 않음
결과: KEYWORD_PRICES 정적 테이블이 사실상 단가의 메인 출처
컬럼명은 avgPrice로 두어 미래(영양사 입력·NEIS 정책 변경) 확장 여지 유지
5) NEIS 광역 호출 정책 확인
mealServiceDietInfo는 SD_SCHUL_CODE가 필수 (ATPT만으로는 ERROR-300)
우회: schoolInfo API로 ATPT 단위 학교 목록 → 학교별 mealServiceDietInfo 순회
6) 설문 자동 생성 — 이미 BE에 트리거 존재
alternate.service.confirmAlternatePlan → survey-hook.onAlternatePlanConfirmed 호출
need_check + menu_vote 2종 자동 생성
try/catch로 감싸여 silent fail. 영양사 없음·DB 다운 시 로그만 찍히고 confirm 응답은 성공
사용자 환경 Railway 로그에 [T-070] 설문 2단계 자동 생성 완료 메시지 확인됨 → 정상 동작 중
7) 대체 식단 등록 UX
BE는 (mealPlanId × targetAllergenId) 단위로 AlternateMealPlan 1건 생성. 한 식단에 알레르기 N종 포함 시 N번 생성·확정 필요
메뉴 단위가 아니라 알레르기 단위 분리라 "하나하나"라고 느껴짐
본 PR 범위 외 — 추후 UX 개선 작업 후보
8) Supabase paused 영향 — Prisma generate
Windows에서 ts-node-dev 서버가 query_engine DLL을 잠궈 prisma generate EPERM 발생
해결: backend dev 서버 종료 후 generate
⏳ 남은 작업
M12 잔여 (4건)
T-129 [BE] /meals/conditions/defaults — 한국인 영양섭취기준 + T-126 학교 분포 가중평균으로 기본값 (3 SP)
T-130 [BE] AI 식단 생성 입력 스키마 확장 — 동적 영양소·주 단위 검증·단가 제약 (5 SP, T-128 위에)
T-131 [FE] 영양사 대시보드 통합 — 수요집계와 합치고 학교 카드 추가 (5 SP)
T-132 [FE] AI 식단 생성 화면 재구성 — NEIS 학교 검색, 단가 입력, 영양소 동적 (5 SP)
운영 권장
Supabase 활성화 후 npx prisma migrate deploy && npx prisma db seed
npm run build-price-catalog -- --dry-run 검증 → --reset로 본 적재
npm run extract-allergen-keywords -- --reset 본 적재
Railway region 변경 — asia-southeast1로 새 서비스 생성·전환
frontend/.gitignore에 .vite 추가 (한 줄 패치)
후보 개선 (요청 시)
대체 식단 등록 UX: 한 식단의 여러 알레르기를 한 번에 묶어서 처리
설문 자동 생성 silent fail 보강: confirm 응답에 surveysCreated: boolean 메타 노출
KEYWORD_PRICES 학교별 보정 (DB 또는 영양사 입력)
tagging.service가 DB의 allergen_keywords도 합집합으로 사용 (자동 태깅 개선)
댓글
댓글이 없습니다.
