v1.9.35 개인 학습 전환: 공개·비공개 선택을 제거했습니다. 전체 복습은 내 모든 교재만 보여주며 관리자만 다른 사용자 자료를 관리합니다. 기존 설치는 supabase/personal_learning_v1_9_35.sql을 적용하세요. 현재 연결된 프로젝트에는 이미 적용되어 있습니다. 기존 교재·진도는 보존됩니다.

현재 v1.9.25 · 문단 이어 읽기

원문과 번역에 포함된 불규칙한 줄바꿈은 표시할 때 공백으로 처리합니다. 화면 너비에 맞춰 자연스럽게 이어지며 문장별 선택·듣기는 유지됩니다. 새 SQL·환경변수 변경은 없습니다.

현재 v1.9.24 · 문단 복구와 실제 진행 표시

새 문단는 기본 3문장, 최대 4문장입니다. Gemini 서버 오류 때는 충분한 원문이 있으면 추가 API 요청 없이 기본 문단를 저장합니다. 미확보 번역은 번역 보완 필요로 표시하며 나중에 직접 보완할 수 있습니다. 교재 생성과 학습 열기의 진행 팝업은 실제 응답 단계와 경과 시간을 표시합니다. 새 SQL·환경변수·Worker 변경은 없습니다.

현재 v1.9.23 · 문단 상세 개선

펼친 항목에서 핵심 표현과 문장별 원문/번역을 읽고 듣습니다. 모든 문장 선택·선택 듣기·번역 가리기를 사용해보세요. 전체 뜻·학습 포인트는 필요할 때 펼칩니다. 중요/외웠어요 저장 후에도 열린 상태와 선택 문장이 유지됩니다. 새 SQL·환경변수 변경은 없습니다.

현재 v1.9.22 · 학습 화면 정리

학습 상단에는 제목·진도, 반복·속도·재생 조절만 기본으로 표시합니다. 학습 설정을 펼치면 음성·따라 말하기·가리기·공개 설정·교재 정보·원음 영상을 이용할 수 있습니다. 아래 학습 리스트는 유지됩니다. 새 SQL·환경변수 변경은 없습니다.

현재 v1.9.21 · 교재 목록에서 공개 전환

저장한 영상 메뉴는 교재로, 내용 정리 버튼은 내용수정으로 바뀌었습니다. 교재 목록의 공개 범위 칸에서 비공개/공개 버튼을 누르고 안내를 확인하면 전환됩니다. 본인 교재에서 사용할 수 있으며 관리자의 공개 제한은 그대로 적용됩니다. 새 SQL·환경변수 변경은 없습니다.

현재 v1.9.20 · 목록과 내용 정리 개선

검색·정렬·조회는 기본으로, 나머지 조건은 상세 필터에 표시됩니다. 내용 정리에서 ← 영상 목록 또는 브라우저 뒤로 가기로 돌아오면 목록 상태가 유지됩니다. 이전 관리 URL도 저장한 영상으로 연결됩니다. 배포 후 한 번 강력 새로고침하세요. 새 SQL·환경변수 변경은 없습니다.

현재 버전 v1.9.19 · 저장 영상과 교재 관리 통합

홈과 학습 사이의 저장한 영상 메뉴에서 검색·등록일 기간·공개 범위·중복 조건을 설정하고 조회하세요. 기본 정렬은 등록일 최신순, 기본 표시 수는 50개입니다. 학습 열기·내용 정리·선택 삭제·JSON 백업을 한곳에서 이용합니다. 이전 교재 관리 주소도 이 화면으로 연결됩니다.

학습 화면의 복습·추가 자료 탭은 제거했습니다. 핵심 표현·문단·참고 대본과 기존 듣기/받아쓰기/학습 상태 기능은 유지됩니다. 기존 데이터는 삭제하지 않습니다. 새 SQL·환경변수 변경은 없으며 기존 v1.9 교재 관리 SQL을 재사용합니다.

아래 버전별 설명 중 이전 화면 구성은 개발 이력입니다. 현재 사용 방법은 이 업데이트 내용을 우선하세요.

정상 흐름:
배포: 추가 SQL·환경변수는 없습니다. 배포 후 /api/health에서 version 1.9.17을 확인하세요.

v1.9.16 · 홈 화면 간소화

홈 화면에서 마지막으로 연 교재 카드와 저장 영상·누적 표현·중요 표시·복습 예정 요약을 제거했습니다. 핵심 표현 개수 아래의 긴 안내 문구도 제거해 배열을 단순하게 정리했습니다.

배포: 추가 SQL·환경변수는 없습니다. 배포 후 /api/health에서 version 1.9.16을 확인하세요.

v1.9.15 · 핵심 표현 시간초과 완화

핵심 표현 기본값을 Top 20으로 조정했습니다. 5·10·15·20개 빠른 선택과 1~20개 직접 입력을 지원합니다. 긴 자막 핵심 표현 단계의 AI 입력 발췌량을 줄이고 서버 제한 시간을 75초로 조정했습니다.

권장:
배포: 추가 SQL·환경변수는 없습니다. 배포 후 /api/health에서 version 1.9.15를 확인하세요.

v1.9.14 · 자막 교재 연결 안정화 + 전체 리스트형 학습 UI

학습 화면:
배포: 추가 SQL·환경변수는 없습니다. 배포 후 /api/health에서 version 1.9.14를 확인하고 강력 새로고침하세요.

v1.9.13 · 원문 문장 중심 학습 화면

을 눌러 다시 정리할 수 있습니다. 추가 SQL·환경변수는 없습니다. 배포 후 /api/health의 version 1.9.13을 확인하세요.

v1.9.12 · 긴 자막 Gemini 524 개선

v1.9.11 · Supadata Cloudflare 시간초과 수정

Supadata 계정 조회가 10초보다 늦게 응답해 Cloudflare 네트워크 오류로 표시되던 문제를 수정했습니다. 계정 확인 제한은 30초, native 자막 요청은 40초이며 자동 재요청하지 않습니다.

v1.9.10 · Supadata 무료 플랜 연결 수정

Supadata가 현재 반환하는 Free (100/mo) 플랜명을 무료 계정으로 정상 인식합니다. 공식 API 규격에 따라 401 API 키, 402 플랜, 403 접근 제한, 429 사용 한도, 5xx Supadata 서버 오류를 구분합니다. 네트워크·시간초과·응답 형식과 APP_ENCRYPTION_KEY·Supabase 저장 오류도 별도로 표시합니다.

v1.9.9 · Supadata 기본 붙여넣기 직접 처리

관리자 화면의 Supadata API 키와 시험 영상 URL에서 Ctrl+V, 우클릭 붙여넣기, 모바일 길게 누르기의 paste 이벤트를 입력값으로 직접 반영합니다. 별도 붙여넣기 버튼은 제거했습니다. 이전 스크립트 캐시를 피하도록 버전을 갱신했습니다.

