문서 스캔 → OCR → 핵심 키워드·빈칸 학습 → 퀴즈·리워드·통계·복습 알림까지 이어지는 학습 앱 프로젝트입니다.
프론트엔드와 백엔드를 별도 저장소(Multi-repo) 로 운영하며, 모바일 앱은 백엔드 REST API를 통해 학습 데이터·인증·알림 등을 처리합니다.
| 이름 | 역할 | 담당 영역 |
|---|---|---|
| 김다빈 | 백엔드 | FastAPI 서버, OCR·채점·리워드 API, 인증, 배포 인프라 |
| 홍재영 | 프론트엔드 | Expo React Native 앱, 화면·네비게이션, API 연동 |
| 김예진 | PM | 기획, 일정·요구사항 관리, 팀 커뮤니케이션 |
| 김소은 | 디자이너 | UI/UX 디자인, 화면 시안·에셋 |
이 프로젝트는 프론트엔드와 백엔드를 분리한 Multi-repo 구조입니다.
| 저장소 | 기술 스택 | 설명 |
|---|---|---|
| front | Expo / React Native / TypeScript | 모바일 클라이언트 — OCR 촬영, 학습·복습 UI, 소셜 로그인 |
| python (현재 저장소) | FastAPI / Python 3.11 | REST API 서버 — OCR, 채점, 리워드, 통계, 푸시 알림 |
BAT 프로젝트
├── front/ → Expo React Native 앱 (클라이언트)
└── python/ → FastAPI 백엔드 API (현재 레포)
flowchart TB
subgraph Client["클라이언트"]
APP["BAT Mobile App\n(Expo / React Native)"]
end
subgraph Backend["백엔드 — AWS EC2"]
API["FastAPI Server\nGunicorn + Uvicorn"]
SCH["APScheduler\n복습 알림 (5분 주기)"]
API --- SCH
end
subgraph Data["데이터 계층"]
DB["Supabase\n(PostgreSQL)"]
GCS["Google Cloud Storage\n(파일 저장)"]
end
subgraph External["외부 서비스"]
OCR["네이버 Clova OCR"]
GPT["OpenAI API"]
PUSH["Expo Push API"]
OAUTH["소셜 OAuth\n카카오 · 네이버 · Apple"]
PAY["Stripe / Apple IAP"]
end
APP -->|"REST API + WebSocket\n(JWT 인증)"| API
API --> DB
API --> GCS
API --> OCR
API --> GPT
API --> PUSH
API --> OAUTH
API --> PAY
SCH --> DB
SCH --> PUSH
[사용자] → 앱에서 학습지 촬영/업로드
→ POST /ocr (Clova OCR + 키워드 추출)
→ POST /study/grade (채점 · 포인트 · 학습 로그 저장)
→ GET /study/review_study/{quiz_id} (복습 HTML)
→ APScheduler → Expo Push (복습 리마인드 알림)
flowchart LR
DEV["개발자\nlocal / git push"]
GHA["GitHub Actions\ndeploy.yml"]
EC2["AWS EC2\nt3.micro"]
DOCKER["Docker Compose\nFastAPI :8000"]
DEV --> GHA --> EC2 --> DOCKER
김다빈 — 백엔드 전담
main.py를 중심으로 모듈형 APIRouter 구조를 설계하고, 인증·OCR·학습·리워드·알림·결제 등 도메인별 라우터를 분리해 유지보수성을 확보했습니다.- CORS, JWT 미들웨어, 정적 파일 마운트, APScheduler 스케줄러를 앱 라이프사이클에 통합했습니다.
app/security_app.py— JWT 발급·검증,get_current_user의존성 주입app/auth/— 카카오 · 네이버 · Apple 소셜 로그인 콜백 및 토큰 교환 → JWT 발급GET /config— 프론트엔드 OAuth 설정을 환경 변수 기반으로 동적 제공
service/clova_ocr_service.py— Clova OCR API 연동, 이미지/PDF 처리, 2열 레이아웃 보정(OCR_TWO_COLUMN_LAYOUT)app/ocr_app.py— OCR 업로드, 사용량 한도, 키워드 추출(POST /ocr/keywords), 비동기 job 폴링app/ocr_ws.py— WebSocket 기반 OCR 진행률 실시간 push (/ws/ocr/{job_id})service/keyword_adapter.py— OpenAI + kiwipiepy 형태소 분석을 활용한 키워드 추출
app/study_app.py— 최초 채점(POST /study/grade), 복습 HTML 렌더링, 복습 채점, 페이지별 통계 기록app/hint/— 복습 힌트 APItemplates/— Jinja2 기반 복습 HTML 템플릿
app/reward_app.py+service/reward_service.py— 출석 보상, 연속 학습 보너스, 날짜 랜덤 이벤트, 리더보드·순위 조회- 채점 응답에
streak_bonus,consecutive_streak_days등 스트릭 정보 포함
app/weekly_app.py— 월간 학습 목표 설정, 주간 성장률, 이번 달 학습 vs 목표 통계app/user_app.py— 닉네임 설정, 홈·학습 통계 API
service/notification_service.py— APScheduler 5분 주기 DB 조회 → 복습 리마인드 Expo Push 발송remind_sent_at기반 당일 중복 발송 방지, Supabase 연결 재시도 로직app/notification_app.py— 알림 on/off, 리마인드 시간 설정 APIapp/firebase_app.py— Expo Push 토큰 등록
app/apple_pay/— Stripe PaymentIntent 생성 + Webhook 서명 검증app/iap/— Apple StoreKit IAP 검증, OCR 페이지 상한 증가
Dockerfile— Python 3.11-slim, Gunicorn + UvicornWorker, OCR/PDF 의존성docker-compose.yaml— 컨테이너 오케스트레이션, DNS 설정.github/workflows/deploy.yml— GitHub Actions → EC2 SSH 배포,.env자동 생성, Docker Compose 재빌드- 운영 서버:
http://13.209.6.39:8000
core/database.py— Supabase(PostgreSQL) 클라이언트, service_role 키 기반 RLS 우회utils/file_handler.py— Google Cloud Storage 파일 업로드·처리app/reports_app.py— 학습 신고·피드백 API
Swagger UI에서 전체 API 엔드포인트를 확인할 수 있습니다.
| 그룹 | Prefix | 설명 |
|---|---|---|
| 인증·사용자 | /auth |
소셜 로그인, 닉네임, 통계 |
| OCR | /ocr |
업로드, 키워드, 사용량, job 폴링 |
| 학습·채점 | /study |
채점, 복습, 힌트 |
| 리워드 | /reward |
출석, 랜덤 이벤트, 리더보드 |
| 통계·목표 | /cycle |
월 목표, 주간·월간 통계 |
| 알림 | /notification-push, /firebase |
알림 설정, 푸시 토큰 |
| 결제 | /payments, /iap |
Stripe, Apple IAP |
| 신고 | /reports |
학습 신고·피드백 |
상세 필드·요청/응답 형식은 docs/API.md를 참고하세요.
| 영역 | 기술 |
|---|---|
| Framework | FastAPI, APIRouter 모듈화 |
| Runtime | Python 3.11, uvicorn(개발) / gunicorn+uvicorn(운영) |
| Database | Supabase (PostgreSQL) |
| Auth | JWT, 카카오/네이버/Apple OAuth |
| OCR | 네이버 Clova OCR |
| NLP | OpenAI API, kiwipiepy |
| Push | Expo Push API |
| Payments | Stripe, Apple StoreKit IAP |
| Storage | Google Cloud Storage |
| Scheduler | APScheduler (복습 알림) |
| Infra | AWS EC2, Docker, GitHub Actions |
python/
├── main.py # FastAPI 앱 진입점, CORS, 스케줄러
├── Dockerfile / docker-compose.yaml
├── requirements.txt / .env.example
├── app/ # API 라우터
│ ├── security_app.py # JWT
│ ├── auth/ # 카카오·네이버·Apple 로그인
│ ├── ocr_app.py / ocr_ws.py
│ ├── study_app.py
│ ├── reward_app.py / weekly_app.py / user_app.py
│ ├── notification_app.py / firebase_app.py
│ ├── apple_pay/ / iap/
│ └── hint/ / reports_app.py
├── core/ # Supabase 클라이언트, env 로더
├── service/ # OCR, 알림, 리워드, 키워드 비즈니스 로직
├── utils/ # GCS 파일 처리
├── templates/ # Jinja2 (복습 HTML)
├── docs/ # API, OCR, 알림 상세 문서
└── tests/
# 1. 가상환경 및 패키지
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
# 2. 환경 변수 (.env.example 참고)
cp .env.example .env # 값 채우기
# 3. 개발 서버
uvicorn main:app --reload
# 4. Docker
docker compose up --build -d동작 확인: GET / → {"status":"running"}
- docs/API.md — API·필드 상세
- docs/OCR.md — OCR 저장 형식·스키마
- docs/OCR_PROGRESS_WS.md — OCR WebSocket
- docs/NOTIFICATION_FLOW.md — 알림·DB 필드
- Frontend Repo — 모바일 앱 저장소