StudyReel · 기말 발표
신구대 클라우드 캡스톤 · 기말 발표

StudyReel

스크롤 중독을 학습 습관으로.
유튜브 쇼츠를 교육용 세로 피드로.

FlutterFirebase YouTube API1인 + AI Agent
StudyReel 온보딩 화면

01 — 비전 (Vision)

“틱톡에 뺏기던 30분을, 그대로 학습 30분으로.”
습관
사람들은 이미 세로 피드·자동재생에 길들여져 있다
→
습관은 그대로 두고 콘텐츠만 교육으로 바꾼다
StudyReel
알고리즘에 휘둘리지 않는, 내가 고른 토픽만 흐르는 학습 피드

02 — 문제 정의 (Problem)

“공부하려고 유튜브를 켰는데, 5분 뒤엔 예능을 보고 있다.”
기존 방식한계
YouTube 직접 검색알고리즘이 오락 영상으로 이탈 유도
인강 플랫폼긴 호흡 — 자투리 시간엔 부적합
Shorts 학습 채널구독해도 피드에 예능이 섞임

필요한 것

이탈 경로가 차단된,
학습 전용 숏폼 피드

03 — 프로젝트 계획 · WBS & 기술 스택

WBS — MoSCoW

MUST 온보딩 → 인앱 Shorts 피드 → 저장 ✓

SHOULD 탐색·프로필·스트릭·로그인 ✓

COULD 무한 스크롤·시청 기록·수준 선택 ✓

→ 전 항목 완료

기술 스택

프레임워크Flutter 3.35ADR-0001
상태관리Riverpod단방향
백엔드Firebase Auth·Firestore0002/0003
콘텐츠YouTube Data API v30004/0005
📊 전체 WBS · 일정 보기

04 — 프로젝트 진행 및 완료

67
커밋
5
ADR 의사결정 기록
완료
Must·Should·Could 전 항목 · 릴리스 APK 배포
4월
계획·설계 · ADR
5월 초
Gemini 카드 MVP → 피벗
5월 말
Shorts 피드 · error 152 돌파
6월
로그인·시청기록·보안규칙 · 완료

피벗 근거: Gemini 무료 토큰 한도를 실측 → 데이터로 방향 전환 (ADR-0004) · 데드코드 7파일 청산

05 — 어떻게 구현했나 · 아키텍처

4계층 아키텍처
데이터 흐름

단방향 의존 — UI는 Provider만, Provider는 Repository만 안다 · 모든 정책(캐시 우선, 없으면 API)은 Repository 한 곳 · 디렉토리 core / data / domain / presentation

06 — 구현 시행착오 · 가설–검증 디버깅

가설검증
WebView 합성 불가실기기에서 에러 UI 또렷이 렌더폐기
autoplay 차단152 해결 후 소리 자동재생 정상폐기
Shorts 임베드 정책채널 다른 3개 영상 전부 152규명

→ 돌파

라이브러리 소스에서 origin이 host로도 쓰임을 발견 → 호스트를 youtube-nocookie로 교체.

152 소멸, 실기기(Z Fold7) 인앱 재생 검증.

API embeddable=true 도 거짓

Claude · GPT · Gemini를 역할별로 나눠 쓰고 출력을 교차검증해 해법 채택

07 — 성능 최적화 · 코드 품질

성능 최적화

⚡ YouTube 쿼터(10k/day) 보호 — Firestore 영구 캐싱 → 재방문 API 호출 0회

⚡ Gemini 429 → 지수 백오프 (10→20→40s)

⚡ 재생 불가 영상 3초 워치독 자동 스킵 · 시청 영상 제외 무한 스크롤

코드 품질 관리

✓ flutter analyze 에러/경고 0건 — AGENTS.md 게이트 + GitHub Actions CI

✓ DRY — youtube_launcher·VideoListTile 공통화

✓ 피벗 후 데드코드 즉시 제거 · 그린 상태에서만 커밋

08 — 테스트 · 단위 + 통합

종류도구개수대상
단위 · 위젯 · E2E flutter_test · fake_cloud_firestore · firebase_auth_mocks 57 캐시·북마크·스트릭·중복제거·토픽·E2E 플로우
통합 @firebase/rules-unit-testing (에뮬레이터) 4 Firestore 보안 규칙 — 내 데이터만 읽기/쓰기

