강의 영상

CLASS-LECTURE-VIDEO-DETAIL · /my-class/lecture-video/[unit]/[lesson]

기능
2
API 호출
0
가드레일
12
id 가 테스트 이름
구현 단계
12 / 12
완료수강 · 커리큘럼wvctesol-api :8080로그인 필요서버 컴포넌트동적 라우트90

개발 스펙

이 화면에서 할 수 있어야 하는 것 (1)

  • 유닛 · 레슨에 해당하는 Vimeo 영상을 본다.

비즈니스 규칙 (1)

  • 영상 ID 는 lesson.vimeo_id 가 정본이다.

API (1)

메서드경로권한모듈 · 설명
GET/api/learning/lessons/{course}/{unit}/{lesson}수강생
레슨 · 영상 정보.
domains:learning:learning-web
404 LESSON_NOT_FOUND

가드레일 (12) — id 가 곧 테스트 이름이다

id반드시 만족해야 하는 것등급
progress-percent-from-server
시청 비율은 서버가 seconds/duration 으로 계산해야 한다. 요청값을 쓰면 안 된다.
화면이 보낸 값을 믿으면 100% 를 그냥 보낼 수 있다.
critical
progress-own-only
요청에 회원을 담아 보내도 남의 진도를 조작·조회할 수 없어야 한다.
critical
progress-requires-login
비로그인은 기록도 조회도 할 수 없어야 한다.
critical
progress-latest-first
playdata 배열 맨 앞이 최신이어야 한다. 이어보기가 그 값을 쓴다.
원본이 array_unshift 로 앞에 끼워 넣는다(vimeo_timeline.php).
high
progress-rejects-bad-values
유닛·레슨이 0 이하거나 길이가 0·비정상이면 저장하지 않아야 한다.
high
progress-per-course
TESOL 과 TEC 진도가 섞이면 안 된다.
high
progress-completed-threshold
95% 이상이면 완료로 본다.
원본에는 이 판정이 없었다 — playdata 를 쌓기만 하고 pass_yn 은 늘 N 이다. 화면에 진도를 그리려면 기준이 필요한데, 끝까지 재생하지 않아도 사실상 다 본 경우가 많다.
normal
progress-shown-in-classroom
본 레슨에는 강의실에 진도가 보여야 한다.
normal
progress-not-shown-when-unseen
안 본 레슨에 0% 를 띄우면 안 된다.
안 본 것과 못 읽은 것이 같아 보인다.
normal
progress-resume-position
영상 화면이 마지막 위치를 들고 와야 한다.
normal
progress-player-loads
영상 화면이 오류 없이 떠야 한다.
normal
video-requires-entitlement
수강권이 없는 사용자가 영상 정보를 받아가면 안 된다.
critical

구현 계획 (12/12)

  1. LectureProgress · LessonProgress 값 객체 (비율 계산 · 완료 기준)learning-domain
  2. LectureProgressRepository 포트learning-domain
  3. 유스케이스 — 수강권 확인 후 기록·조회learning-app
  4. playdata JSON 배열 앞에 끼워 넣기 + 학습일 하루 1건learning-infrastructure
  5. POST /progress · GET /progress · GET /progress/{unit}/{lesson}learning-web
  6. LecturePlayer — Vimeo SDK 로 60초마다 기록, 이어보기wvctesol
  7. 강의실 레슨별 진도 배지wvctesol
  8. CurriculumUnit · ScoreReport · StudentInfo · 포트 2개learning-domain
  9. LearningUseCase · CourseCataloglearning-app
  10. Curriculum · Learner 어댑터learning-infrastructure
  11. /api/learning/lessons/{course}/{unit}/{lesson} 구현learning-web
  12. Next.js 를 BFF 로 전환 — Prisma 직접 접근 제거wvctesol

서버 사이드 구현 계획 — 자바 객체별 요구사항 (5/5)

