시험 · 평가

응시 자격을 판정하고 채점한다. 레벨테스트도 여기 있다.

:8080
클래스
40
포트
6
interface
엔드포인트
9
화면
7
가드레일
40
critical 15

이 도메인의 자리

100%휠로 확대 · 끌어서 이동

이어진 곳

이 도메인이 쓰는 것 →

없다. 다른 도메인을 모른다.

← 이 도메인을 쓰는 곳

없다.

공용 모듈
common-appcommon-domaincommon-infrastructurecommon-securitycommon-utilscommon-web

다루는 테이블

타입 구조 (40)

Spring 소스를 직접 읽어 그린다. 계층 사이 화살표만 그렸다 — 타입 하나하나를 이으면 읽을 수 없다. 파란 테두리가 포트(interface)다.

100%휠로 확대 · 끌어서 이동
app 6domain 18infrastructure 12web 4

포트 (6) — 도메인이 바깥에 요구하는 것

도메인은 DB 도 HTTP 도 모른다. 필요한 것을 인터페이스로 선언하고, infrastructure 가 그것을 구현한다. 의존이 뒤집히는 지점이다.

이름하는 일메서드
EntitlementReader
domain
수강 자격 조회.
ExamAttemptRepository
domain
응시 기록.
ExamRepository
domain
-
LevelTestRepository
domain
지금 쓰는 레벨테스트.
AssessmentJpaRepositories
infrastructure
-
UnitRefJpaRepository
infrastructure
-

도메인 모델 (14)

Choice
record
보기 하나.
Exam
record
시험지.
ExamEligibility
class
응시 자격 판정.
ExamKind
enum
응시 차수.
GradedAnswer
record
문항별 채점 결과.
Grader
class
채점.
GradeResult
record
채점 결과 전체.
LevelTest
record
레벨테스트.
LevelTestGrader
class
레벨테스트 채점.
LevelTestPoll
record
레벨테스트에 붙는 설문.
LevelTestResult
record
레벨테스트 채점 결과.
PollResult
record
한 신청 건의 설문 답.
Question
record
문항.
UnitProgress
record
한 유닛의 응시 현황.

유스케이스 (6)

ExamPaper
12
응시 화면에 내려보낼 문제지.
PaperQuestion()PaperChoice()
ExamResultView
26
결과 화면에 내려보낼 채점 결과.
ResultItem()ResultChoice()
GetExamResultUseCase
79
채점 결과 조회.
result()
LevelTestUseCase
82
레벨테스트.
paper()poll()apply()submit()
SubmitExamUseCase
58
답안 제출 · 채점 · 저장.
submit()
TakeExamUseCase
58
문제지 조회.
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}/submitAssessmentController
GET/api/assessment/level-testLevelTestController
GET/api/assessment/level-test/pollLevelTestController
POST/api/assessment/level-test/applicationsLevelTestController
POST/api/assessment/level-test/submissionsLevelTestController

화면 흐름 (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-lock
    UNIT n-1 을 통과하지 않은 상태로 UNIT n 응시를 요청하면 거부해야 한다.
  • quiz-kind-order
    기록이 없는 유닛에 B · C 차수를 바로 요청하면 거부해야 한다.
  • quiz-multi-answer-exact-match
    복수정답 문항은 부분 정답에 점수를 주면 안 된다. 정답 집합과 완전히 일치할 때만 5점.
  • quiz-tec-uses-tec-flags
    TEC 응시 자격은 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-number
    1~10 은 radio, 11~15 는 text 입력이어야 한다. 보기가 없다고 문항을 통째로 빠뜨리면 안 된다.
  • leveltest-result-no-lookup-api
    접수번호로 남의 결과를 조회하는 API 를 만들면 안 된다.
  • result-tec-own-only
    남의 결과를 조회할 수 없어야 한다.