A+ Tracker PRD v0.1 (P0 Scope)
Scope
P0 (3개월 내 출시) 범위. 초등 1~6학년 한정. 5개 핵심 기능 — 학생 등록 / 학습지 자동 생성 / 학생 앱 답안 입력·채점 / 오답노트 / 월간 학부모 리포트.
Not Yet Decided
미해결 결정 (mathflat-clone-service-plan §11 Open Questions) 중 PRD 영향:
- 외주 강사 수학 정확성 검수 프로세스 (콘텐츠 풀 schema 영향)
- 학부모 결제 vs 원장 결제 (P1) — 데이터 모델 사전 분리 여부
1. 핵심 사용자 시나리오
1.1 Critical Path — “원장 첫 학습지 발송 (10분)“
| # | 단계 | 화면 | 데이터 변화 |
|---|---|---|---|
| 1 | 회원가입 (이메일 + SMS 인증) | /signup | Account 생성 |
| 2 | 공부방 정보 입력 (이름·주소) | /onboarding/academy | Academy 생성 |
| 3 | 학생 1명 등록 (이름·학년·학부모 번호) | /onboarding/student | Student, Parent 생성 + 6자리 학습 코드 발급 |
| 4 | 첫 학습지 만들기 (단원→난이도→문항수→자동 추천 12제→발송) | /worksheets/new | Worksheet + WorksheetItem×12 생성 |
| 5 | 학생에게 SMS로 학습 코드·앱 다운로드 링크 발송 | (백그라운드) | Notification 1건 |
1.2 학생 첫 풀이 (5분)
| # | 단계 | 화면 | 데이터 변화 |
|---|---|---|---|
| 1 | 앱 다운로드 + 전화번호 + 학습 코드 입력 | (앱) | Session 발급 |
| 2 | 홈 → “오늘 풀어야 할 학습지 1개” 클릭 | (앱) home | — |
| 3 | 12문항 답안 입력 (객관식 1탭) | (앱) worksheet/:id | Submission 생성 |
| 4 | 제출 → 즉시 정오답 + 정답률 표시 | (앱) result/:id | SubmissionItem×12, Submission.score 산출 |
1.3 학부모 월간 리포트 수신 (수동성)
| # | 단계 | 트리거 |
|---|---|---|
| 1 | 매월 1일 03:00 KST 배치 | Cron (Supabase Edge Function) |
| 2 | 학생별 정답률·단원 성취도 집계 | SQL → MonthlyReport 행 생성 |
| 3 | Claude Sonnet API 호출 (정량 데이터를 프롬프트에 주입, 자연어 코멘트 생성) | LLM call (학생 1명 ≈ 600 입력 토큰 / 300 출력) |
| 4 | 카카오 알림톡 + 앱 내 PDF 동시 발송 | 알림톡 템플릿 monthly-report-v1 |
2. 데이터 모델 (PostgreSQL 1차 안)
Account (원장 계정)
id, email, phone, password_hash, created_at
status: enum(active, suspended)
Academy (공부방 = 결제 단위)
id, owner_account_id → Account
name, address, business_registration_number?
plan: enum(free, starter, pro) ← P0은 모두 'free' (베타 무료, §10 결정 4)
student_count_cap: int
created_at
Student
id, academy_id → Academy
name, grade: enum(E1..E6, M1..M3) ← P0은 E1~E6만
current_unit_id → Unit (현재 진도)
learning_code: char(6) ← 6자리 영숫자 (예: M3K7Q2), 학원 내 unique
parent_phone: text
status: enum(active, paused, withdrawn)
Parent (학부모 — Student와 N:1)
id, student_id → Student
phone, name?
consent_alimtalk: boolean (카톡 수신 동의)
Unit (단원 마스터)
id, grade, subject (math), parent_unit_id?
name, order_index
level: int(1~3) ← 학년 / 대단원 / 소단원 (3뎁스, UX 결론 #4)
Question (문항 마스터)
id, unit_id → Unit
type: enum(multiple_choice, short_answer, descriptive)
difficulty: enum(low, mid, high)
body_md: text (LaTeX 포함 markdown)
choices: jsonb (객관식만)
answer: text (정답 — 객관식은 인덱스, 단답형은 정확 값)
source: enum(self_made, ai_variant, public_link) ← §10 결정 1·3
source_question_id?: int (AI 변형의 원본)
public_link_url?: text (외부 링크 보조 학습용)
created_by: text (제작자 식별)
reviewed_by: text? (검수자)
reviewed_at: timestamp?
Worksheet (학습지)
id, academy_id, created_by_account_id
title, target_unit_ids: int[]
difficulty_mix: jsonb e.g. {low: 4, mid: 6, high: 2}
question_count: int (P0 max 80, UX 결론 #5)
auto_grade: boolean
created_at
WorksheetItem (학습지 ↔ 문항 N:N)
id, worksheet_id, question_id, order_index
Assignment (학습지 발송 = 학생별 인스턴스)
id, worksheet_id, student_id
assigned_at, due_at?
status: enum(pending, in_progress, submitted, graded)
Submission
id, assignment_id, submitted_at
score: numeric (자동채점 ON일 때 즉시 계산)
graded_by: enum(auto, manual_qr, manual) ← UX 분석 §2.2 3경로
SubmissionItem
id, submission_id, question_id
student_answer: text
is_correct: boolean? (manual인 경우 nullable until graded)
manual_score?: numeric (서술형 부분점수)
handwriting_image_url?: text (필기·풀이 사진)
WrongAnswerSet (오답노트 — 자동 생성)
id, student_id
period: enum(weekly, monthly, exam_prep)
generated_at
question_ids: int[]
MonthlyReport
id, student_id, month: date
metrics: jsonb (단원별 정답률, 학습 시간, 출제 학습지 수)
ai_comment: text ← Claude Sonnet 생성, 발송 전 원장 검수 필수 (§10 결정)
reviewed_by_owner: boolean
sent_at: timestamp?
Notification
id, recipient_phone, channel: enum(sms, alimtalk, push)
template_id, payload: jsonb
status: enum(queued, sent, failed)
데이터 모델 결정 근거:
Question.sourceenum — §10 결정 1·3 직접 반영MonthlyReport.reviewed_by_owner— §10 결정 (정량은 템플릿, 정성은 AI + 원장 검수) 직접 반영Unit.level3뎁스 — UX 결론 #4 반영learning_code6자리 — 매쓰플랫 패턴 카피- 학년 enum에 M1~M3 미리 정의 — P1 중등 확장(§3.2) 사전 준비
3. 핵심 API 윤곽 (FastAPI)
POST /api/auth/signup 회원가입
POST /api/auth/login 로그인
POST /api/auth/sms-verify 학생 전화번호 + 학습 코드 인증
POST /api/academies 공부방 생성
GET /api/academies/me 내 공부방 정보
GET /api/students 학생 목록
POST /api/students 학생 등록
PATCH /api/students/:id 학생 정보 수정
GET /api/students/:id/report/monthly 학생 월간 리포트 조회
GET /api/units?grade=E3 단원 트리 조회 (3뎁스)
GET /api/questions?unit_id=...&difficulty=mid&limit=20 문제 추천
POST /api/worksheets 학습지 생성 (자동 추천 또는 수동)
GET /api/worksheets/:id 학습지 상세
POST /api/worksheets/:id/assign 학생들에게 발송 → Assignment N건 생성
GET /api/assignments?student_id=me 학생: 내 할 일
POST /api/assignments/:id/submit 학생: 답안 제출
GET /api/submissions/:id 제출 결과 조회
GET /api/wrong-answer-sets?student_id=... 오답노트 조회 (자동 생성된 최근 것)
POST /api/wrong-answer-sets/regenerate 강제 재생성
POST /api/reports/monthly/preview (원장) 월간 리포트 미리보기 + AI 코멘트
POST /api/reports/monthly/:id/send (원장) 검수 후 카카오 알림톡 발송 트리거
POST /api/llm/comment 내부 — Claude Sonnet 자연어 코멘트 생성
4. 화면 흐름 5종 (P0)
4.1 원장 — 학습지 만들기 화면 (가장 중요)
┌────────────────────────────────────────────┐
│ 학습지 만들기 │
├────────────────────────────────────────────┤
│ 1. 학년 [E1▼] 단원 [분수의 덧셈 ▼] │
│ 2. 난이도 비율 상 [▮▮ ] 중 [▮▮▮▮▮ ] 하 [▮▮▮ ] │
│ 3. 문항 수 [12] (1~80) │
│ 4. 자동채점 [ON ●] │
│ 5. ──────────────────────── │
│ 추천된 12문항 (편집 가능) │
│ ☰ 1. 1/2 + 1/3 = ? [난이도 중] │
│ ☰ 2. ... │
│ ☰ 3. ... │
│ [ + 문제 추가 ] [ ↻ 다른 문제로 새로고침 ] │
│ 6. ──────────────────────── │
│ [ 미리보기 PDF ] [ 학생에게 발송 ▶ ] │
└────────────────────────────────────────────┘
매쓰플랫 5뎁스 단원 트리 → 3뎁스 평면화 (UX 결론 #4). 첫 학습지 10분 내 발송 가능.
4.2 학생 앱 — 답안 입력 화면
[헤더] 분수의 덧셈 (12/12 풀이중) [⏸]
─────────────────────────────────────
문제 7. 다음을 계산하시오.
1/2 + 1/3 = ?
[ ① 1/5 ] [ ② 5/6 ]
[ ③ 2/5 ] [ ④ 1/6 ]
[ ⑤ 6/5 ]
[ 풀이 메모 ✏️ ] [ 다음 ▶ ]
─────────────────────────────────────
●●●●●●○ ░░░░░ 진행률 7/12
객관식 1탭 입력. 풀이 메모는 옵션 (스타일러스 또는 사진 업로드).
4.3 학생 앱 — 오답노트 화면
[탭] 학습지 │ 오답노트 │ 기록 │ MY
─────────────────────────────────
오답노트 — 최근 30일
📝 분수의 덧셈 (오답 4문제)
[ 다시 풀기 ]
📝 도형의 둘레 (오답 2문제)
[ 다시 풀기 ]
📝 시험대비 모아보기 (오답 8문제)
[ 다시 풀기 ]
매쓰플랫 패턴 카피 — 자동 생성, 학생은 “다시 풀기” 1탭.
4.4 원장 — 월간 리포트 검수 화면
[학생: 김초희] 2026년 4월 리포트
─────────────────────────────────
[정량 — 자동]
- 학습지 출제: 8건
- 평균 정답률: 78%
- 단원별: 분수 65% 🟡 / 도형 92% 🟢 / 측정 60% 🔴
- 출결: 16/16 (100%)
[AI 코멘트 — Claude Sonnet 생성] ✏️ [ 수정 ]
─────────────────────────────────
초희가 이번 달은 도형 단원에서 강한 모습을 보였습니다.
다만 분수와 측정 단원에서는 ...
[ 발송 취소 ] [ ✓ 검수 완료 → 학부모에게 발송 ]
원장 검수 게이트 = §10 결정 (정량은 템플릿, 정성은 AI + 검수)을 화면으로 강제.
4.5 학부모 — 알림톡 수신 (앱 외부)
[카카오 알림톡]
[A+ Tracker by 미경]
초희 학부모님께
2026년 4월 학업 보고서가 도착했습니다.
📊 평균 정답률 78% (전월 대비 +5%)
✅ 출결 100%
[ 자세히 보기 → 앱 ]
5. P0 비기능 요건
| 항목 | 목표치 |
|---|---|
| 동시 사용자 (선생님) | 100 (베타 100곳) |
| 학습지 생성 응답 시간 | < 3초 (12문항 추천 + DB 생성) |
| AI 리포트 생성 시간 | < 30초 / 학생 1명 |
| AI 리포트 환각률 (사실 오류) | < 1% (원장 검수 통과 기준) |
| 알림톡 발송 성공률 | ≥ 99% (실패는 SMS fallback) |
| 모바일 앱 로그인 | < 5초 (인증 + 학원 매칭) |
6. 의도적 미구현 (P0)
| 매쓰플랫 보유 기능 | P0 미구현 사유 | 도입 시점 |
|---|---|---|
| QR 종이 학습지 | 카메라 스캔 라이브러리 시간 부족 | P1 |
| 출결 키오스크 모드 | 통합 출결로 시작 | P1 |
| 풀이 동영상 | 콘텐츠 제작비 (§10 결정) | 미정 (외부 큐레이션 대체) |
| 전국 석차 | 데이터 부족 (UX §5) | 데이터 충분해질 때까지 (P3+) |
| 중·고등 콘텐츠 | P1으로 분리 (§10 결정 2) | P1 (중1~중3) / 고등은 미정 |
| 학습지 150문항 상한 | 초기 부하 안전선 80 | P2에서 상향 |
7. 외부 의존성
| 서비스 | 용도 | 위험 |
|---|---|---|
| Anthropic Claude API | 리포트 자연어 코멘트, 채점 보조 | API rate limit, 비용 (단위 경제 모델 §5 참고) |
| 카카오 비즈메시지 (NHN Toast) | 학부모 알림톡 | 템플릿 사전 승인 (영업일 7~14일), 발신프로필 등록 |
| 토스페이먼츠 | (P1) 정기결제 | P0은 베타 무료라 미사용 |
| Supabase | DB + Auth + Edge Functions + Storage | 한국 리전 부재 (Singapore) — latency 50ms+ |
| Vercel | 선생님 웹 hosting | 무료 hobby tier 기준 P0 OK |
| EAS (Expo) | 학생/학부모 앱 빌드·배포 | iOS App Review 평균 2~3일 |
8. 다음 단계 (PRD v0.2 → v1.0)
- 외주 강사 검수 프로세스 PRD 추가 (§11 Open Q 입력)
- 학부모 결제 흐름 사전 데이터 모델 분리 검토 (P1 영향)
- 베타 가입 페이지 와이어프레임 (GTM 연계)
- 알림톡 템플릿 5종 사전 작성 + 사전 승인 신청
- 단원 트리 마스터 데이터 시드 (E1~E6 단원 ~120개)
- AI 변형 1제→3제 프롬프트 엔지니어링 + 검수 자동화 워크플로우