ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
기출을 사상가, 개념, 원전 단위로 연결해서 공부하는 개인 학습 사이트
Translation pending
EducationTypeScript · PLpgSQLGitHub @davidjun315-syOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗윤리 임용고시(중등 도덕·윤리) 기출 데이터베이스 + AI 기출 분석기 + 개인 학습 사이트입니다.
기출 PDF 를 올리면 페이지를 렌더링하고, 2단 편집을 고려해 문항을 자동으로 나누고, 문항마다 AI 가 사상가·개념·원전·정답·답안 포인트를 구조화된 JSON 으로 분석합니다. 분석 결과는 사상가별 / 개념별 / 원전별로 연결되어 쌓이고, 출제 경향 통계와 유사 기출 찾기에 쓰입니다.
/admin (관리자 비밀번호) 에서만 가능합니다.상업 서비스가 아닌 개인 학습용 사이트입니다. AI 분석은 틀릴 수 있으므로 원전·공식 자료로 확인하세요.
| 영역 | 기능 |
|---|---|
| 기출문제 | 학년도 / 전공 A·B 별 시험, 문항 카드(문항 번호·사상가·핵심 개념·정답·난이도·확신도) |
| 문항 상세 | 좌: 원본 문항 이미지 / 우: AI 분석. 탭 — 문제 분석·사상가·개념·원전·답안·관련 기출·내 메모 |
| 문제 풀이 모드 | 기본으로 정답·해설을 숨김. 정답 보기 / AI 분석 보기 / 원전 보기 를 따로 열 수 있음 |
| 내 답안 + AI 채점 | 핵심 개념 정확성, 필수 키워드 포함 여부, 완성도, 틀린 표현, 빠진 내용, 수정할 표현, 예상 답안 |
| 사상가 | 학파·시대·핵심 사상·주요 개념·주요 원전·관련 기출·출제 횟수·최근 출제 연도·함께 비교되는 사상가·결정적 표현 |
| 사상가 비교 | 인간관·본성론·도덕 원리·수양론·정치관·핵심 개념·대표 원전·구별 표현·관련 기출 (생성 결과는 DB 에 캐시) |
| 개념 / 원전 | 정의·관련 사상가·관련 원전·관련 기출·유사/혼동 개념 / 원전 핵심 내용·출제된 문장·원문·번역문 |
| 출제분석 | 연도별 사상가 빈도(히트맵), 사상가·개념·원전별 횟수, 영역 비율, 최근 5년, 반복 출제 개념, 오래 안 나온 사상가, 전공 A/B 비교 |
| 통합검색 | 사상가·개념·원전·문제 텍스트·연도·정답 해설을 한 화면에 |
| 내 학습 기록 | 푼 문제·북마크·오답·다시 볼 문제·학습 완료·메모 (브라우저별 저장, JSON 내보내기/가져오기) |
| 관리자 | PDF 업로드(클릭/드래그, 미리보기, 파일명·크기·페이지 수), 중복 PDF 차단(SHA-256), 시험 등록·수정·삭제, 페이지 분석, 문항 수정·영역 수정·합치기·나누기·삭제, AI 분석 / 부분 재분석, 분석·사상가·개념·원전 수정, 원전 원문·번역문 DB 입력 |
confirmed/likely/candidate/unknown), 확신도검토 필요prompts/shared-rules.ts): 모르면 모른다고, 추정과 확인 구분, 장·절 지어내지 않기, 복수 사상가 고려, 애매하면 검토 필요, 해석이 갈리면 단정 금지confirmed 라고 답해도 원전 DB 와 대조되지 않았으면 서버가 likely 로 낮춰 저장is_manual=true 로 저장되어 재분석해도 지워지지 않음ai_original)과 관리자 수정 결과(edited_fields)를 분리 저장PDF 업로드 (브라우저)
→ SHA-256 계산 → 중복 확인 → 시험 등록 → Storage(exam-pdfs) 에 직접 업로드 (signed URL)
→ [브라우저] pdf.js 로 페이지 렌더링 → 페이지 이미지 생성 → 텍스트 레이어 추출
→ 레이아웃 분석(머리말/꼬리말 제거, 2단 편집 단 구분선 탐지, 줄 묶기)
→ 문항 번호 탐지(왼쪽 여백 + 번호 연속성) → 문항 영역 분리(여러 단/페이지 걸침 지원)
→ 문항 이미지 생성 → Storage(question-images) 업로드 → DB 저장
→ [서버] 문항 단위 AI 분석 (Claude 또는 OpenAI, 이미지 + 텍스트)
→ 사상가·개념·원전 관계형 저장 → 사상가/개념/원전/출제분석 화면
transcribedText)을 채웁니다. 관리자 화면에서 문항을 나누면 됩니다.Next.js 16 (App Router) · React 19 · TypeScript · Tailwind CSS 4 · Supabase (Postgres + Storage) · Zod · pdf.js · Anthropic SDK
ethics-exam-study/
├─ prompts/ AI 프롬프트 (코드와 분리)
│ ├─ shared-rules.ts 공통 환각 방지 규칙
│ ├─ question-analysis.ts 문항 분석 / 부분 재분석
│ ├─ source-analysis.ts 원전 분석
│ ├─ answer-grading.ts 답안 채점
│ └─ philosopher-comparison.ts 사상가 비교
├─ supabase/schema.sql DB 스키마 + RLS + Storage 버킷
├─ scripts/
│ ├─ copy-pdf-worker.mjs pdf.js worker/cMap 을 public/pdfjs 로 복사 (postinstall)
│ └─ test-segment.ts 문항 자동 분리 테스트 (npm run test:segment -- file.pdf)
└─ src/
├─ proxy.ts /admin 접근 시 세션 확인 (Next 16 의 middleware)
├─ app/
│ ├─ page.tsx 홈 대시보드
│ ├─ exams/ questions/ philosophers/ concepts/ sources/ trends/ search/ my/
│ ├─ admin/ 관리자 (login, upload, exams/[id], questions/[id], data)
│ └─ api/
│ ├─ admin/... 관리자 API (모두 서버에서 세션 검증)
│ ├─ grade/ AI 채점 (공개, IP 별 횟수 제한)
│ └─ compare/ 사상가 비교 (공개, 결과 캐시)
├─ components/ UI (study/, admin/, ui/)
└─ lib/
├─ ai/provider.ts 공통 AI interface + provider 선택
├─ ai/anthropic.ts Claude 구현
├─ ai/openai.ts OpenAI 구현
├─ ai/schemas.ts AI 응답 Zod 스키마
├─ pdf/segment.ts 레이아웃 분석 + 문항 분리 (순수 함수)
├─ pdf/extract.ts pdf.js 텍스트 좌표 추출
├─ pdf/browser.ts 렌더링 / 크롭 (브라우저)
├─ data/queries.ts 조회
├─ data/analysis.ts AI 분석 실행 + 저장
├─ data/related.ts 유사 기출 (태그 기반, embedding 확장 가능)
├─ local-study.ts localStorage 학습 기록
└─ auth.ts 관리자 세션 (HMAC 서명 httpOnly cookie)
| 테이블 | 내용 |
|---|---|
exams | 시험 (학년도, 시험명, 과목, 전공 A/B, 비고, PDF URL, pdf_hash(SHA-256, unique), 페이지 수) |
exam_pages | 페이지 이미지, 텍스트 레이어, 스캔 여부 |
questions | 문항 (번호, 하위 문항 번호, 상위 문항, 페이지, 영역 regions(jsonb), 원문, 이미지, 배점, 유형) |
question_analysis | 분석 (영역, 난이도, 정답, 해설, 키워드, 상세 details, 확신도 5종, 상태, ai_original, edited_fields) |
philosophers / concepts / sources | 마스터 데이터 (별칭 aliases 포함) |
source_passages | 원전 원문 / 번역문 / 출처 / 권·장·페이지 / 관련 개념 |
question_philosophers | 문항 ↔ 사상가 (역할, 확신도, 판별 근거) |
question_concepts | 문항 ↔ 개념 |
question_sources | 문항 ↔ 원전 (위치, 확인 수준, 확신도, 출제된 문장) |
concept_philosophers | 개념 ↔ 사상가 |
analysis_runs | AI 호출 기록 (범위, 모델, 토큰, 원본 응답, 오류) |
philosopher_comparisons | 사상가 비교 캐시 |
philosopher_notes | 사상가 개념 정리 노트 (채팅 AI 정리 결과, 기준 문항, 출처, 직접 수정 여부) |
quiz_items | 윤리 퀴즈 문제은행 (기출 세부 문제 · AI 예상 문제). 원본 문항 id + 요구 사항 레이블로 연결, 해설은 분석을 그때그때 읽음 |
quiz_progress / quiz_attempts | 문제별 숙련도·복습 일정 / 풀이 기록 (자동 채점 · 자기평가 구분) |
quiz_daily / quiz_profiles / quiz_settings / quiz_reports | 일일 미션 / XP·연속 학습·배지 / 미션 구성 / 오답 검수 요청 |
members | 회원 (아이디 · 닉네임 · scrypt 비밀번호 해시 · 정지 여부). 이메일 등 다른 개인정보는 받지 않음 |
study_memos | 내 메모 (공개 읽기 없음 — 관리자 로그인 상태에서 서버가 읽고 씀) |
node -v # v20.9 이상
npm -v
# GitHub 에 올린 뒤라면
git clone https://github.com/<내-아이디>/ethics-exam-study.git
cd ethics-exam-study
npm install
npm install 이 끝나면 postinstall 이 pdf.js worker 를 public/pdfjs/ 로 자동 복사합니다.
ethics-exam-study, 데이터베이스 비밀번호 입력, Region 은 Northeast Asia (Seoul) 권장NEXT_PUBLIC_SUPABASE_URLanon public key (또는 Publishable key) → NEXT_PUBLIC_SUPABASE_ANON_KEYservice_role secret key (또는 Secret key) → SUPABASE_SERVICE_ROLE_KEY (절대 공개 금지)supabase/schema.sql 내용을 전부 붙여넣고 Runexam-pdfs (public, PDF 전용, 100MB)question-images (public, 이미지 전용, 20MB)schema.sql 은 여러 번 실행해도 안전합니다(
if not exists). 스키마가 바뀌면 다시 실행하면 됩니다.버킷을 public 으로 두는 이유: 친구들이 로그인 없이 문항 이미지를 봐야 하고, AI API 가 이미지 URL 을 직접 읽어야 하기 때문입니다. 업로드는 서버가 발급한 signed URL 로만 가능합니다.
cp .env.example .env.local # Windows PowerShell: copy .env.example .env.local
.env.local 을 열어 채웁니다.
| 변수 | 필수 | 설명 |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL | ✅ | Supabase Project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY | ✅ | anon(public) key — 브라우저에 노출되어도 되는 키 |
SUPABASE_SERVICE_ROLE_KEY | ✅ | service_role key — 서버 전용 |
ADMIN_PASSWORD | ✅ | 관리자 비밀번호 |
ADMIN_SESSION_SECRET | 세션 서명 비밀값 (비우면 비밀번호에서 파생) | |
AI_PROVIDER | ✅ | anthropic 또는 openai |
AI_MODEL | 비우면 claude-opus-5-5 / gpt-5 | |
AI_EFFORT | Claude 사고 깊이 low~max, 기본 high | |
ANTHROPIC_API_KEY | AI_PROVIDER=anthropic 일 때 | |
OPENAI_API_KEY | AI_PROVIDER=openai 일 때 | |
PUBLIC_AI_GRADING | false 이면 AI 채점을 관리자만 사용 |
.env.local 은 .gitignore 에 들어 있어 GitHub 에 올라가지 않습니다. 실제 키를 .env.example 이나 코드에 적지 마세요.
.env.local 의 ADMIN_PASSWORD= 뒤에 길고 추측하기 어려운 비밀번호를 적습니다.ADMIN_SESSION_SECRET 을 바꾸면) 기존 로그인은 모두 풀립니다. 회원 로그인도 같은 비밀값으로 서명하므로 함께 풀립니다 — 회원이 있다면 ADMIN_SESSION_SECRET 을 따로 정해 두면 관리자 비밀번호를 바꿔도 회원은 로그아웃되지 않습니다..env.local
AI_PROVIDER=anthropic
AI_MODEL=claude-opus-5-5
ANTHROPIC_API_KEY=sk-ant-...
AI_MODEL=claude-sonnet-5-5 또는 AI_EFFORT=medium 으로 바꿀 수 있습니다. (정확도가 떨어질 수 있음)AI_PROVIDER=openai
AI_MODEL=gpt-5 # 사용 가능한 vision + JSON Schema 지원 모델
OPENAI_API_KEY=sk-...
API 키나 크레딧이 없어도, 이미 쓰고 있는 Claude · ChatGPT · Gemini 채팅 화면으로 분석할 수 있습니다.
분석 프롬프트 복사문항 이미지 열기로 이미지를 저장해 함께 첨부)json … )을 통째로 복사해 붙여넣고 검사하고 저장API 분석과 같은 규칙 · 같은 JSON 양식을 쓰고, 같은 Zod 검사를 거쳐 똑같이 저장됩니다. (빠진 항목은 기본값으로 채우고, 양식이 틀리면 어디가 틀렸는지 알려줍니다.) 단, 친구들이 쓰는 AI 채점은 API 키가 있어야 동작합니다.
개별 문항 — 공부 흐름: 출제 의도 → 개념 정리 → 문제 분석·답안 → 향후 출제
전체 기출 — 출제분석 메뉴의 세 탭
주희와 비교 2회 / 단독 1회, 미출제 주요 개념, 원전 미출제 부분)출제 예상은 과거 기출의 반복성과 출제 공백, 개념 분포 등을 기반으로 한 학습 우선순위 분석이며 실제 시험 출제를 보장하지 않습니다. 추천 점수는 확률이 아닙니다.
계층적 분석 구조 (전체 PDF 를 AI 에 다시 넣지 않음):
문항별 구조화 분석 → 사상가/개념/원전/연도별 집계(src/lib/trends/patterns.ts) → 예측 점수(src/lib/trends/scoring.ts) → 상위 15개 주제의 요약 데이터만 AI 에 전달 → 해석
비용: 패턴과 점수는 무료(계산). 결과는 prediction_runs 에 저장되어 페이지를 볼 때마다 다시 계산하거나 AI 를 부르지 않습니다. 시험·분석이 바뀌면 전체 분석 업데이트 필요 가 표시되고, 관리자가 전체 분석 업데이트 를 누를 때만 다시 계산합니다. AI 해석과 예상 문제는 API 또는 채팅 붙여넣기로 받을 수 있습니다.
supabase/migrations/002_deep_analysis_and_predictions.sql 실행 (또는 schema.sql 전체 다시 실행 — 둘 다 여러 번 실행해도 안전)심화 분석 (출제 의도·개념 정리·향후 출제) 또는 시험 화면의 재분석 메뉴 → 심화 분석 추가심화 분석만 선택 → 프롬프트 복사 / 붙여넣기
으로 새 항목만 추가합니다. (전체 재분석보다 저렴)출제분석 → 출제 예측 에서 전체 분석 업데이트 (계산)점검 스크립트: npm run test:trends (패턴·점수 계산을 합성 데이터로 검증)
문항 화면의 탭 순서: 답안 → 출제 의도 → 원문 해설 → 개념 정리 → 원전 → 향후 출제 → 관련 기출 → 내 메모
전체 로 다시 붙여넣으세요.study_memos)에 저장되어 휴대폰·다른 컴퓨터에서도 보입니다. 로그인은 7일 유지됩니다.내 학습 → 메모 모아보기 에서 섹터(동양윤리·서양윤리 …) → 사상가별로 모아 봅니다.서버로 옮기기 로 옮길 수 있습니다.supabase/migrations/004_answer_commentary_and_memos.sql 을 한 번 실행하세요.메뉴 윤리 퀴즈. 실제 기출을 답 하나 단위로 나눈 문제를 매일 풀고, 틀린 문제를 알맞은 때에 다시 푸는 반복 학습입니다.
src/lib/quiz/srs.ts)회원가입(아이디 + 비밀번호)하고 로그인하면 각자 기록(진도·복습 일정·XP·연속 학습·미션·내 메모)이 계정에 쌓여 어느 기기에서나 이어집니다. 회원 로그인 없이 관리자로만 들어오면 관리자 본인('owner') 기록입니다. 회원은 관리자 기능을 쓸 수 없습니다.supabase/migrations/006_members.sql 을 실행하세요.관리자 → 윤리 퀴즈 관리
문제은행 동기화 — 요구 사항별 해설이 있는 모든 기출을 나누고 향후 출제 예상 문제를 가져옵니다. 다시 눌러도 중복이 생기지 않습니다 (키: 원본 문항 + 요구 사항). 문항을 분석·수정하면 그 문항은 자동으로 반영됩니다.문제 검수 — 분리가 분명한 기출 세부 문제는 자동 공개(설정에서 끌 수 있음), 검수 사유가 있는 문제와 모든 예상 문제는 승인 대기. 미리보기·수정·승인·비공개·일괄 승인. 관리자가 고친 문제는 동기화가 덮어쓰지 않고 '원본 분석 변경됨'만 표시합니다.supabase/migrations/005_quiz.sql 을 한 번 실행하세요. 퀴즈 테이블에는 공개 읽기 정책이 없어 서버만 읽고 씁니다.점검 스크립트: npm run test:quiz
관리자 → 원문 텍스트 편집 (또는 시험 관리 화면의 같은 버튼). 시험을 고르면 그 시험의 모든 문항 텍스트를 원본 이미지 옆에서 한꺼번에 고칩니다.
다듬기 / 모두 다듬기: PDF 에서 생긴 문장 중간 줄바꿈을 잇고 (1)·(가)·○·발화자·<작성 방법> 단위로 단락을 나눕니다. 글자는 바꾸지 않으며, 저장하기 전까지는 반영되지 않습니다.퀴즈 N문제 · 조건 N줄 / 조건 줄을 못 찾음: ㉢ / <작성 방법> 없음.점검 스크립트: npm run test:tidy
사상가 페이지의 메인 탭 개념 정리 에 보이는 노트입니다. 사상가가 나온 기출 문항의 AI 분석을 모아 채팅 AI 에 맡기면, 사상의 논리적 순서(출발점 → 핵심 이론 → 실천 → 사회·정치 → 영향)대로 단원·개념을 재배열해 줍니다. API 키는 쓰지 않습니다.
사상가 페이지 편집 → 사상가 선택 (또는 사상가 페이지의 페이지 편집)개념 정리 프롬프트 복사 → Claude / ChatGPT / Gemini 채팅에 붙여넣기 → 받은 답 전체를 붙여넣고 검사하고 저장② 개념 정리 노트 수정 에서 단원·개념을 고치거나 순서를 바꾸고 저장 (JSON 직접 편집도 가능)한눈에 보는 구조 가 먼저 나오고, 그 아래에 단원별 본문이 이어집니다. 키워드를 누르면 해당 개념 본문으로 이동합니다. 구조도가 없는 예전 노트는 단원·개념에서 자동으로 만들어 보여 주며, 편집 화면의 키워드 구조도 에서 직접 고칠 수 있습니다.이후 N문항이 더 분석됨 이 표시됩니다. 다시 붙여넣으면 새 정리로 바뀝니다.기출 분석 모아보기 탭이 먼저 보입니다.supabase/migrations/003_philosopher_notes.sql 을 한 번 실행하세요. (여러 번 실행해도 안전)점검 스크립트: npm run test:notes
분석 안 된 문항 모두 분석 은 미분석 문항만)전체 재분석 / 정답만 / 사상가만 / 원전만 / 해설만philosopher_comparisons 에 저장되어 같은 비교는 다시 호출하지 않습니다.analysis_runs 테이블에서 볼 수 있습니다.PUBLIC_AI_GRADING=false.npm run dev
브라우저에서 http://localhost:3000 을 엽니다. 관리자는 http://localhost:3000/admin.
그 밖의 명령:
npm run build # 프로덕션 빌드 (배포 전 확인)
npm run start # 빌드 결과 실행
npm run lint # ESLint
npm run typecheck # TypeScript 검사
npm run test:segment -- ./기출.pdf # 문항 자동 분리 결과를 터미널에서 확인
/admin → 비밀번호 입력등록하고 문항 분리 시작
이미 등록된 시험입니다. 가 표시되고 기존 시험으로 이동할 수 있습니다.↓ 다음과 합치기영역 저장 + 문항 이미지 다시 만들기문항 직접 추가분석 안 된 문항 모두 분석 → 문항별로 AI 분석이 순서대로 실행됩니다.검토 필요 문항을 열어 사상가·개념·원전·정답을 확인하고 필요하면 수정, 상태를 검수 완료로 바꿉니다.원전만 재분석 때 AI 가 그 원문과 대조합니다.이 프로젝트 폴더는 이미 git 저장소이며 첫 commit 이 되어 있습니다.
gh auth login # 처음 한 번
cd ethics-exam-study
gh repo create ethics-exam-study --private --source=. --remote=origin --push
ethics-exam-study → Private 권장 → README 등은 추가하지 말고 Createcd ethics-exam-study
git branch -M main
git remote add origin https://github.com/<내-아이디>/ethics-exam-study.git
git push -u origin main
push 전에
git status로.env.local이 목록에 없는지 확인하세요. (.gitignore에 포함되어 있음)
ethics-exam-study Import.env.local 의 값을 하나씩 추가합니다.
(NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_ANON_KEY, SUPABASE_SERVICE_ROLE_KEY, ADMIN_PASSWORD, AI_PROVIDER, AI_MODEL, ANTHROPIC_API_KEY 등)NEXT_PUBLIC_* 값은 빌드 시점에 들어가므로 반드시 재배포하세요.참고
maxDuration). Vercel Hobby 플랜의 Fluid Compute 기본값으로 동작합니다. 시간 초과가 나면 Vercel 프로젝트 Settings → Functions 에서 최대 실행 시간을 확인하세요.robots: noindex) 설정되어 있습니다.| 증상 | 원인 / 해결 |
|---|---|
| 화면에 "Supabase 연결 설정이 필요합니다" | .env.local 의 Supabase 값 누락. 저장 후 npm run dev 재시작 |
| "relation ... does not exist" / 데이터를 불러오지 못함 | supabase/schema.sql 을 SQL Editor 에서 실행하지 않았음 |
| "Storage 업로드 URL 발급 실패" / "Bucket not found" | Storage 버킷 exam-pdfs, question-images 가 없음 → 6번 참고 |
| 관리자 로그인 시 "ADMIN_PASSWORD 환경변수가 설정되지 않았습니다" | .env.local 또는 Vercel 환경변수에 ADMIN_PASSWORD 추가 후 재시작/재배포 |
| 로그인했는데 계속 로그인 화면으로 돌아감 | 배포 환경이 https 가 아님(쿠키 Secure). Vercel 주소(https)로 접속 |
| AI 분석 시 "ANTHROPIC_API_KEY 가 설정되지 않았습니다" | 키 입력 후 재시작. AI_PROVIDER 철자 확인 |
| AI 분석 시 401 / 403 | API 키가 틀렸거나 결제 수단 미등록 |
| AI 분석 시 429 | 호출 한도 초과. 잠시 후 다시 시도 |
| AI 가 이미지를 못 읽음 | 버킷이 public 이 아님 → Storage 에서 public 으로 변경 |
| 문항 이미지가 안 바뀜 | 브라우저 캐시. 새로고침(Ctrl+Shift+R) |
| 문항 번호를 못 찾음 / 이상하게 나뉨 | 번호 형식이 특이한 PDF. 관리자 화면에서 합치기/나누기/직접 추가. npm run test:segment -- 파일.pdf 로 결과 확인 |
| 박스·말풍선 제시문 글이 텍스트에 빠짐 | 그 부분이 PDF 안에 그림으로 들어 있는 경우입니다. 문항 수정 화면의 현재 영역 기준으로 텍스트 다시 추출이 그림 부분만 자동으로 OCR(브라우저, 무료)해서 채웁니다. 전체를 OCR 로 읽으려면 OCR 로 다시 읽기. ㉠·○ 같은 기호는 OCR 이 틀릴 수 있으니 확인하세요 |
| 스캔 PDF | 텍스트가 없으므로 페이지 단위로 임시 문항이 생깁니다. 문항을 나눈 뒤 AI 분석 → AI 가 이미지에서 원문을 읽어 채웁니다 |
npm install 후 PDF 미리보기 오류 (worker) | node scripts/copy-pdf-worker.mjs 를 직접 실행해 public/pdfjs/ 생성 |
| Vercel 빌드 실패 | 로컬에서 npm run build 가 되는지 먼저 확인. Node 버전 20 이상인지 확인 |
SUPABASE_SERVICE_ROLE_KEY, ADMIN_PASSWORD 는 서버 코드(server-only)에서만 읽습니다. 브라우저 번들에 들어가는 값은 NEXT_PUBLIC_* 두 개뿐입니다.requireAdmin() 으로 서버에서 세션을 다시 검증합니다. src/proxy.ts 는 화면 접근용 1차 확인입니다.supabase/schema.sql 의 question_embeddings 주석을 풀고, src/lib/data/related.ts 에 cosine 유사도 점수를 더하면 됩니다.src/lib/ai/provider.ts 의 BaseProvider 를 상속해 generate() 하나만 구현하면 됩니다.prompts/ 폴더만 고치면 됩니다.processExamPdf() 에 추가할 수 있습니다.