레벨테스트 응시
TESOL-LEVEL-TEST-EXAM · /tesol-lab/level-test/exam
기능
8
API 호출
0
가드레일
14
id 가 테스트 이름
구현 단계
9 / 9
개발 스펙
이 화면에서 할 수 있어야 하는 것 (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-web400 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)
- ●LevelTestPoll · PollQuestion · PollAnswer 값 객체와 규칙 검사
assessment-domain - ●pollOf · savePollAnswers 포트
assessment-domain - ●제출 시 설문 규칙을 다시 보고 같은 트랜잭션에 저장
assessment-app - ●평탄한 q1~q20 을 문항 목록으로 세우는 어댑터 (^ · 쉼표 구분자)
assessment-infrastructure - ●GET /level-test/poll · submissions 에 pollAnswers 추가
assessment-web - ●응시 화면의 설문 섹션 — 상단은 앞, 하단은 뒤
wvctesol - ●LevelTestExamForm — 객관식 라디오 + 주관식 텍스트, 진행 막대
wvctesol - ●/tesol-lab/level-test/exam 페이지 — applyId 검사 후 문항 조회
wvctesol - ●submitLevelTestAnswers 서버 액션 — 문항 번호 순으로 답안 조립 후 제출
wvctesol
서버 사이드 구현 계획 — 자바 객체별 요구사항 (2/2)
| 객체 | 모듈 | 책임 · 지켜야 할 것 |
|---|---|---|
● LevelTestController.PaperResponserecord | assessment-web | 응시 화면이 받는 시험지 표현.
|
● LevelTestController.SubmitRequestrecord | assessment-web | 제출 payload.
|
테스트 방법 (14)
| 가드레일 | 종류 | 확인 방법 |
|---|---|---|
poll-questions-parsed | e2e | 번호 1~20 · 중복 없음 · 문구와 보기가 비지 않음 |
poll-choice-separator | e2e | 쉼표를 품은 보기의 괄호 짝이 맞는지 |
poll-required-enforced | e2e | pollAnswers 를 비워 제출 → POLL_REQUIRED |
poll-choice-whitelist | e2e | 보기에 없는 값 → POLL_INVALID_CHOICE |
poll-saved-with-answers | e2e | 제출 성공 후 같은 접수번호로 재제출 → 거부 |
poll-multi-select | e2e | 한 문항에 보기 두 개를 고른 제출이 통과 |
poll-shown-on-exam | e2e | 문항이 보이고 보기가 체크박스(라디오 0개) |
poll-numbers-sent | e2e | pollNumbers 개수 = 화면 문항 수 |
poll-required-blocks-submit | e2e | 설문을 비우고 제출 → alert 노출, 결과로 안 넘어감 |
leveltest-exam-apply-required | e2e | apply 없이 /exam 진입 → 307 로 /tesol-lab/level-test 리다이렉트 |
leveltest-exam-no-answer-in-html | e2e | 응시 화면 HTML 에 정답을 지목하는 표시(checked · correct 클래스)가 없다 |
leveltest-exam-input-type-by-number | e2e | type=radio 인 name 이 a_1~a_10, type=text 인 name 이 a_11~a_15 |
leveltest-exam-subjective-text-shown | e2e | HTML 에 q11 원문("buy/ things/ want")이 포함된다 |
leveltest-exam-all-required | e2e | 3번만 비우고 제출 → "3번 문항에 답해주세요." 노출 |
스냅샷
스냅샷이 없습니다. node scripts/snapshot.mjs 로 촬영하세요.
기능 목록 (8)
데이터
- ·조회 조건
apply
입력
- ·폼
1개 - ·제출 버튼
1개 - ·입력 필드
5개
액션
- ·서버 액션
submitLevelTestAnswers
상태
- ·화면 상태
answers
하드코딩
- ·하드코딩 데이터
numbers - ·하드코딩 데이터
answers
화면 이동
← 이 화면으로 오는 곳
HOME/TESOL-LEVEL-TEST/tesol-lab/level-test
이 화면에서 가는 곳 →
TESOL-LEVEL-TEST/tesol-lab/level-testTESOL-LEVEL-TEST-RESULT/tesol-lab/level-test/result
연결
API
직접 호출하는 API 가 없습니다
소스
src/app/tesol-lab/level-test/exam/page.tsx