레벨테스트 응시

TESOL-LEVEL-TEST-EXAM · /tesol-lab/level-test/exam

실제 화면 열기 ↗
기능
8
API 호출
0
가드레일
14
id 가 테스트 이름
구현 단계
9 / 9
완료시험 · 평가wvctesol-api :8080서버 컴포넌트65

개발 스펙

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

  • 신청(STEP01)에서 받은 접수번호로 들어와 객관식 10문항 + 주관식 5문항을 푼다.
  • 객관식은 보기를 고르고(a · b · c 라벨), 주관식은 흩어진 단어를 배열해 문장을 적는다.
  • 답한 개수와 진행 막대를 붙박이로 보여 준다 — 긴 폼에서 남은 문항을 알 수 있어야 한다.
  • 전부 채워야 제출된다. 빈 문항이 있으면 몇 번인지 알려 준다.
  • 한 번 제출하면 다시 낼 수 없다는 것을 미리 알린다.

비즈니스 규칙 (6)

  • 비로그인으로 응시한다. 접수번호(applyId)가 신원을 대신한다.
    근거: leveltest_form_v_01.php:859 hidden applyIdx
  • 접수번호가 없으면 신청 화면으로 되돌린다 — 답안을 붙일 곳이 없다.
  • 객관식은 1~10, 주관식은 11~20. 화면도 이 경계로 나눠 그린다.
    근거: leveltest_form_v_01.php:1002 · 1051
  • 주관식 문항 텍스트는 DB 에 있다(예: "to/ of /buy/ things/ want/I / couple/ a"). 안내 이미지만 띄우고 문항을 감추면 안 된다.
    근거: leveltest_form_v_01.php:1056
  • 객관식 보기는 라디오(단일 선택)다. 유닛 시험과 달리 복수정답이 없다.
  • 답안은 객관식 → 주관식 순으로 이어 붙인 배열 하나로 보낸다.
    근거: leveltest_form_v_01_proc.php:147 — E[] 단일 배열

API (2)

메서드경로권한모듈 · 설명
GET/api/assessment/level-test공개
문항 조회. 정답 없음.
domains:assessment:assessment-web
POST/api/assessment/level-test/submissions공개
답안 제출 → { rightCount, total }.
domains:assessment:assessment-web
400 ALREADY_SUBMITTED

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

id반드시 만족해야 하는 것등급
poll-questions-parsed
평탄한 q1~q20 이 문항 목록으로 서야 한다. 번호가 겹치거나 보기가 비면 안 된다.
원본 테이블은 한 행에 스무 문항을 늘어놓았다(level_test_poll).
high
poll-choice-separator
보기 구분자는 ^ 가 있으면 ^, 없으면 쉼표다.
쉼표로만 나누면 "창업(공부방, 교습소, 학원)" 이 세 조각으로 찢어진다. 원본도 그래서 구분자를 섞어 썼다(leveltest_form_v_01.php:917).
high
poll-required-enforced
필수 설문을 비운 채 제출하면 서버가 거부해야 한다.
화면 표시만으로는 직접 POST 를 막을 수 없다.
high
poll-choice-whitelist
보기에 없는 값이 오면 거부해야 한다.
high
poll-saved-with-answers
설문은 답안지와 같은 트랜잭션에서 저장돼야 한다. 재제출은 막힌다.
한쪽만 남으면 집계가 어긋난다.
high
poll-multi-select
한 문항에 여러 개를 고를 수 있어야 한다. 저장은 쉼표로 이어 붙인다.
원본이 체크박스였다(Polls[$a][]). 라디오로 바꾸면 집계가 달라진다.
high
poll-shown-on-exam
응시 화면에 설문이 함께 나와야 하고 보기는 체크박스여야 한다.
normal
poll-numbers-sent
화면이 그린 문항 번호가 함께 전송돼야 한다.
비어 있으면 설문이 통째로 유실된다 — 서버 액션이 그 번호로 답을 모은다.
normal
poll-required-blocks-submit
설문을 비우고 제출하면 화면에 사유가 보여야 한다.
normal
leveltest-exam-apply-required
apply 파라미터 없이 접근하면 /tesol-lab/level-test 로 돌려보내야 한다.
high
leveltest-exam-no-answer-in-html
렌더된 HTML 어디에도 정답 표시가 없어야 한다.
critical
leveltest-exam-input-type-by-number
1~10 은 radio, 11~15 는 text 입력이어야 한다. 보기가 없다고 문항을 통째로 빠뜨리면 안 된다.
초기 구현이 보기 유무로 판정해 11~15 가 선택 불가 상태로 렌더된 적이 있다.
critical
leveltest-exam-subjective-text-shown
주관식 문항 텍스트가 화면에 보여야 한다. 안내 이미지로 대체하면 안 된다.
high
leveltest-exam-all-required
한 문항이라도 비면 제출되지 않고 몇 번인지 알려야 한다.
normal

