수강 · 커리큘럼
강의를 보여 주고 성적표를 만든다. 볼 자격이 있는지 먼저 묻는다.
:8080
클래스
25
포트
4
interface
엔드포인트
15
화면
13
가드레일
53
critical 21
이 도메인의 자리
100%휠로 확대 · 끌어서 이동
이어진 곳
이 도메인이 쓰는 것 →
없다. 다른 도메인을 모른다.
← 이 도메인을 쓰는 곳
없다.
공용 모듈
common-appcommon-domaincommon-infrastructurecommon-securitycommon-utilscommon-web다루는 테이블
원본 대응
myclass/*.php타입 구조 (25)
Spring 소스를 직접 읽어 그린다. 계층 사이 화살표만 그렸다 — 타입 하나하나를 이으면 읽을 수 없다. 파란 테두리가 포트(interface)다.
100%휠로 확대 · 끌어서 이동
app 2domain 17infrastructure 4web 2포트 (4) — 도메인이 바깥에 요구하는 것
도메인은 DB 도 HTTP 도 모른다. 필요한 것을 인터페이스로 선언하고, infrastructure 가 그것을 구현한다. 의존이 뒤집히는 지점이다.
| 이름 | 하는 일 | 메서드 |
|---|---|---|
CurriculumRepositorydomain | - | |
DocumentStoragedomain | 수강생 자료 파일 저장소. | |
LearnerRepositorydomain | - | |
LectureProgressRepositorydomain | 강의 시청 진도. |
도메인 모델 (13)
CertificateAddressrecord | 자격증을 받을 주소. |
CertificateAddressEligibilityclass | 자격증 배송 주소를 넣을 수 있는가. |
CertificateStatusrecord | 자격증 관련 상태. |
CurriculumUnitrecord | 유닛과 그 레슨들. |
LectureBookrecord | 강의 교재(PDF). |
LectureProgressrecord | 강의 시청 진도. |
Lessonrecord | 레슨. |
LessonPlayLogrecord | 한 레슨의 재생 기록 전체. |
LessonProgressrecord | 한 레슨의 진도 요약. |
PlaySessionrecord | 재생 기록 한 건. |
ScoreReportrecord | 과정 성적표. |
StudentDocumentrecord | 수강생에게 내려 주는 파일 한 건. |
StudentInforecord | 학생 정보. |
유스케이스 (2)
CourseCatalog33줄 | 과정별 상수. lastUnit()kindsHighestFirst()hasExam() |
LearningUseCase226줄 | 수강 관련 조회. curriculum()lesson()scoreReport()studentInfo()recordProgress()lessonProgress()courseProgress()certificateAddress() |
엔드포인트 (15)
100%휠로 확대 · 끌어서 이동
| 메서드 | 경로 | 컨트롤러 |
|---|---|---|
GET | /api/learning/admin/courses/{course}/units관리자 | AdminCurriculumController |
GET | /api/learning/admin/members/{memberId}/progress관리자 | AdminCurriculumController |
GET | /api/learning/my-courses | LearningController |
GET | /api/learning/courses/{course}/curriculum | LearningController |
GET | /api/learning/courses/{course}/score-report | LearningController |
GET | /api/learning/lessons/{course}/{unit}/{lesson} | LearningController |
GET | /api/learning/students/me | LearningController |
POST | /api/learning/progress | LearningController |
GET | /api/learning/progress/{unit}/{lesson} | LearningController |
GET | /api/learning/progress | LearningController |
GET | /api/learning/students/me/certificate-address | LearningController |
POST | /api/learning/students/me/certificate-address | LearningController |
GET | /api/learning/students/me/entrance | LearningController |
GET | /api/learning/students/me/scan | LearningController |
GET | /api/learning/students/me/books | LearningController |
화면 흐름 (13개 화면)
이 도메인이 받는 화면끼리의 이동입니다. 다른 도메인으로 나가는 이동까지 함께 보려면 화면 흐름 → 수강 · 커리큘럼 으로 갑니다.
100%휠로 확대 · 끌어서 이동
이 도메인을 쓰는 화면 (13)
critical 가드레일 (21)
books-require-login로그인하지 않으면 강의 교재를 받을 수 없다.books-require-course-access수강 권한이 없는 과정의 교재는 받을 수 없다.books-not-servable-by-asset-path교재는 공개 자산 경로로 열리지 않는다.classroom-no-quiz-when-closed수강기간이 아니거나 미결제면 응시 버튼이 나오면 안 된다.score-average-excludes-failed평균의 분모는 합격 유닛 수여야 한다. 전체 유닛 수로 나누면 안 된다.profile-change-requires-login로그인하지 않으면 이름 · 영문 이름을 바꿀 수 없다.document-path-stays-in-kind-dirDB 의 파일 경로가 자료 종류 디렉터리를 벗어나면 읽지 않아야 한다.document-requires-login토큰 없이 자료를 받을 수 없어야 한다.student-scan-requires-pass합격 전에는 스캔본 다운로드가 노출되지도, API 로 받아지지도 않아야 한다.student-own-data-only항상 로그인한 본인 정보만 나와야 한다.certificate-address-requires-issued합격 + 자격증발급이 아니면 배송 주소를 조회도 저장도 할 수 없어야 한다.certificate-address-own-only요청에 회원을 담아 보내도 남의 주소를 바꿀 수 없어야 한다.progress-percent-from-server시청 비율은 서버가 seconds/duration 으로 계산해야 한다. 요청값을 쓰면 안 된다.progress-own-only요청에 회원을 담아 보내도 남의 진도를 조작·조회할 수 없어야 한다.progress-requires-login비로그인은 기록도 조회도 할 수 없어야 한다.video-requires-entitlement수강권이 없는 사용자가 영상 정보를 받아가면 안 된다.myclass-shows-only-entitled수강권이 없는 과정은 입구가 열려 보이면 안 된다.classroom-tec-uses-tec-flagsTESOL 수강권만 있는 사용자에게 TEC 강의실이 열리면 안 된다.student-tec-uses-tec-columnsTEC 화면에 TESOL 합격여부·자격증여부가 표시되면 안 된다.phonics-requires-own-flagTESOL 수강권만으로 파닉스 강의실이 열리면 안 된다.teaching-requires-own-flagteaching_yn 이 Y 가 아니면 열리면 안 된다.