v1.9.8 · Supadata 입력 초기화 수정

관리자 화면의 Supadata API 키와 시험 영상 URL이 최초 로그인 상태 확인 중 지워질 수 있던 문제를 수정했습니다.

v1.9.7 · 무료 Gemini 모델 선택과 오류 진단

기본 교재 모델은 Gemini 3.7 Flash입니다. 관리자 → AI·자막 API에서 무료 Flash 모델을 선택하고 실제 연결 테스트 후 저장할 수 있습니다. 503이면 권장 3.7 Flash 또는 Flash-Lite를 시험하세요. 429는 무료 요청·토큰 한도 소진이므로 Google AI Studio 사용량에서 확인합니다.

v1.9.6 · 자막 교재 생성 연결 안정화

자막·TXT·붙여넣기 교재 생성과 기존 누락 자료 보완은 Gemini의 generateContent 경로를 사용합니다. 사용자가 선택한 직접 영상 분석만 기존 Interactions 경로를 사용합니다. 자동 재요청은 하지 않으며 입력 자막은 보존됩니다.

v1.9.5 · 전체 교재 한 번에 생성

v1.9.2 · 간편 자막 입력 업데이트

영어 자막 확보에 실패하면 주소 복사 → 외부 사이트 → 자막 붙여넣기·파일 선택으로 안내합니다. 자막 입력 아래 ‘이 자막으로 교재 만들기’를 누르면 됩니다. 영상 분석으로 자동 전환하지 않습니다. 외부 사이트도 실패하거나 결제를 요구하면 다른 영어 자막 영상을 선택해주세요.

v1.9 DB 적용을 마쳤다면 추가 SQL·환경변수는 없습니다. 소스 배포 후 /api/health에서 version 1.9.2를 확인하고 앱을 새로고침하세요. 실제 운영 연결과 휴대폰 화면은 배포 후 확인이 필요합니다.

비전공자용 · 처음부터 배포까지

TubeEnglish Study v1.9.1
설치·DB·GitHub·Cloudflare 완전 가이드

YouTube URL 또는 영어 대본에서 핵심 표현을 정리하고 바로 교재로 저장합니다. 자막을 확보하지 못하면 직접 대본을 넣거나 동의 후 영상 분석을 요청할 수 있습니다.

무료 자막 API 연결 — 관리자 한 번 설정

Supadata는 자막 API, Supabase는 기존 DB입니다. 서로 다른 서비스입니다. 앱은 먼저 YouTube 공개 영어 자막을 무료로 확인하고, 실패할 때만 Supadata Free를 사용합니다. 확보한 텍스트만 Gemini에 보내 교재를 만듭니다.

  1. Supadata의 Free 무료 계정으로 가입해 API 키를 받습니다. 결제·유료 업그레이드는 하지 마세요. 현재 Free는 월 100 credits이며 정책은 바뀔 수 있습니다.
  2. 앱 관리자 → AI·자막 API → Supadata 연결에서 키 입력 → 연결 확인 후 저장을 누릅니다.
  3. 테스트할 영상 URL을 입력하고 이 영상 자막 가져오기 테스트를 누릅니다. 무료 제공량을 사용하며 Gemini는 호출하지 않습니다.
  4. 일반 화면에서 URL → 교재 생성을 누르면 자막 확보 후 AI 교재 생성 순서로 진행합니다. 실패해도 확보한 자막은 입력란에 남습니다.

Supadata 요청 전에 Free 플랜과 남은 제공량을 확인합니다. 유료 플랜·한도 소진·확인 실패이면 전문 API를 사용하지 않고 무료 사이트 안내로 전환합니다. native 모드로 기존 자막만 조회하며 auto/generate 음성 전사를 요청하지 않습니다. 선택적으로 Cloudflare Secret SUPADATA_API_KEY를 넣을 수도 있으나 관리자 화면이 더 간편합니다.

Gemini도 본인의 무료 사용 프로젝트 키인지 확인하세요. 앱은 Google 프로젝트의 결제 연결 여부를 판별하지 못합니다. 무료 무제한·모든 영상 성공은 보장할 수 없으며 운영 키를 통한 검증은 아직 하지 못했습니다. 상세 내용은 docs/UPDATE_V1_9.md에 있습니다.

v1.9.0 — 교재 관리와 실패 안내

  1. v1.8까지 설치했다면 Supabase SQL Editor에 supabase/bank_v1_9.sql 전체를 붙여넣고 Run을 누릅니다. 이전 SQL 미적용이면 repair_save_v1_7.sql → study_progress_v1_8.sql → bank_v1_9.sql 순서입니다.
  2. 코드 배포 후 /api/health의 version 1.9.0을 확인합니다. 환경변수 추가는 없습니다.
  3. 상단 교재 관리에서 검색·같은 영상/대본 선택·내용 정리를 사용합니다. 삭제 전 제목·개수를 확인하세요. 삭제는 되돌릴 수 없고 연결된 복습 기록도 제거됩니다. 필요하면 JSON 백업을 내려받으세요(자동 복원 기능은 없음).
  4. URL 분석 실패 안내창에서 주소 복사 → 자막 사이트 → 앱 붙여넣기 또는 파일 선택 순서로 진행합니다. API 키·사용 한도 문제는 관리자가 별도로 확인해야 합니다.

관리자만 전체 사용자 범위를 선택할 수 있습니다. 같은 대본 비교는 저장된 텍스트 기준이며 전체 대본 없는 교재에는 제공하지 않습니다. 모든 영상 분석 성공을 보장하지 않습니다. 운영 API·DB·휴대폰 실화면 검증은 별도로 필요합니다. 상세 내용: docs/UPDATE_V1_9.md

v1.8.0 — 파일 없이 공부하는 학습 교재

기존 설치는 supabase/study_progress_v1_8.sql을 SQL Editor에서 실행하세요. v1.7 저장 수정 SQL을 아직 적용하지 않았다면 repair_save_v1_7.sql도 먼저 실행합니다. 최초 설치는 최신 schema.sql을 사용합니다.

학습 탭에서 영어 발음, 문장 체크 후 선택 듣기, 문장별/전체 반복, 속도·간격 조절, 영어/번역 가리기와 통합 복습을 사용하세요. 발음은 기기 영어 음성이며 검증된 구간은 영상 원음도 지원합니다.

자동 테스트 결과는 TEST_REPORT.md에 있습니다. 운영 API·SQL 실행·PC/모바일 실제 화면 검증은 별도로 필요합니다. 아래는 이전 버전 설치 안내와 이력입니다.

v1.7.0 필수 업데이트 — 저장 오류 수정과 간편 입력

