강의 영상
CLASS-LECTURE-VIDEO-DETAIL · /my-class/lecture-video/[unit]/[lesson]
기능
2
API 호출
0
가드레일
12
id 가 테스트 이름
구현 단계
12 / 12
개발 스펙
이 화면에서 할 수 있어야 하는 것 (1)
- 유닛 · 레슨에 해당하는 Vimeo 영상을 본다.
비즈니스 규칙 (1)
- 영상 ID 는 lesson.vimeo_id 가 정본이다.
API (1)
| 메서드 | 경로 | 권한 | 모듈 · 설명 |
|---|---|---|---|
GET | /api/learning/lessons/{course}/{unit}/{lesson} | 수강생 | 레슨 · 영상 정보. domains:learning:learning-web404 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)
- ●LectureProgress · LessonProgress 값 객체 (비율 계산 · 완료 기준)
learning-domain - ●LectureProgressRepository 포트
learning-domain - ●유스케이스 — 수강권 확인 후 기록·조회
learning-app - ●playdata JSON 배열 앞에 끼워 넣기 + 학습일 하루 1건
learning-infrastructure - ●POST /progress · GET /progress · GET /progress/{unit}/{lesson}
learning-web - ●LecturePlayer — Vimeo SDK 로 60초마다 기록, 이어보기
wvctesol - ●강의실 레슨별 진도 배지
wvctesol - ●CurriculumUnit · ScoreReport · StudentInfo · 포트 2개
learning-domain - ●LearningUseCase · CourseCatalog
learning-app - ●Curriculum · Learner 어댑터
learning-infrastructure - ●/api/learning/lessons/{course}/{unit}/{lesson} 구현
learning-web - ●Next.js 를 BFF 로 전환 — Prisma 직접 접근 제거
wvctesol
서버 사이드 구현 계획 — 자바 객체별 요구사항 (5/5)
| 객체 | 모듈 | 책임 · 지켜야 할 것 |
|---|---|---|
● ScoreReportrecord | learning-domain | 성적표 계산. 원본 resultOfCourse.php:99~143.
|
● CourseCatalogclass | learning-app | 과정별 상수(유닛 수 · 차수 순서 · 시험 유무).
|
● LearningUseCaseservice | learning-app | 커리큘럼 · 성적표 · 학생정보 조회.
|
● CurriculumRepositoryAdapterclass | learning-infrastructure | unit · lesson 조회.
|
● LearnerRepositoryAdapterclass | learning-infrastructure | 수강 자격 · 성적 · 학생정보 조회.
|
테스트 방법 (12)
| 가드레일 | 종류 | 확인 방법 |
|---|---|---|
progress-percent-from-server | e2e | 요청에 percent·completed 를 실어 보내도 서버 계산값이 나온다 |
progress-own-only | e2e | 요청에 memberId·loginId 를 담아도 본인 것만 바뀐다 |
progress-requires-login | e2e | 토큰 없이 POST·GET → 401 |
progress-latest-first | e2e | 30 → 60 → 90 기록 후 조회하면 90 |
progress-rejects-bad-values | e2e | 유닛 0 · 음수 초 · 길이 0 · 999999초 → 거부 |
progress-per-course | e2e | TESOL 기록 후 TEC 조회가 같은 값이 아님 |
progress-completed-threshold | e2e | 96% 기록 → completed true |
progress-shown-in-classroom | e2e | 진도를 남긴 뒤 강의실에 배지가 보임 |
progress-not-shown-when-unseen | e2e | 배지 수 < 레슨 행 수 |
progress-resume-position | e2e | 기록한 초가 data-resume-seconds 로 내려옴 |
progress-player-loads | e2e | 200 + 플레이어 보임 + JS 오류 0 |
video-requires-entitlement | e2e | 수강권 없는 계정으로 레슨 API 호출 → 403 |
정하지 못한 것 · 확인이 필요한 것
- 진도(lecture_progress)는 원본에서도 수강생 화면이 쓰지 않는다(관리자 통계 전용). 시청 추적을 붙일지 정해야 한다.
스냅샷
로그인 세션으로 촬영한 실제 화면입니다.

기능 목록 (2)
미디어
- ·Vimeo 영상
인증
- ·로그인 필요
proxy 가 /login 으로 보냄
화면 이동
← 이 화면으로 오는 곳
없음
이 화면에서 가는 곳 →
CLASS-ONLINE/my-class/online
연결
API
직접 호출하는 API 가 없습니다
소스
src/app/my-class/lecture-video/[unit]/[lesson]/page.tsx