구현 계획 (9/9)

  1. LevelTestPoll · PollQuestion · PollAnswer 값 객체와 규칙 검사assessment-domain
  2. pollOf · savePollAnswers 포트assessment-domain
  3. 제출 시 설문 규칙을 다시 보고 같은 트랜잭션에 저장assessment-app
  4. 평탄한 q1~q20 을 문항 목록으로 세우는 어댑터 (^ · 쉼표 구분자)assessment-infrastructure
  5. GET /level-test/poll · submissions 에 pollAnswers 추가assessment-web
  6. 응시 화면의 설문 섹션 — 상단은 앞, 하단은 뒤wvctesol
  7. LevelTestExamForm — 객관식 라디오 + 주관식 텍스트, 진행 막대wvctesol
  8. /tesol-lab/level-test/exam 페이지 — applyId 검사 후 문항 조회wvctesol
  9. submitLevelTestAnswers 서버 액션 — 문항 번호 순으로 답안 조립 후 제출wvctesol

서버 사이드 구현 계획 — 자바 객체별 요구사항 (2/2)

객체모듈책임 · 지켜야 할 것
LevelTestController.PaperResponse
record
assessment-web
응시 화면이 받는 시험지 표현.
  • questions(객관식) 와 subjectiveQuestions(주관식) 를 따로 내려 화면이 입력 방식을 고를 수 있게 한다.
  • Question(number, text, choices) 만 담는다 — 정답 필드가 아예 없어야 한다.
  • total 로 만점을 함께 내려 화면이 문항 수를 하드코딩하지 않게 한다.
  • number 는 DB 컬럼 위치(q11→11)를 그대로 쓴다 — 답안 저장 위치와 어긋나면 안 된다.
LevelTestController.SubmitRequest
record
assessment-web
제출 payload.
  • answers 는 객관식 → 주관식을 이어 붙인 단일 배열이다. 인덱스가 문항 번호를 뜻한다.
  • 주관식을 따로 받는 필드를 두지 않는다 — 원본이 E[] 하나로 처리한다.
  • applyId 가 없으면 답안을 붙일 곳이 없으므로 저장하지 않는다.

테스트 방법 (14)

가드레일종류확인 방법
poll-questions-parsede2e번호 1~20 · 중복 없음 · 문구와 보기가 비지 않음
poll-choice-separatore2e쉼표를 품은 보기의 괄호 짝이 맞는지
poll-required-enforcede2epollAnswers 를 비워 제출 → POLL_REQUIRED
poll-choice-whiteliste2e보기에 없는 값 → POLL_INVALID_CHOICE
poll-saved-with-answerse2e제출 성공 후 같은 접수번호로 재제출 → 거부
poll-multi-selecte2e한 문항에 보기 두 개를 고른 제출이 통과
poll-shown-on-exame2e문항이 보이고 보기가 체크박스(라디오 0개)
poll-numbers-sente2epollNumbers 개수 = 화면 문항 수
poll-required-blocks-submite2e설문을 비우고 제출 → alert 노출, 결과로 안 넘어감
leveltest-exam-apply-requirede2eapply 없이 /exam 진입 → 307 로 /tesol-lab/level-test 리다이렉트
leveltest-exam-no-answer-in-htmle2e응시 화면 HTML 에 정답을 지목하는 표시(checked · correct 클래스)가 없다
leveltest-exam-input-type-by-numbere2etype=radio 인 name 이 a_1~a_10, type=text 인 name 이 a_11~a_15
leveltest-exam-subjective-text-showne2eHTML 에 q11 원문("buy/ things/ want")이 포함된다
leveltest-exam-all-requirede2e3번만 비우고 제출 → "3번 문항에 답해주세요." 노출

스냅샷

스냅샷이 없습니다. node scripts/snapshot.mjs 로 촬영하세요.

기능 목록 (8)

데이터
  • ·조회 조건apply
입력
  • ·1개
  • ·제출 버튼1개
  • ·입력 필드5개
액션
  • ·서버 액션submitLevelTestAnswers
상태
  • ·화면 상태answers
하드코딩
  • ·하드코딩 데이터numbers
  • ·하드코딩 데이터answers

화면 이동

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

연결

API

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

소스
src/app/tesol-lab/level-test/exam/page.tsx