시험 서비스
이 페이지는 lumie-backend/modules/exam을 다룹니다. 현재 monolith에서 이
모듈은 동기 요청 처리와 RabbitMQ 기반 워커 orchestration을 모두 소유하는
유일한 백엔드 도메인 모듈입니다.
책임
exam 모듈은 다음을 소유합니다.
- 시험 정의와 정답표
- 새 시험에 사용할 테넌트 관리 문항 유형 옵션
- 재사용 가능한 시험 템플릿
- 시험 결과와 문항별 채점 데이터
- 단일 이미지 동기 OMR 채점
- 배치 OMR 채점 job, 콜백, 결과 저장
- 배치 report 생성 job, ZIP 조립, report 다운로드
- 시험, 학생, 반 수준의 분석
소스 경로
| 경로 | 역할 |
|---|---|
lumie-backend/modules/exam/src/main/java/com/lumie/exam/adapter/in/web | 시험, 템플릿, 결과, 통계, report용 공개 HTTP 컨트롤러 |
lumie-backend/modules/exam/src/main/java/com/lumie/exam/adapter/in/messaging | 채점 및 report 완료용 RabbitMQ 콜백 consumer |
lumie-backend/modules/exam/src/main/java/com/lumie/exam/adapter/in/internal/ExamServiceAdapter.java | libs/internal-api를 통해 노출되는 동기 내부 API |
lumie-backend/modules/exam/src/main/java/com/lumie/exam/adapter/out/messaging/JobRequestForwarder.java | Spring Modulith outbox에서 RabbitMQ로 보내는 bridge |
lumie-backend/modules/exam/src/main/java/com/lumie/exam/adapter/out/external | grading-svc, report-svc용 HTTP client |
lumie-backend/modules/exam/src/main/java/com/lumie/exam/adapter/out/storage/OmrMinioStorageAdapter.java | OMR 이미지와 생성 artifact용 MinIO storage |
lumie-backend/modules/exam/src/main/java/com/lumie/exam/adapter/out/persistence/RedisCallbackDeduplicationAdapter.java | Redis 기반 콜백 deduplication |
lumie-backend/modules/exam/src/main/java/com/lumie/exam/application/service | command, 쿼리, grading, statistics, 콜백, sweeper service |
lumie-backend/modules/exam/src/main/java/com/lumie/exam/domain/entity | Exam, ExamQuestionType, ExamTemplate, ExamResult, QuestionResult, OmrGradingJob, ReportGenerationJob |
lumie-backend/libs/internal-api/src/main/java/com/lumie/exam/api/ExamService.java | internal monolith 계약 |
lumie-backend/app/src/main/resources/db/migration/public/V18__rls_baseline.sql | exams, exam_results, exam_templates, job table 등의 기준선 |
lumie-backend/app/src/main/resources/db/migration/public/V24__add_version_to_domain_mutable_entities.sql | exam_templates에 optimistic-lock version 추가 |
lumie-backend/app/src/main/resources/db/migration/public/V44__create_exam_ai_analyses.sql | 이 모듈의 주 쓰기 인터페이스 바깥에 있는 exam 측 AI 캐시 table |
lumie-backend/app/src/main/resources/db/migration/public/V70__create_exam_question_types.sql | 테넌트 범위의 설정 가능한 문항 유형 옵션 추가 |
공개 인터페이스
| 인터페이스 | 진입점 |
|---|---|
| Exam CRUD | GET/POST /v1/exams, GET /v1/exams/{id}, GET /v1/exams/{id}/full, PATCH /v1/exams/{id}, DELETE /v1/exams/{id} |
| Question type settings | GET /v1/exam-question-types; 교직원 전용 POST /v1/exam-question-types, DELETE /v1/exam-question-types/{id} |
| Template CRUD | GET/POST /v1/exam-templates, GET/PATCH/DELETE /v1/exam-templates/{id} |
| Synchronous OMR | POST /v1/exams/{examId}/results/omr |
| Batch OMR | POST /v1/exams/{examId}/results/omr/batch/presign, POST /v1/exams/{examId}/results/omr/batch/confirm, GET /v1/exams/{examId}/omr-jobs/{jobId}, GET /v1/exams/{examId}/omr-jobs/{jobId}/results, GET /v1/exams/{examId}/omr-jobs |
| Results and corrections | GET /v1/exams/{examId}/results, GET /v1/students/{studentId}/results, GET /v1/results/{resultId}/questions, PATCH /v1/question-results/{id}, PATCH /v1/exams/{examId}/results/{resultId}/phone, DELETE /v1/exams/{examId}/results/{resultId} |
| OMR artifacts | GET /v1/exams/{examId}/results/{resultId}/omr-image, GET /v1/exams/results/export.csv |
| Reports | GET /v1/reports/students/{studentId}/exams/{examId}, POST /v1/exams/{examId}/reports/batch, GET /v1/exams/{examId}/reports/jobs/{jobId}, GET /v1/exams/{examId}/reports/jobs/{jobId}/download |
| Statistics | GET /v1/statistics/exams/{examId}, .../grades, .../results-summary, .../choices, .../class-comparison, .../item-analysis, GET /v1/statistics/students/{studentId}/rank, .../stability, .../type-growth, .../normalized, POST /v1/statistics/students/{studentId}/goal-simulation, GET /v1/statistics/dashboard |