이번에는 Supabase SQL 실행이 필요합니다. 아래의 예전 v1.6 ‘SQL 불필요’ 안내는 이번 업데이트에 해당하지 않습니다.
  1. Supabase 프로젝트 → SQL Editor → New query를 엽니다.
  2. ZIP의 supabase/repair_save_v1_7.sql 전체를 복사해 붙여넣고 Run을 누릅니다. 기존 v1.2 이상 설치용이며 기존 학습 데이터는 삭제하지 않습니다. 처음 설치하는 경우에는 수정된 schema.sql을 사용하세요.
  3. 수정 파일을 GitHub 저장소의 같은 위치에 반영합니다. public/assets/js/config.js의 본인 프로젝트 설정을 확인하세요.
  4. Cloudflare Pages 배포 완료 후 /api/health의 version이 1.7.0인지 확인하고 앱을 강력 새로고침합니다.
  5. URL 없이 짧은 SRT/TXT 파일로 교재 생성·저장을 시험합니다. 이어 자막 있는 영상과 자막을 못 가져오는 영상을 시험하세요.

새 환경변수, Worker, Cron 설정은 필요 없습니다. 저장 함수의 열 이름 충돌과 Gemini 영상 입력 형식을 수정했습니다.

사용자가 달라지는 점

  • URL만 입력: 자막 우선, 실패하면 체크된 자동 전환 옵션에 따라 AI 영상 분석. 영상 전송·추가 API 사용량 안내를 보고 원하지 않으면 체크를 끄세요.
  • 파일만 입력: TXT/SRT/VTT로 URL 없이 교재 생성. 연결 영상이 없으면 원음 재생은 제공하지 않습니다.
  • 저장 실패: 결과를 받은 뒤 1시간 동안 저장만 다시 시도. AI를 다시 호출하지 않습니다. SQL 오류 안내가 뜨면 먼저 위 수정 SQL을 실행하세요.
  • 새로고침: 같은 탭에서 입력과 재시도 결과 복구. 로그아웃하면 삭제되며 탭을 닫으면 복구가 보장되지 않습니다.
  • 외부 대안: 자막 도움말의 URL 복사 → YouTube 또는 외부 서비스 열기 → 자막 붙여넣기.
전체 자막과 교재 분석은 다릅니다. 확보한 자막/직접 넣은 대본만 전체 대본으로 표시합니다. AI 영상 분석은 학습 표현을 정리하며 모든 영상의 전체 자막 추출을 보장하지 않습니다. 긴 대본은 일부 발췌 분석합니다.

자동 테스트 57개·정적 검사 145개 통과. 실제 운영 서버·SQL 실행·브라우저 화면 검증은 미완료입니다. 자세한 변경/제약과 검증용 SQL은 docs/UPDATE_V1_7.md를 참고하세요.

v1.6.1 시간초과 개선: Gemini 분석 요청에 low 추론 설정을 기본 적용합니다. 배포 후 /api/health의 version이 1.6.1인지 확인하세요. 새 SQL이나 Worker 설정은 필요 없습니다. 90초 시간초과가 계속되면 영상 분석인지 대본 분석인지 오류 안내를 확인하고, 시간 포함 짧은 대본과 표현 10개로 시험하세요. 실제 완료 시간은 모델·영상 접근·서비스 상태에 따라 달라집니다.

이전 버전 기록: v1.6.0 업데이트 — 일반 분석으로 단순화

별도 Worker와 작업 대기열을 제거했습니다. 교재 생성 버튼을 누른 뒤 완료될 때까지 화면을 열어두세요. 기존 학습 DB에는 새 SQL을 실행할 필요가 없습니다.
  1. 기존 Cloudflare의 tubeenglish-analysis-worker에서 Cron Trigger를 제거해 이전 작업 실행을 먼저 중지합니다. Pages 앱 tubeenglish-study는 유지하세요.
  2. 수정 파일을 GitHub에 덮어쓰고, ZIP의 DELETE_FILES.txt에 있는 이전 파일도 삭제합니다. 전체 목록과 쉬운 적용 순서는 docs/UPDATE_V1_6.md에 있습니다.
  3. Cloudflare Pages 배포 성공 후 앱을 새로고침합니다.
  4. 로그인 후 짧은 영어 대본으로 교재 생성을 확인합니다.
  5. 별도 Worker의 Git 자동 빌드 연결을 해제하고 더 이상 사용하지 않는 tubeenglish-analysis-worker를 삭제할 수 있습니다. 학습 데이터가 있는 Supabase 프로젝트는 삭제하지 마세요.

자막을 먼저 확인하고, 없으면 직접 대본을 넣거나 동의 후 Gemini로 영상 분석을 선택합니다. 긴 대본은 최대 24,000자를 발췌하여 한 번 분석하므로 전체 요약이 아닙니다. 이전 ANALYSIS_JOBS_ENABLED 설정은 삭제해도 되며 이 버전에서 읽지 않습니다.

0. 시작 전에 준비할 것

아래 계정 4개만 있으면 됩니다. 모두 처음에는 무료 플랜으로 시작할 수 있습니다.

서비스용도주소
GitHub소스코드 Private 저장소github.com
Cloudflare웹 호스팅 + 서버 APIdash.cloudflare.com
Supabase로그인 + PostgreSQL DBsupabase.com
Google AI StudioGemini API Keyaistudio.google.com
추천: 우선 본인 혼자 테스트하고, 모든 기능이 정상임을 확인한 뒤 가족/지인 계정을 추가하세요.

1. 앱의 전체 구조

① 사용자 스마트폰 / 태블릿 / PC
↓
② Cloudflare Pages — URL·대본·자막 파일 입력
↓
③ Pages Functions — 공개 영어 자막 확인·대본 정리·발췌
↓
④ Gemini 3.8 Flash — 자막 우선 분석, 동의 시 영상 URL 분석
↓
⑤ Supabase — 전체 대본·표현·복습·통계 장기 저장
중요한 보안 설계
브라우저에는 Supabase Publishable Key만 있습니다. Gemini API Key와 Supabase Secret Key는 Cloudflare 서버 영역에만 있습니다. 전체 대본과 AI 분석 원본은 소유자에게만 제공되며, 브라우저가 직접 DB에 INSERT할 수 없습니다.

2. ZIP을 풀고 파일 확인

압축을 풀면 아래처럼 보여야 합니다.

TubeEnglish-Study-v1.0.0/ ├─ public/ │ ├─ index.html 일반 사용자 앱 │ ├─ admin.html 관리자 센터 │ ├─ _headers 보안 헤더 │ ├─ assets/css/ 반응형 UI │ ├─ assets/js/ 프론트엔드 기능 │ └─ docs/SETUP_GUIDE.html 지금 보고 있는 설명서 ├─ functions/ │ ├─ api/analyze.js Gemini 분석 + 서버 DB 저장 │ ├─ api/health.js 서버 설정 확인 │ ├─ api/admin/ 관리자 API │ ├─ api/community/ 공개 학습 API │ ├─ api/settings/ Gemini 키 관리 API │ └─ _lib/, _shared/ 공통 서버 코드/프롬프트/JSON Schema ├─ supabase/schema.sql DB·RLS·통계·RPC 전체 SQL ├─ scripts/check.mjs 자동 정적검사 ├─ .dev.vars.example 로컬 서버 설정 예시 ├─ wrangler.toml ├─ package.json ├─ README.md └─ TEST_REPORT.md
실제 Secret을 파일에 쓰지 마세요. SUPABASE_SECRET_KEY, APP_ENCRYPTION_KEY, Gemini API Key는 GitHub에 올리면 안 됩니다.