객체모듈책임 · 지켜야 할 것
ScoreReport
record
learning-domain
성적표 계산. 원본 resultOfCourse.php:99~143.
  • 평균의 분모는 합격 유닛 수다. 전체 유닛 수로 나누면 안 된다.
  • 통과한 유닛에서 가장 나중 차수부터 거슬러 올라가 70점 이상인 첫 점수를 쓴다(C→B→A).
  • 합격 유닛이 0 이면 0 을 돌려준다 — 0 으로 나누지 않는다.
  • BigDecimal 로 소수점 2자리를 만든다. double 은 표시가 흔들린다.
CourseCatalog
class
learning-app
과정별 상수(유닛 수 · 차수 순서 · 시험 유무).
  • 원본이 _Env.php 와 _exam*.php 에 흩어 두었던 값을 한곳에 모은다.
  • PHONICS·TEACHING 은 hasExam=false — 이 과정에는 시험이 없다.
LearningUseCase
service
learning-app
커리큘럼 · 성적표 · 학생정보 조회.
  • 모든 조회가 수강권 확인을 먼저 한다. 과정마다 보는 플래그가 다르다.
  • memberId 는 토큰에서만 온다 — 파라미터로 받으면 남의 성적표를 볼 수 있다.
CurriculumRepositoryAdapter
class
learning-infrastructure
unit · lesson 조회.
  • unit · lesson 이 정본이다. 화면에 배열로 두면 DB 와 어긋난다(UNIT2 레슨 누락 버그의 원인).
  • left join 이라 레슨이 없는 유닛도 목록에 남는다.
LearnerRepositoryAdapter
class
learning-infrastructure
수강 자격 · 성적 · 학생정보 조회.
  • 과정별로 컬럼을 통째로 갈아 끼운다 — TESOL 은 pass_yn/certi_yn/entrance, TEC 은 *_tec_yn.
  • 스캔본 노출은 조건이 하나 더 붙는다: 결제+준비완료 **+ 사이버승인 + 합격**.
  • 합격일은 pass_date 앞 8자리를 YYYY-MM-DD 로 자른다.

테스트 방법 (12)

가드레일종류확인 방법
progress-percent-from-servere2e요청에 percent·completed 를 실어 보내도 서버 계산값이 나온다
progress-own-onlye2e요청에 memberId·loginId 를 담아도 본인 것만 바뀐다
progress-requires-logine2e토큰 없이 POST·GET → 401
progress-latest-firste2e30 → 60 → 90 기록 후 조회하면 90
progress-rejects-bad-valuese2e유닛 0 · 음수 초 · 길이 0 · 999999초 → 거부
progress-per-coursee2eTESOL 기록 후 TEC 조회가 같은 값이 아님
progress-completed-thresholde2e96% 기록 → completed true
progress-shown-in-classroome2e진도를 남긴 뒤 강의실에 배지가 보임
progress-not-shown-when-unseene2e배지 수 < 레슨 행 수
progress-resume-positione2e기록한 초가 data-resume-seconds 로 내려옴
progress-player-loadse2e200 + 플레이어 보임 + JS 오류 0
video-requires-entitlemente2e수강권 없는 계정으로 레슨 API 호출 → 403

정하지 못한 것 · 확인이 필요한 것

  • 진도(lecture_progress)는 원본에서도 수강생 화면이 쓰지 않는다(관리자 통계 전용). 시청 추적을 붙일지 정해야 한다.

스냅샷

로그인 세션으로 촬영한 실제 화면입니다.

CLASS-LECTURE-VIDEO-DETAIL 스냅샷

기능 목록 (2)

미디어
  • ·Vimeo 영상
인증
  • ·로그인 필요proxy 가 /login 으로 보냄

화면 이동

← 이 화면으로 오는 곳

없음

이 화면에서 가는 곳 →

연결

API

직접 호출하는 API 가 없습니다

소스
src/app/my-class/lecture-video/[unit]/[lesson]/page.tsx