TESOL 강의실

CLASS-ONLINE · /my-class/online

실제 화면 열기 ↗
기능
7
API 호출
0
가드레일
9
id 가 테스트 이름
구현 단계
11 / 11
완료수강 · 커리큘럼wvctesol-api :8080로그인 필요서버 컴포넌트34

개발 스펙

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

  • 유닛 · 레슨 · 강의영상 · 시험 · 교재를 한 표에서 본다.
  • Video 버튼으로 강의를 재생한다.
  • Quiz 칸에서 점수를 보거나 다음 차수 시험으로 들어간다.

비즈니스 규칙 (3)

  • Quiz 칸: 이미 친 차수는 점수 링크로, 아직이면 **다음 한 차수만** 응시 버튼으로. 통과했으면 버튼 없음.
    근거: myOnlineClass.php:113~135
  • 오픈 플래그가 아니면 Quiz 칸 자체를 그리지 않는다.
    근거: myOnlineClass.php:113,114
  • 커리큘럼은 unit · lesson 테이블이 정본이다. 화면에 적어 두지 않는다.

API (2)

메서드경로권한모듈 · 설명
GET/api/learning/courses/{course}/curriculum수강생
유닛 · 레슨 · 영상 ID.
domains:learning:learning-web
응답: { units: [{ unitNo, title, lessons: [{ no, title, vimeoId }] }] }
GET/api/learning/courses/{course}/progress수강생
유닛별 응시 현황(차수 점수 · 통과 여부)과 다음 응시 가능 차수.
domains:learning:learning-web

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

id반드시 만족해야 하는 것등급
books-require-login
로그인하지 않으면 강의 교재를 받을 수 없다.
원본은 교재를 웹 루트 아래(_upload/books · tecbooks · phonics)에 두어 주소만 알면 로그인 없이도 받을 수 있었다(36개 전부 확인). 우리는 웹에서 닿지 않는 자리(upload-root)에 두고 서버가 내려 준다.
critical
books-require-course-access
수강 권한이 없는 과정의 교재는 받을 수 없다.
원본은 TESOL 만 검사했고(_download_books.php), TEC · 파닉스는 그 검사를 주석 처리해 두어 로그인만 하면 누구나 받을 수 있었다. 우리 강의실은 세 과정 모두 수강 권한으로 막고 있어, 화면에서 막은 것을 내려받기에서 열어 두면 그대로 우회가 된다.
critical
books-not-servable-by-asset-path
교재는 공개 자산 경로로 열리지 않는다.
공개 이미지(ASSET_ROOT)와 교재(upload-root)는 다른 자리에 둔다. 한 자리에 섞으면 주소만 알면 누구나 교재를 받아 간다 — 원본이 그랬다.
critical
books-download-works
수강 중인 과정의 교재는 PDF 로 내려온다.
high
books-unknown-unit-404
없는 차수를 지목하면 404 다.
normal
classroom-next-kind-only-one
한 유닛에 응시 버튼이 두 개 이상 보이면 안 된다. 다음 차수 하나만.
high
classroom-no-quiz-when-closed
수강기간이 아니거나 미결제면 응시 버튼이 나오면 안 된다.
critical
classroom-lesson-count-matches-db
화면의 레슨 수가 DB 의 레슨 수와 같아야 한다(TESOL 36, TEC 56).
UNIT2 의 첫 레슨이 화면에서 빠져 영상이 한 칸씩 밀렸던 버그.
high
classroom-video-id-matches-lesson
Video 버튼이 여는 영상이 그 줄의 레슨과 일치해야 한다.
high

구현 계획 (11/11)

  1. LectureBook — 과정·차수 → 파일 이름. 원본 _Env.php 의 목록 그대로learning-domain
  2. DocumentStorage.read(LectureBook) — 폴더 밖으로 나가지 않는지 확인learning-infrastructure
  3. LearningUseCase.book — 세 과정 모두 수강 자격을 본다learning-app
  4. GET /api/learning/students/me/books?course&unitlearning-web
  5. 교재 36개를 upload-root 로 이관(scripts/fetch-lecture-books.sh)wvctesol-server
  6. CurriculumUnit · ScoreReport · StudentInfo · 포트 2개learning-domain
  7. LearningUseCase · CourseCataloglearning-app
  8. Curriculum · Learner 어댑터learning-infrastructure
  9. /api/learning/courses/{course}/curriculum 구현learning-web
  10. /api/learning/courses/{course}/progress 구현learning-web
  11. 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 로 자른다.

테스트 방법 (9)

가드레일종류확인 방법
books-require-logine2e토큰 없이 부르면 401
books-require-course-accesse2e파닉스 미결제 계정 → 403 COURSE_NOT_OPEN
books-not-servable-by-asset-pathe2e/_upload/books/... 로 열면 404
books-download-workse2eTESOL · TEC 교재가 %PDF 로 내려온다
books-unknown-unit-404e2eunit=99 → BOOK_NOT_FOUND
classroom-next-kind-only-onee2e한 유닛 행의 "Start Quiz" 버튼 개수를 세어 1 이하임을 단언
classroom-no-quiz-when-closede2ecyber_yn=N 계정으로 강의실 조회 → 응시 버튼이 0개
classroom-lesson-count-matches-dbe2e화면의 Video 버튼 수와 DB lesson 수를 비교(TESOL 36, TEC 56)
classroom-video-id-matches-lessone2e임의 행의 Video 클릭 후 iframe src 의 vimeo id 가 해당 lesson.vimeo_id 와 일치

스냅샷

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

CLASS-ONLINE 스냅샷

기능 목록 (7)

데이터
  • ·조회 조건notice
상태
  • ·화면 상태activeVideo
미디어
  • ·Vimeo 영상
인증
  • ·세션 확인
  • ·로그인 필요proxy 가 /login 으로 보냄
하드코딩
  • ·하드코딩 데이터videoColors
  • ·하드코딩 데이터tabs

화면 이동

← 이 화면으로 오는 곳
이 화면에서 가는 곳 →

연결

API

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

소스
src/app/my-class/online/page.tsx