3. Supabase 프로젝트 만들기

1
Supabase 로그인 → New project

새 프로젝트를 만듭니다. 예: tubeenglish-study.

2
Database Password 보관

길고 안전한 비밀번호를 만들어 별도 비밀번호 관리자에 보관하세요.

3
Region 선택

주 사용자가 한국이라면 가능한 가까운 Asia region을 선택하세요.

4
프로젝트 준비 완료 확인

왼쪽에 SQL Editor / Table Editor / Authentication이 보이면 됩니다.

4. Supabase DB를 한 번에 설치

1
supabase/schema.sql을 VS Code나 메모장으로 엽니다.
2
Ctrl+A → Ctrl+C로 전체 복사합니다.
3
Supabase → SQL Editor → New query → 붙여넣기 → Run.

설치되는 핵심 테이블은 다음과 같습니다.

테이블역할
profiles사용자 표시명과 user/admin 역할
videosYouTube 영상, 공개/비공개, 관리자 숨김/추천
analysesGemini 분석 JSON 원본과 버전
expressions개별 영어 표현, 타임스탬프, CEFR, AI 점수, 대표형
user_expression_progress중요/헷갈림/외움, 듣기·반복·받아쓰기, 개인 메모, 복습일
study_events장기 학습 이벤트 통계
app_settings커뮤니티 운영 설정
app_secretsGemini 키의 AES-GCM 암호문만 저장
community_recommendations관리자 공식 추천 표현
schema.sql은 RLS도 설치합니다. 일반 사용자는 자신의 비공개 데이터만 보고, 공개 전환된 학습자료만 다른 사용자에게 보입니다.
새 프로젝트에서 먼저 실행하는 것을 권장합니다. 기존에 같은 이름의 자체 테이블/함수가 있는 Supabase에 합치려면 별도 마이그레이션 검토가 필요합니다.

5. 브라우저용 Supabase 정보 입력

Cloudflare 환경변수는 서버 Functions용입니다. 정적 브라우저 JavaScript에는 별도로 Supabase Project URL과 Publishable Key를 넣어야 합니다.

1
Supabase Dashboard의 Connect 또는 Settings → API Keys에서 Project URL과 Publishable key를 복사합니다.
2
public/assets/js/config.js를 열어 아래 두 값만 바꿉니다.
export const APP_CONFIG = { SUPABASE_URL: 'https://xxxxx.supabase.co', SUPABASE_PUBLISHABLE_KEY: 'sb_publishable_xxxxx' };
Publishable Key는 웹/모바일 같은 공개 클라이언트용 키입니다. Secret Key와 완전히 다릅니다. RLS를 반드시 함께 사용해야 합니다.
절대 금지: 여기에 sb_secret_..., legacy service_role, Gemini API Key를 넣지 마세요.

6. Supabase 로그인 설정

이메일 로그인

Supabase → Authentication → Providers에서 Email provider가 켜져 있는지 확인합니다.

테스트 중 이메일 인증

처음 혼자 테스트할 때 이메일 확인 절차가 번거롭다면 Auth 설정에서 이메일 확인 정책을 확인할 수 있습니다. 실제 공개 서비스에서는 이메일 인증을 사용하는 편이 안전합니다.

배포 후 URL 설정

Cloudflare 배포 후 Supabase → Authentication → URL Configuration에서:

Site URL https://내프로젝트.pages.dev Redirect URLs (로컬 개발을 할 경우 추가) http://localhost:8788/**

7. GitHub Private 저장소에 업로드

초보자에게 쉬운 GitHub Desktop 방법

1
GitHub Desktop 설치 후 로그인.
2
File → Add Local Repository. 저장소가 아니라는 안내가 나오면 Create a repository를 선택해 이 프로젝트 폴더를 지정합니다.
3
첫 Commit을 만든 뒤 Publish repository.
4
Keep this code private가 체크되어 있는지 확인한 뒤 업로드합니다.
업로드 전 프로젝트 전체에서 실제 AIza...나 sb_secret_... 키를 직접 적은 적이 없는지 확인하세요. 이 배포본에는 실제 키가 포함되어 있지 않습니다.

터미널 방법

git init git add . git commit -m "TubeEnglish Study v1.2.0" git branch -M main git remote add origin https://github.com/내계정/내저장소.git git push -u origin main

8. GitHub Private 저장소를 Cloudflare Pages에 연결

1
Cloudflare Dashboard → Workers & Pages → Pages 프로젝트 생성/기존 Git repository 연결.
2
GitHub 권한을 연결하고 방금 만든 Private repository를 선택합니다.
3
빌드 설정을 아래처럼 입력합니다.
설정값
Production branchmain
Framework presetNone
Build commandexit 0
Build output directorypublic
Root directory비움

Cloudflare의 현재 Static HTML 안내에서도 build가 필요 없는 프로젝트에 exit 0과 정적 output directory 사용을 안내합니다. functions 폴더는 public 안이 아니라 저장소 최상위에 있어야 Pages Functions 라우트가 생성됩니다.

9. Cloudflare Variables and Secrets 설정

v1.2.0 중요 안내
이 프로젝트는 저장소 최상위의 wrangler.toml을 Cloudflare Pages 설정 파일로 사용합니다. 이 경우 Cloudflare Dashboard의 Variables and Secrets 화면에서 일반 Variable 타입을 선택하지 못하고 Secret으로 고정되어 보일 수 있습니다. 오류가 아닙니다. 일반 Variable은 wrangler.toml에 등록하고, 민감한 Secret만 Cloudflare Dashboard에 등록하면 됩니다.

9-1. 먼저 전체 설정 구조를 이해하세요

TubeEnglish Study v1.2.0에서는 아래처럼 두 곳에 나누어 설정하는 것을 권장합니다.

이름저장 위치값 예시필수 여부
SUPABASE_URLwrangler.tomlhttps://xxxxx.supabase.co필수
SUPABASE_PUBLISHABLE_KEYwrangler.tomlsb_publishable_xxxxx필수
GEMINI_MODELwrangler.tomlgemini-3.7-flash기본값이며 관리자 화면 선택값이 우선
GEMINI_THINKING_LEVELwrangler.tomlmedium권장
GEMINI_API_REVISIONwrangler.toml2026-05-20권장
MAX_ANALYSES_PER_DAYwrangler.toml10권장
SUPABASE_SECRET_KEYCloudflare Secretsb_secret_xxxxx필수
APP_ENCRYPTION_KEYCloudflare Secret32바이트 Base64필수
GEMINI_API_KEYCloudflare Secret 또는 관리자 화면선택 fallback선택
Cloudflare 화면에서 Type이 Secret으로 고정되어 있어도 정상입니다.
일반 Variable을 억지로 Secret으로 등록하지 말고 아래 9-2 단계에서 wrangler.toml에 넣으세요. wrangler.toml을 삭제할 필요도 없습니다.

