시험 · 평가
응시 자격을 판정하고 채점한다. 레벨테스트도 여기 있다.
:8080
클래스
40
포트
6
interface
엔드포인트
9
화면
7
가드레일
40
critical 15
이 도메인의 자리
100%휠로 확대 · 끌어서 이동
이어진 곳
이 도메인이 쓰는 것 →
없다. 다른 도메인을 모른다.
← 이 도메인을 쓰는 곳
없다.
공용 모듈
common-appcommon-domaincommon-infrastructurecommon-securitycommon-utilscommon-web다루는 테이블
examexam_questionquiz_resultquiz_result_answerlevel_test_listlevel_test_list_rightlevel_test_exampleslevel_test_answerapplymembercourseunit
원본 대응
myclass/unitSloving*.php · tesolLab/leveltest*타입 구조 (40)
Spring 소스를 직접 읽어 그린다. 계층 사이 화살표만 그렸다 — 타입 하나하나를 이으면 읽을 수 없다. 파란 테두리가 포트(interface)다.
100%휠로 확대 · 끌어서 이동
app 6domain 18infrastructure 12web 4포트 (6) — 도메인이 바깥에 요구하는 것
도메인은 DB 도 HTTP 도 모른다. 필요한 것을 인터페이스로 선언하고, infrastructure 가 그것을 구현한다. 의존이 뒤집히는 지점이다.
| 이름 | 하는 일 | 메서드 |
|---|---|---|
EntitlementReaderdomain | 수강 자격 조회. | |
ExamAttemptRepositorydomain | 응시 기록. | |
ExamRepositorydomain | - | |
LevelTestRepositorydomain | 지금 쓰는 레벨테스트. | |
AssessmentJpaRepositoriesinfrastructure | - | |
UnitRefJpaRepositoryinfrastructure | - |
도메인 모델 (14)
Choicerecord | 보기 하나. |
Examrecord | 시험지. |
ExamEligibilityclass | 응시 자격 판정. |
ExamKindenum | 응시 차수. |
GradedAnswerrecord | 문항별 채점 결과. |
Graderclass | 채점. |
GradeResultrecord | 채점 결과 전체. |
LevelTestrecord | 레벨테스트. |
LevelTestGraderclass | 레벨테스트 채점. |
LevelTestPollrecord | 레벨테스트에 붙는 설문. |
LevelTestResultrecord | 레벨테스트 채점 결과. |
PollResultrecord | 한 신청 건의 설문 답. |
Questionrecord | 문항. |
UnitProgressrecord | 한 유닛의 응시 현황. |
유스케이스 (6)
ExamPaper12줄 | 응시 화면에 내려보낼 문제지. PaperQuestion()PaperChoice() |
ExamResultView26줄 | 결과 화면에 내려보낼 채점 결과. ResultItem()ResultChoice() |
GetExamResultUseCase79줄 | 채점 결과 조회. result() |
LevelTestUseCase82줄 | 레벨테스트. paper()poll()apply()submit() |
SubmitExamUseCase58줄 | 답안 제출 · 채점 · 저장. submit() |
TakeExamUseCase58줄 | 문제지 조회. paper() |
엔드포인트 (9)
100%휠로 확대 · 끌어서 이동
| 메서드 | 경로 | 컨트롤러 |
|---|---|---|
GET | /api/assessment/admin/level-tests관리자 | AdminLevelTestController |
GET | /api/assessment/admin/applies/{applyId}/poll-result관리자 | AdminLevelTestController |
GET | /api/assessment/results/{course}/{unit}/{kind} | AssessmentController |
GET | /api/assessment/exams/{course}/{unit}/{kind} | AssessmentController |
POST | /api/assessment/exams/{course}/{unit}/{kind}/submit | AssessmentController |
GET | /api/assessment/level-test | LevelTestController |
GET | /api/assessment/level-test/poll | LevelTestController |
POST | /api/assessment/level-test/applications | LevelTestController |
POST | /api/assessment/level-test/submissions | LevelTestController |
화면 흐름 (7개 화면)
이 도메인이 받는 화면끼리의 이동입니다. 다른 도메인으로 나가는 이동까지 함께 보려면 화면 흐름 → 시험 · 평가 으로 갑니다.
100%휠로 확대 · 끌어서 이동
이 도메인을 쓰는 화면 (7)
critical 가드레일 (15)
quiz-guard-reapplies-on-submit제출 API 는 조회 API 와 같은 자격 검사를 다시 수행해야 한다. 화면을 거치지 않은 직접 호출도 막혀야 한다.quiz-no-answer-leak문제지 조회 응답에 정답(correct)이 절대 포함되면 안 된다.quiz-pass-score-70합격선은 70점이다. 69점은 불합격, 70점은 합격이어야 한다.quiz-sequential-unit-lockUNIT n-1 을 통과하지 않은 상태로 UNIT n 응시를 요청하면 거부해야 한다.quiz-kind-order기록이 없는 유닛에 B · C 차수를 바로 요청하면 거부해야 한다.quiz-multi-answer-exact-match복수정답 문항은 부분 정답에 점수를 주면 안 된다. 정답 집합과 완전히 일치할 때만 5점.quiz-tec-uses-tec-flagsTEC 응시 자격은 TESOL 플래그가 아니라 TEC 전용 컬럼으로 판정해야 한다.result-own-only남의 응시 결과를 조회할 수 없어야 한다. 항상 로그인한 본인 기록만 나온다.leveltest-answer-not-leaked문항 조회 응답에 정답이 절대 실리면 안 된다.leveltest-subjective-graded주관식도 채점 대상이다. 만점이 객관식 개수(10)로 잘리면 안 된다 — 15 여야 한다.leveltest-subjective-in-answer-table주관식 답안이 level_test_answer.a11~a20 에 저장돼야 한다. level_test_poll_answer 는 설문용이므로 쓰면 안 된다.leveltest-exam-no-answer-in-html렌더된 HTML 어디에도 정답 표시가 없어야 한다.leveltest-exam-input-type-by-number1~10 은 radio, 11~15 는 text 입력이어야 한다. 보기가 없다고 문항을 통째로 빠뜨리면 안 된다.leveltest-result-no-lookup-api접수번호로 남의 결과를 조회하는 API 를 만들면 안 된다.result-tec-own-only남의 결과를 조회할 수 없어야 한다.