시간 의존 로직은 now 콜백 주입 → 결정적 테스트 · 무한 스크롤 중복제거는 순수 함수 dedupeAppend로 분리 · GitHub Actions CI가 푸시마다 analyze 0건 + 전체 테스트 자동 실행

09 — 개발 환경 · 빌드 · 배포

단계내용문서
환경 설정Flutter SDK → pub get → API 키 2종 발급 → flutterfire configure (목표 5분)docs/setup.md
빌드소스→APK 컴파일 · --dart-define으로 키 주입 (소스에 키 없음)docs/deploy.md
배포APK → GitHub Pages 호스팅 + adb install · 서버 배포 없음(ADR-0003)docs/deploy.md

설치 가이드 — GitHub README에 소개 페이지·APK 다운로드·5분 셋업 · 한글 경로 impellerc 크래시는 buildDirectory 리다이렉트로 우회(문서화)

10 — ADR 요약

ADR결정핵심 사유
0001Flutter 채택단일 코드베이스, 세로 피드 구현 용이
0002Firebase Auth + Firestore서버리스, 사용자별 문서 모델
0003Cloud Functions 미사용Blaze 과금 회피 → 클라이언트 직접 호출 + 캐싱
0004Gemini 카드 → Shorts 피벗토큰 한도 실측 데이터 기반 전환
0005url_launcher → 인앱 iframe“인앱이 안 되면 컨셉이 죽는다”
ADR 원문 · github.com/poro832/StudyReel/.../decisions ↗
기술 질문은 이 ADR 문서를 띄워 근거와 함께 답변합니다

11 — AI Agent 워크플로우 · 가산점

① 스킬 · 워크플로우

스킬 체인 + 자작 플러그인 Keel

Superpowers 스킬 체인(plan → execute → debug)에 더해, 직접 만들어 공개한 Claude Code 플러그인 Keel(MIT)로 라우팅·범위 정지·단일가설 디버깅·증거기반 검증을 규칙화.

② 본인만의 기법

AGENTS.md 단일 헌법 파일

빌드 게이트·아키텍처 불변식·캐싱 정책·테스트·커밋 규약을 한 파일에 통합 → 어떤 에이전트든 같은 규칙으로 작업.

③ 암묵지 운영

LLM이 읽는 지식 베이스

ADR(결정) + 트러블슈팅 블로그(152 전 과정) + AGENTS.md(규칙) = 새 세션 에이전트도 즉시 맥락 복원.

자작 플러그인 · github.com/poro832/Keel ↗

AI 출력은 항상 화면·로그·테스트로 끝을 본다 — 오진 2건을 실측으로 폐기

12 — 🎬 시연 데모 (30초)

실제 구동 — 인앱 자동재생
▶
클릭 → 30초 데모 재생
폰을 누르면 실제 구동 영상이 재생됩니다
시나리오 — “출근길 5분, 앱 하나로 학습”
1로그인 → 온보딩 — 토픽 3개 + 학습 수준 선택
2피드 — 교육 Shorts가 소리와 함께 인앱 자동재생, 스와이프
3북마크 ⭐ + 무한 스크롤 — 본 영상은 다시 안 나옴
4프로필 — 🔥 학습 스트릭 · 저장한 영상 · 최근 본 영상

임팩트 — 유튜브가 막아둔 Shorts가, 우리 앱 안에서 소리내며 재생되는 순간

13 — 활용 방안 · 향후 발전

어떻게 활용할 것인가

📚 자투리 시간 마이크로러닝 — 토픽·수준 맞춤 피드

🏫 교육기관 — 과목별 큐레이션 피드로 확장 (Firestore 토픽 모델 재사용)

향후 발전 방향

🤖 시청 기록 기반 개인화 추천 · 학습 퀴즈(Gemini 키 슬롯 준비)

🧪 자동 integration_test 도입 · iOS 지원

StudyReel — 스크롤 중독을 학습 습관으로.

감사합니다

📲 지금 설치해 보세요 — 앱 소개 · 다운로드

앱 소개 페이지 QR
QR 스캔 → 소개·설치 페이지
poro832.github.io/studyreel-final/app
1QR 스캔 또는 링크 접속 → APK 다운로드
2“출처를 알 수 없는 앱” 설치 허용 (Android 7.0+, 약 54MB)
3Google 계정 로그인 → 토픽 선택 → 바로 학습 피드

소개 페이지 · APK 다운로드 · GitHub 저장소 링크가 한 화면에 정리되어 있습니다.