9-2. 일반 Variable 6개를 wrangler.toml에 등록

초보자에게는 GitHub 웹사이트에서 직접 파일을 수정하는 방법이 가장 쉽습니다.

1
GitHub에서 tubeenglish-study 저장소를 엽니다.

파일 목록에서 저장소 최상위의 wrangler.toml을 클릭합니다.

2
연필 모양 Edit 버튼을 누릅니다.

현재 파일은 보통 아래처럼 시작합니다.

name = "tubeenglish-study" pages_build_output_dir = "public" compatibility_date = "2026-09-01"
3
파일 맨 아래에 아래 내용을 추가합니다.

SUPABASE_URL과 SUPABASE_PUBLISHABLE_KEY 두 값만 본인 Supabase 값으로 바꾸고, 나머지는 아래 값을 그대로 사용하면 됩니다.

[vars] SUPABASE_URL = "https://xxxxx.supabase.co" SUPABASE_PUBLISHABLE_KEY = "sb_publishable_xxxxx" GEMINI_MODEL = "gemini-3.7-flash" GEMINI_THINKING_LEVEL = "medium" GEMINI_API_REVISION = "2026-05-20" MAX_ANALYSES_PER_DAY = "10"
이미 [vars]가 있다면 두 번 만들지 마세요.
기존 [vars] 아래에 필요한 항목만 추가하거나 값을 수정합니다.

SUPABASE_URL / Publishable Key는 어디서 찾나요?

Supabase Dashboard → 본인 프로젝트 → Connect 또는 Settings → API Keys에서 확인합니다.

  • Project URL → SUPABASE_URL에 입력
  • Publishable key → SUPABASE_PUBLISHABLE_KEY에 입력
SUPABASE_PUBLISHABLE_KEY는 브라우저 공개용 키이므로 wrangler.toml에 저장할 수 있습니다. 현재 앱의 public/assets/js/config.js에도 같은 종류의 키가 사용됩니다.
절대 넣으면 안 되는 값: SUPABASE_SECRET_KEY, legacy service_role, APP_ENCRYPTION_KEY, Gemini API Key를 wrangler.toml 또는 GitHub 코드에 적지 마세요.
4
GitHub에서 Commit changes를 누릅니다.

Commit 메시지는 예를 들어 Add Cloudflare environment variables라고 입력하면 됩니다. main 브랜치에 반영되면 Cloudflare Pages가 GitHub 연결을 통해 자동으로 새 배포를 시작합니다.

9-3. 민감한 Secret은 Cloudflare Dashboard에 등록

Cloudflare Dashboard → Workers & Pages → tubeenglish-study → Settings → Variables and Secrets로 이동합니다. Production 환경부터 설정하세요.

여기에서 타입이 Secret으로 고정되어 있는 것은 정상입니다. 아래 두 개를 등록합니다.

이름값종류
SUPABASE_SECRET_KEYSupabase의 sb_secret_...Secret · 필수
APP_ENCRYPTION_KEY10번에서 생성한 32바이트 Base64Secret · 필수
GEMINI_API_KEYGemini API KeySecret · 선택
추천: GEMINI_API_KEY는 Cloudflare에 등록하지 않아도 됩니다. 먼저 APP_ENCRYPTION_KEY까지 설정하고 관리자 계정을 만든 뒤, TubeEnglish 관리자 화면에서 Gemini 키를 연결 테스트 → 안전하게 저장하는 방식을 권장합니다.
SUPABASE_SECRET_KEY는 절대 GitHub에 저장하지 마세요. 일반 사용자의 브라우저에도 노출되면 안 되는 서버 전용 키입니다.

9-4. Production과 Preview는 어떻게 하나요?

처음에는 Production만 설정하는 것을 권장합니다. 실제 서비스가 정상 동작한 뒤 GitHub Pull Request나 Preview 배포에서도 서버 기능을 테스트해야 할 때 Preview에도 동일한 Secret을 추가하세요. 일반 Variable 6개는 wrangler.toml에 있으므로 코드와 함께 배포됩니다.

9-5. 저장 후 정상 작동 확인

1
GitHub의 wrangler.toml 변경이 main에 Commit되었는지 확인합니다.
2
Cloudflare → Deployments에서 새 Production 배포가 성공했는지 확인합니다.
3
브라우저에서 아래 주소를 엽니다.
https://내프로젝트.pages.dev/api/health

missing: []이 보이고 Supabase 관련 설정이 정상으로 표시되는지 확인합니다. Gemini 키를 아직 관리자 화면에서 저장하지 않았다면 Gemini 관련 상태는 아직 미설정으로 표시될 수 있습니다.

Supabase 새 Secret Key 호환: 이 코드에서는 새 sb_secret_... 키를 apikey header로 사용하고 Bearer JWT로 잘못 보내지 않게 처리했습니다. legacy service_role JWT도 방어적으로 호환합니다.

10. APP_ENCRYPTION_KEY 1회 생성

이 키는 관리자 화면에서 Gemini API Key를 암호화/복호화하기 위한 마스터 키입니다. 32바이트를 Base64로 만든 값이어야 합니다.

가장 쉬운 방법 — Node.js가 설치되어 있을 때

node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"

출력된 문자열 전체를 Cloudflare의 APP_ENCRYPTION_KEY Secret에 저장합니다.

macOS / Linux 대안

openssl rand -base64 32
이 값을 나중에 임의로 바꾸지 마세요. 기존에 암호화해 저장한 Gemini Key를 복호화할 수 없게 됩니다. 비밀번호 관리자에 별도 백업하세요.

11. 첫 관리자 계정 만들기

1
Cloudflare 배포 주소에서 본인이 사용할 이메일로 회원가입합니다.
2
Supabase → SQL Editor에서 아래 SQL의 이메일만 본인 것으로 바꿔 실행합니다.
update public.profiles p set role = 'admin' from auth.users u where p.id = u.id and u.email = '내이메일@example.com';
3
앱에서 로그아웃 → 다시 로그인. 상단에 관리 버튼이 표시됩니다. 또는 https://내주소/admin.html.

12. 관리자 화면에서 Gemini API Key·무료 모델 연결

Google AI Studio에서 API Key를 생성한 뒤 이 단계에서 저장합니다.

