reloop 59da6a3578 feat: 과목 삭제 기능 — 연관 데이터 트랜잭션 정리
- backend: subjects.service.remove()를 트랜잭션으로 변경
  (reviewSchedule → studyLog → skillSnapshot → subject 순서 삭제)
- frontend: 과목 카드에 삭제 버튼 + 확인 다이얼로그 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-19 16:19:35 +09:00

ReLoop v2

잊기 전에 다시 만나는 학습법. 에빙하우스 망각곡선 + SM-2 알고리즘으로 개인화된 복습 간격을 자동 계산하는 수학 학습 플랫폼.

핵심 기능

기능 설명
적응형 복습 스케줄링 4가지 학습자 페르소나 + 3단계 자기평가로 최적의 복습 시점을 자동 계산
복습 캘린더 월간 달력에서 날짜별 복습 현황 확인, 밀린 복습 자동 이월
KICE 기출 문제집 수능/모의고사 수학 92문항, PDF 자동 크롭 이미지 제공
PDF 문제 분리 모의고사 PDF 업로드 → 텍스트 파싱으로 문제 단위 분리 → 태그 배정 → 복습 큐 등록
모의고사 모드 타이머 + OMR 답안 선택 + 자동 채점 + 학습 기록 일괄 생성
3단계 자기평가 어려움/보통/쉬움 → SM-2 기반 간격 배정 (hard=1일, easy=점점 벌어짐)
필기모드 Canvas 오버레이, 펜 3색, 문제별 localStorage 저장
B2B QR 등록 종이 문제집 QR 코드 → 앱 ebook 자동 등록
학교/학원 관리 학급 생성, 과제 배정, 학생별 리포트
통계 대시보드 단원별 정답률, 숙련도 성장 곡선, 주간 트렌드

알고리즘

ReLoop은 두 가지 복습 경로를 제공합니다.

1. 페르소나 망각곡선 (기본)

S(t) = S₀ × exp(-λ × t)          실력 감쇄
P    = sigmoid(k × (S(t) - D))   정답 확률

정답 확률 P가 기준(P_threshold) 아래로 떨어지는 시점을 다음 복습일로 설정합니다.

페르소나 λ (망각속도) 간격 배율 설명
상위권 (senior) 0.1 ×1.3 느린 망각, 넓은 복습 간격
중위권 (mid) 0.2 ×1.0 표준 설정
하위권 (junior) 0.4 ×0.8 빠른 망각, 조밀한 복습
벼락치기형 (crammer) 0.6 ×0.6 초단기 집중 복습
학습 강도 P_threshold 의미
엄격 0.70 아직 70%일 때 미리 복습
균형 0.50 반반일 때 복습 (기본)
여유 0.35 많이 까먹은 후 복습

2. SM-2 하이브리드 (자기평가 시)

복습 시 어려움/보통/쉬움을 선택하면 SM-2 알고리즘이 적용됩니다.

  • 어려움 → 1일 후 재복습, EF -0.3
  • 보통 → 현재 간격 유지
  • 쉬움 → 간격 확대, EF +0.15
  • 간격에 페르소나 배율이 곱해짐 (최대 60일 cap)

기술 스택

영역 기술
Backend NestJS 10, Prisma 5, MariaDB
Frontend Next.js 14 (App Router), React 18, styled-components 6
인증 JWT (passport-jwt)
차트 Recharts
아이콘 Phosphor React
폰트 Pretendard + Inter + JetBrains Mono
PDF 파싱 poppler-utils (pdftotext, pdftoppm, pdfinfo)
배포 PM2, nginx reverse proxy

프로젝트 구조