1
Google AI Studio → API Key 메뉴에서 Gemini API Key 생성.
2
TubeEnglish 관리자 → AI·자막 API 탭 → 키 입력.
3
Gemini 3.7 Flash · 권장을 선택하고 연결 테스트를 누릅니다.
4
성공하면 키·모델 저장을 누릅니다. 503이면 Flash-Lite 등 다른 무료 모델을 테스트합니다.
5
429이면 무료 한도 소진입니다. Google AI Studio 사용량에서 현재 프로젝트 한도를 확인합니다.
저장 과정: API Key는 AES-GCM 암호화 후 app_secrets에 저장하고, 선택 모델은 기존 app_settings에 저장합니다. 키 평문은 브라우저로 다시 반환하지 않습니다.
기본 모델은 gemini-3.7-flash입니다. 관리자 화면에서 저장한 모델이 Cloudflare GEMINI_MODEL보다 우선합니다. 자동 재요청은 하지 않습니다.

13. 최초 전체 동작 테스트

아래를 순서대로 하나씩 확인하세요.

  • https://내주소/api/health 접속 — backend_ready: true 확인
  • 회원가입/로그인 성공
  • 관리자 페이지 Gemini 연결 테스트 성공
  • 공개 영어 대화 YouTube URL 입력
  • 최대 10/20/40개 옵션 중 하나로 분석 성공
  • 분석 결과가 새로고침 후에도 최근 영상/보관함에 유지
  • 문장별 ▶ 듣기 → 해당 구간으로 이동
  • 반복 3회/5회/계속이 실제 문장 구간에서 동작
  • 0.75× / 1.0× / 1.25× 속도 변경
  • 일시정지 → 계속 듣기, 정지, 다시 듣기
  • 문장 여러 개 선택 → 선택 문장 연속 듣기
  • 영문/한국어 가리기
  • 받아쓰기 정답/재시도
  • 중요 ★, 헷갈림 ?, 외웠어요, 개인 메모 저장
  • 보관함에서 중요/헷갈림/외움/복습 예정 필터
  • 통계에서 전체/1일/7일/30일/1년 전환
  • 본인 영상 공개 → 다른 일반 계정의 공개 학습에 표시
  • 관리자에서 공개 영상 숨김 → 일반 커뮤니티에서 사라짐
  • 관리자 전체 표현 통계 → 추천 추가 → 공식 추천에 노출
YouTube URL 직접 입력 기능은 Google 문서상 Preview 기능입니다. 공개 영상만 지원되며 Google 측 기능/한도 변경 가능성이 있습니다.

14. 일반 사용자 앱 사용법

가장 기본 사용

  1. 로그인
  2. 홈에서 YouTube URL 붙여넣기
  3. 학습량 10/20/40 선택
  4. 영어 교재 만들기 — 영어 자막을 먼저 자동으로 찾습니다.
  5. 완료 후 핵심 표현과 전체 영어 대본 확인
  6. 각 표현의 영상 원음을 듣고 표시/복습

50분 이상 긴 영상

대본·자막 직접 넣기를 열고 YouTube의 스크립트 표시 내용을 시간과 함께 복사해 붙여넣으세요. TXT, SRT, VTT 파일도 선택할 수 있습니다. 시간 정보가 없는 일반 텍스트는 표현 분석은 가능하지만 잘못된 구간 재생을 막기 위해 문장 듣기가 비활성화됩니다.

영어 듣기 학습 기능

  • 전체 영어 대본 확인
  • 타임스탬프 기반 문장별 영상 구간 재생
  • 1·3·5회·계속 반복
  • 느린 0.5/0.75배 듣기
  • 여러 표현 체크 후 순차 재생
  • 영문 숨기기 → 귀로 먼저 듣기
  • 한국어 숨기기 → 의미 떠올리기
  • 받아쓰기 → 실제 문장 복원 연습

장기 복습 기능

중요/헷갈림/외움 상태, 메모, 반복/듣기 횟수, 복습 예정일이 계정에 축적됩니다. 같은 영상 URL을 다시 넣으면 저장된 교재를 열어 불필요한 AI 호출을 줄입니다.

15. 관리자 센터 사용법

탭할 수 있는 일
운영 설정공개 학습 전체 ON/OFF, 사용자 공개 허용, 전체 통계 공개, 공식 제목
Gemini API키 상태, 후보 연결 테스트, 암호화 저장, 교체, 삭제
전체 URL모든 사용자 업로드 영상 검색/페이지 조회, 공개 자료 숨김, 추천 영상 지정
전체 표현모든 저장 영어 표현/번역/레벨/점수/사용자/영상 검색
전체 통계·추천출현 영상 수, 사용자 수, AI 중요도, 듣기/반복/중요/헷갈림 통계, 공식 추천 표현 관리
전체 통계는 “표현 출현 집계”와 “사용자 학습 행동 집계”를 먼저 따로 계산한 뒤 결합해, 한 표현에 여러 사용자의 progress가 붙어 출현 횟수가 뻥튀기되는 문제를 방지했습니다.

16. 내 PC에서 수정하며 개발하기

1
Node.js LTS와 VS Code를 설치합니다.
2
프로젝트 폴더에서 터미널을 열고:
npm install npm run check
3
.dev.vars.example을 복사하여 .dev.vars를 만들고 본인 서버 설정값을 입력합니다.
SUPABASE_URL="https://xxxxx.supabase.co" SUPABASE_PUBLISHABLE_KEY="sb_publishable_xxxxx" SUPABASE_SECRET_KEY="sb_secret_xxxxx" APP_ENCRYPTION_KEY="생성한_Base64_키" GEMINI_MODEL="gemini-3.7-flash" GEMINI_THINKING_LEVEL="medium" GEMINI_API_REVISION="2026-05-20" MAX_ANALYSES_PER_DAY="10" # GEMINI_API_KEY="선택 fallback"
4
public/assets/js/config.js에도 브라우저용 URL/Publishable Key를 입력합니다.
5
실행:
npm run dev

Wrangler가 표시한 localhost 주소로 접속합니다.

17. 수정한 뒤 Cloudflare에 반영하는 방법

GitHub 연동이 끝나면 배포는 매우 단순합니다.

VS Code에서 파일 수정
↓
npm run check
↓
Git Commit + Push to main
↓
Cloudflare Pages가 자동 build/deploy
git add . git commit -m "Improve study feature" git push

Cloudflare Dashboard의 Deployments에서 성공/실패 여부를 확인하세요.

18. 자주 생기는 문제 해결

화면에 “초기 설정 필요”

public/assets/js/config.js의 Supabase URL/Publishable Key를 확인합니다.

/api/health가 503 또는 backend_ready=false

Cloudflare SUPABASE_URL / SUPABASE_PUBLISHABLE_KEY / SUPABASE_SECRET_KEY를 확인합니다. Gemini 키는 관리자 저장 전이라면 gemini_configured:false일 수 있습니다.

관리자에서 Gemini 키 저장 실패

APP_ENCRYPTION_KEY가 정확한 32바이트 Base64인지 확인합니다.

Functions 404

Cloudflare output은 public, functions 폴더는 저장소 root여야 합니다. 이 프로젝트는 Git integration을 권장합니다.

YouTube 분석 실패 또는 시간초과

공개 영상인지 확인합니다. 50분 이상 영상은 홈에서 대본·자막 직접 넣기를 열고 YouTube 스크립트를 시간과 함께 붙여넣는 방법이 가장 안정적입니다. Gemini 사용 한도와 관리자 모델 설정도 확인하세요.

전체 대본은 있는데 듣기 버튼이 비활성화됨

붙여넣은 텍스트에 타임스탬프가 없기 때문입니다. 시간 표시를 포함해 다시 복사하거나 SRT/VTT 파일을 사용하세요.

같은 URL을 넣었는데 다시 분석되지 않음

의도한 동작입니다. 같은 계정의 동일 YouTube ID는 기존 교재를 엽니다. 대본을 바꿔 다시 만들려면 현재 버전에서는 기존 자료 정리 또는 후속 재분석 기능이 필요합니다.

19. 외부 공개 전 보안·운영 체크

  • GitHub repository가 Private인지
  • GitHub에 Gemini Key / sb_secret / 비밀번호가 없는지
  • Supabase RLS가 켜져 있는지
  • Cloudflare Secret에 SUPABASE_SECRET_KEY / APP_ENCRYPTION_KEY가 있는지
  • 일반 계정으로 다른 사용자의 private video를 직접 읽을 수 없는지
  • 일반 계정으로 analyses/expressions 원본을 직접 INSERT/UPDATE할 수 없는지
  • 관리자 API가 일반 계정에 403을 반환하는지
  • 공개 여부에 관계없이 본인 교재만 보이는지
  • 일반 사용자가 다른 계정의 교재를 직접 조회할 수 없는지
  • 서비스 이용약관·개인정보 처리방침·Google/YouTube 약관을 실제 서비스 형태에 맞게 검토했는지
무료 Gemini 데이터 정책: 무료 티어의 가격·한도·데이터 사용 정책은 변할 수 있으므로 실제 외부 서비스 공개 직전에 Google AI Developer 공식 가격/약관 페이지를 다시 확인하세요.

20. 현재 버전에서 알고 있어야 할 한계와 다음 개발 후보

  • 공개 자막 자동 확인은 YouTube 페이지 형식이나 접근 정책 변경에 따라 실패할 수 있으므로 대본 붙여넣기와 파일 입력을 함께 제공합니다.
  • 영상 URL 분석의 지원 범위는 선택한 Gemini 모델과 API에 따라 다릅니다. 실패하면 시간 포함 대본을 직접 넣으세요.
  • 자동 생성 자막의 단어와 타임스탬프에는 오류가 있을 수 있습니다.
  • 현재 받아쓰기는 대소문자·일부 문장부호를 정규화한 정확 일치 방식입니다.
  • 현재 같은 URL은 저장된 교재를 우선합니다. 재분석/버전 비교 UI는 후속 기능입니다.
  • 대규모 공개 서비스가 되면 작업 큐, 진행상태 재조회, 더 정교한 rate limit과 감사 로그가 필요합니다.
현재 버전의 목표: 긴 영상도 자막·대본 중심으로 안정적으로 교재화하는 개인/가족/소규모 MVP입니다.

21. 백업·복구 — 꼭 설정해 두세요

이 앱은 시간이 지날수록 영상·영어표현·중요/헷갈림 표시·메모·복습기록이 쌓이므로 DB 백업이 매우 중요합니다.

A. 소스코드 백업

  • GitHub Private 저장소 자체가 코드의 1차 백업입니다.
  • 중요 변경 전에는 Git commit을 남기고 버전 태그를 만드세요. 예: v1.0.0.
  • .dev.vars와 실제 Secret은 Git에 올리지 않습니다.

B. Supabase 데이터 백업

Supabase Dashboard의 Database 백업/내보내기 기능은 요금제와 시점에 따라 메뉴가 달라질 수 있습니다. 운영 전 현재 사용 중인 Supabase 플랜의 백업 정책을 확인하세요. 최소한 중요한 시점에는 아래 테이블 데이터를 별도로 내보내 보관하는 것을 권장합니다.

profiles videos analyses expressions user_expression_progress study_events app_settings community_recommendations
app_secrets 주의: Gemini 키 암호문을 백업하더라도 Cloudflare의 APP_ENCRYPTION_KEY가 없으면 복호화할 수 없습니다. 이 마스터 키는 비밀번호 관리자 등 안전한 장소에 별도로 백업하세요.

C. 복구 순서

  1. GitHub에서 정상 동작했던 코드 버전으로 되돌립니다.
  2. 새 Supabase 프로젝트를 만드는 경우 supabase/schema.sql을 먼저 실행합니다.
  3. 백업한 사용자/영상/표현/학습 데이터를 복구합니다.
  4. Cloudflare Variables/Secrets를 다시 등록합니다.
  5. 기존 암호화 Gemini 키를 복구한다면 동일한 APP_ENCRYPTION_KEY를 사용해야 합니다.
  6. /api/health → 로그인 → 저장영상 → 반복듣기 → 관리자 Gemini 테스트 순으로 확인합니다.

D. 실수로 잘못 배포했을 때

Cloudflare Pages Deployments에서 이전 성공 배포 상태를 확인하고, GitHub에서는 정상 commit으로 revert한 뒤 다시 push하는 방법이 가장 이해하기 쉽습니다. DB 스키마를 수정한 배포라면 코드만 되돌리지 말고 DB migration 영향도 함께 확인해야 합니다.

22. 장기 운영·업데이트 방법

업데이트 전 6단계

  1. GitHub에서 새 branch를 만들거나 현재 정상 버전에 tag를 남깁니다.
  2. Supabase DB를 백업합니다.
  3. 코드를 수정합니다.
  4. npm run check를 실행해 실패 0건인지 확인합니다.
  5. 가능하면 Preview 배포에서 일반 사용자/관리자 계정 각각으로 테스트합니다.
  6. 정상일 때 main에 반영합니다.

Gemini 모델이 바뀌었을 때

Cloudflare의 GEMINI_MODEL 값을 바꾸기 전에 Google AI Developer 공식 모델 문서에서 해당 모델이 Interactions API, YouTube URL 입력, Structured Output을 지원하는지 확인합니다. 무료 티어/요금/데이터 정책도 함께 확인하세요.

DB 구조를 바꿀 때

이미 사용 중인 서비스에서는 최신 schema.sql 전체를 무조건 다시 실행하기보다 변경분만 migration SQL로 적용하는 편이 안전합니다. 컬럼 삭제·타입 변경·RLS 정책 변경 전에는 반드시 백업합니다.

사용자가 많아질 때 추가 권장 기능

  • Cloudflare Turnstile로 봇/무단 자동요청 방지
  • 사용자·IP·시간대별 더 정교한 rate limit
  • 관리자 감사 로그
  • 회원 탈퇴와 내 데이터 삭제/내보내기
  • DB 정기 백업·복구 리허설
  • Gemini 비용/무료한도 사용량 모니터링
  • AI 분석 재시도 큐와 실패 로그
  • 프롬프트/모델 버전별 재분석 및 결과 비교