reloop-v2/
├── backend/
│   └── src/
│       ├── auth/              # JWT 인증
│       ├── dashboard/         # 대시보드 요약
│       ├── forget/            # 망각곡선 + SM-2 엔진
│       ├── me/                # 프로필 (페르소나 변경 시 스케줄 재계산)
│       ├── problem-sets/      # 문제집 + PDF 파싱
│       │   └── parsing/       # pdftotext 기반 파서 + OCR fallback
│       ├── reviews/           # 복습 큐 (자동 이월 포함)
│       ├── stats/             # 통계
│       ├── study-logs/        # 학습 기록 + PDF 문제 분리
│       ├── subjects/          # 과목
│       ├── tags/              # 태그
│       ├── organizations/     # 학교/학원
│       ├── classes/           # 학급
│       └── assignments/       # 과제
├── frontend/
│   └── src/
│       ├── app/
│       │   ├── dashboard/     # 대시보드 (캘린더, 숙련도)
│       │   ├── review/        # 복습 세션 (키보드 단축키)
│       │   ├── exams/         # 문제집 카탈로그
│       │   ├── study/
│       │   │   ├── exam/      # 모의고사 화면
│       │   │   ├── import-pdf/# PDF 문제 분리
│       │   │   └── history/   # 학습 기록
│       │   ├── stats/         # 통계
│       │   ├── subjects/      # 과목/태그 관리
│       │   ├── profile/       # 프로필 + 학습설정 + 알고리즘 설명
│       │   └── school/        # 학교 관리
│       ├── components/
│       │   ├── ui/            # 공통 UI 컴포넌트
│       │   ├── layout/        # AppShell, SideNav, BottomNav
│       │   └── charts/        # 망각곡선, 숙련도 차트
│       └── lib/               # API 클라이언트, 상수, 인증
└── prisma/
    └── schema.prisma          # DB 스키마

빠른 시작

필수 조건

  • Node.js 20+, pnpm 9+
  • MariaDB/MySQL 8+
  • poppler-utils (apt install poppler-utils)

설치

git clone ssh://git@your-gitea:2222/hanarang/reloop-v2.git
cd reloop-v2

# 백엔드
cd backend
pnpm install
cp .env.example .env          # DATABASE_URL, JWT_SECRET 편집
pnpm prisma migrate dev
pnpm prisma:seed
pnpm dev                      # :3001

# 프론트엔드
cd ../frontend
pnpm install
cp .env.example .env.local    # NEXT_PUBLIC_API_URL 편집
pnpm dev                      # :3000

환경 변수

Backend (backend/.env)

변수 필수 설명
DATABASE_URL O mysql://user:pass@host:3306/reloop_v2
JWT_SECRET O 32자+ 랜덤 문자열
JWT_EXPIRES_IN - 기본 7d
CORS_ORIGINS - 허용 도메인 (쉼표 구분)
PORT - 기본 3001

Frontend (frontend/.env.local)

변수 설명
NEXT_PUBLIC_API_URL 기본 http://localhost:3001/api

배포

cd /path/to/reloop-v2

# 백엔드
cd backend && rm -f *.tsbuildinfo && pnpm build
pm2 restart reloop-api

# 프론트엔드
cd ../frontend && pnpm build
cp -r .next/static .next/standalone/.next/
cp -r public .next/standalone/
pm2 restart reloop-web

API 엔드포인트

Method Endpoint 설명
POST /api/auth/register 회원가입
POST /api/auth/login 로그인
GET /api/auth/me 내 정보
PATCH /api/me/profile 프로필 수정 (페르소나 변경 시 스케줄 재계산)
GET /api/dashboard/summary 대시보드 요약
GET /api/reviews/queue 복습 큐 (밀린 복습 자동 이월)
POST /api/reviews/:id/submit 복습 결과 제출
GET /api/reviews/calendar 월간 복습 캘린더
GET /api/reviews/day 일별 복습 상세
GET /api/study-logs 학습 기록 목록
POST /api/study-logs 학습 기록 생성
POST /api/study-logs/from-problem-set 모의고사 일괄 제출
POST /api/study-logs/parse-pdf PDF 문제 분리 (OCR)
POST /api/study-logs/import-from-pdf 분리된 문제 등록
GET /api/problem-sets 문제집 목록
GET /api/subjects 과목 목록
GET /api/stats/mastery-path 숙련도 성장 곡선

라이선스

UNLICENSED (비공개)

Description
ReLoop v2 — 적응형 복습 스케줄링 (페르소나 망각 곡선 기반 수능 학습 플랫폼)
Readme 4.4 MiB
Languages
TypeScript 81.2%
HTML 18.7%