운영 원칙: 이 서비스의 가장 중요한 자산은 시간이 지나며 쌓이는 학습 데이터입니다. 새 기능보다 먼저 “기존 사용자 데이터가 사라지지 않는가”를 확인하세요.

v1.2.0 업데이트 — 기존 사용자부터 읽으세요

적용 순서: DB 백업 → 변경분 SQL → 코드 반영 → 배포 → 학습 저장 확인.

기존 v1.1.0 DB에는 supabase/migrations/20260909_v1_2_0.sql을 실행합니다. 신규 DB는 supabase/schema.sql 전체를 실행합니다. 기존 데이터/테이블을 삭제하는 migration은 아닙니다. RLS 접근 범위는 강화됩니다.

코드만 바꾸면 save_my_progress가 없어 메모·학습 상태 저장이 실패합니다.

새 편의 기능

  • 홈: 마지막으로 연 교재 이어서 학습, 오늘 복습 바로가기.
  • 학습: 검색 결과 전체 선택/해제, 선택 개수 표시, 외운 표현 진행률, 0.5배속.
  • 반복/속도는 계정별·기기별 기억. 글자 크기는 기기별 기억.
  • 메모·받아쓰기 임시 입력은 화면 갱신과 검색 필터 변경 중 보존됩니다. 메모 저장 버튼을 눌러야 계정에 저장되며 새로고침/로그아웃 전에는 꼭 저장하세요.
  • 보관함은 50개씩 이전/다음 페이지를 제공합니다.
  • 영상이 막히면 표현을 읽으면서 영상 다시 불러오기/YouTube 열기를 이용하세요.

GitHub에 수정 파일 반영하기

  1. ZIP에는 Git 이력인 .git 폴더가 없습니다. ZIP을 푼 폴더에서 바로 git status를 실행하면 저장소가 아니라고 나옵니다.
  2. 이미 clone한 저장소 폴더를 사용하거나 새 폴더에 clone합니다.
  3. 압축 내부 tubeenglish-study-main의 내용물을 저장소 최상위에 복사·병합합니다. 기존 config.js 및 직접 수정한 파일은 CHANGED_FILES.md를 보며 먼저 비교하세요. 비밀키 파일은 덮어쓰지 마세요.
  4. 변경 내용을 확인한 뒤 커밋하고 푸시합니다. 아래 명령은 clone된 저장소 내부에서 실행합니다.
git status
node scripts/check.mjs
node --test tests/*.test.mjs
git diff --stat
git add .
git diff --cached --stat
git commit -m "Improve study usability and security for v1.2.0"
git push

HTTPS 인증에서 GitHub 계정 비밀번호를 입력하면 인증되지 않습니다. GitHub가 지원하는 토큰 또는 인증 도구를 사용하세요. 토큰을 채팅이나 소스코드에 붙이지 마세요. GitHub 인증 안내

배포 후 확인

  1. 일반 계정: 로그인, 기존 영상 열기, 메모 저장, 반복 듣기, 외웠어요, 보관함 검색.
  2. 설정: 이름, 세 단계 글자 크기, 비밀번호 복구 메일과 새 비밀번호 저장.
  3. 관리자: 사용자 목록, 시험 계정 역할 변경, Gemini 연결 테스트, 공개 학습 켜기/끄기.
  4. 서로 다른 두 계정으로 비공개 영상 접근이 차단되는지 확인.
  5. 휴대폰/태블릿/PC에서 메뉴, 긴 제목, 글자 확대, 표 스크롤과 실제 YouTube 재생 확인.

자동 검사는 실제 Supabase SQL 실행, 이메일 수신, Cloudflare 배포, 실제 Gemini/YouTube 호출, 실브라우저 화면 검증을 대신하지 않습니다. 자세한 결과는 TEST_REPORT.md에 기록했습니다.

v1.9.26 문단 학습 업데이트

문단를 펼치고 영어 가리기를 누르면 한국어를 보고 영어로 말할 수 있습니다. 문장을 누르면 핵심 표현·단어 뜻이 열립니다. 기존 내 교재에서 부족한 뜻은 보완 버튼을 눌렀을 때 불러오며, 실패하면 뜻 다시 불러오기를 누르세요. 보완된 뜻은 DB에 저장하여 계속 재사용됩니다. 공개 교재에서는 저장된 설명만 표시합니다.

GitHub 반영 후 Cloudflare 자동 배포가 완료되면 새로고침하세요. SQL 및 환경변수 추가 작업은 없습니다.

v1.9.27 핵심 표현·화면 테마

핵심 표현 문장을 누르면 핵심 표현·단어의 뜻이 펼쳐집니다. 오른쪽 상단에서 다크/라이트를 바꾸고, 앱 설정의 화면 테마에서 기기 설정 따라가기를 선택할 수 있습니다. 선택은 같은 브라우저에서 로그아웃 후에도 유지되어 로그인 화면부터 적용됩니다. 패러그래프 탭은 문단 학습으로 표시하며 핵심 표현 다음에 배치합니다.

Cloudflare 자동 배포 완료 후 새로고침하세요. SQL이나 환경변수 수정은 없습니다. 부족한 문장 뜻은 무료 모델로 처음 불러와 DB에 저장하여 계속 재사용합니다.

v1.9.28 문장 뜻 생성·저장

새 교재는 문장별 핵심 표현·단어 뜻을 함께 생성하고 저장합니다. 문장을 펼치는 것만으로 AI를 호출하지 않습니다. 누락된 뜻은 뜻 생성하기, 부족한 뜻은 뜻 보완하기 버튼으로 한 문장만 요청합니다. 수동 보완도 DB에 저장합니다.

기존 설치에서는 supabase/lesson_glossary_v1_9_28.sql이 필요합니다. 현재 연결된 tubeenglish-study 프로젝트에는 적용 완료했습니다. 이후 GitHub main의 Cloudflare 배포 완료를 확인하고 새로고침하세요. 문단 진도와 다른 기능용 테이블은 유지됩니다.

v1.9.29 문단 추가·핵심 동사

초기 목표는 3개이며 처음에는 최대 3개를 자동 생성합니다. 원문 3문장을 먼저 고정하고 AI가 번역·표현·동사·단어 뜻을 채웁니다. 부족하거나 더 공부하고 싶으면 문단 1개 추가, 3개 묶음, 목표까지 보완을 사용하세요. 번역·뜻이 부족하면 기존 문단 보완 버튼을 사용합니다. 중복과 문장 대부분이 겹치는 후보는 제외합니다.

새 교재는 핵심 동사를 별도로 분류합니다. 기존 문장은 뜻 보완하기로 채울 수 있습니다. 현재 연결된 프로젝트의 SQL은 적용 완료했습니다. Cloudflare 배포 완료 후 새로고침하세요.