Assignment 모듈
학원 반에 귀속된 과제 생성·수정·삭제, 학생 제출물 관리(등록·채점·반환), 과제 통계 집계를 담당하는 모듈입니다.
모듈 개요
| 항목 | 내용 |
|---|---|
| Gradle 서브프로젝트 | modules/assignment |
| 베이스 패키지 | com.lumie.assignment |
| 데이터베이스 | PostgreSQL (멀티테넌트 RLS, assignments / assignment_submissions 테이블) |
| 외부 노출 internal-api | AssignmentService |
주요 책임
- 반(classId)에 귀속된 과제 생성·수정·삭제 및 활성/종료 전환
- 학생 제출물 등록·채점(점수+피드백)·반환 처리
- 첨부파일 ID 목록 관리 (JSONB, FileService 연계)
- 과제 통계 집계 (제출율, 평균 점수 등)
도메인 모델
Assignment 엔티티
@Entity
@Table(name = "assignments")
public class Assignment extends TenantScopedEntity {
private Long id;
@Version Long version;
Long classId;
String title;
String description;
AssignmentType type; // HOMEWORK | PROJECT | QUIZ | EXAM
Instant dueDate;
Integer maxScore;
List<Long> attachments; // 첨부파일 ID 목록 (JSONB)
AssignmentStatus status; // ACTIVE | CLOSED
}
AssignmentSubmission 엔티티
@Entity
@Table(name = "assignment_submissions",
uniqueConstraints = @UniqueConstraint(columnNames = {"assignment_id", "student_id"}))
public class AssignmentSubmission extends TenantScopedEntity {
private Long id;
@Version Long version;
Long assignmentId;
Long studentId;
String content;
List<Long> attachments; // 제출 첨부파일 ID 목록 (JSONB)
Integer score;
String feedback;
Instant submittedAt;
Instant gradedAt;
SubmissionStatus status; // PENDING | SUBMITTED | GRADED | RETURNED
}
한 학생은 한 과제에 하나의 제출 레코드만 가질 수 있습니다 (unique_constraint).
AssignmentType
| 값 | 의미 |
|---|---|
HOMEWORK | 숙제 (기본값) |
PROJECT | 프로젝트 |
QUIZ | 퀴즈 |
EXAM | 시험형 과제 |
SubmissionStatus
| 값 | 의미 |
|---|---|
PENDING | 미제출 |
SUBMITTED | 제출 완료 |
GRADED | 채점 완료 |
RETURNED | 교사가 피드백 후 반환 |
REST API
과제 관리 API — 기본 경로: /v1/assignments
| 메서드 | 경로 | 설명 |
|---|---|---|
POST | /v1/assignments | 과제 생성 (201 Created) |
GET | /v1/assignments | 과제 목록 조회 (classId, type, status, 검색, 페이지) |
GET | /v1/assignments/\{id\} | 과제 상세 조회 |
PATCH | /v1/assignments/\{id\} | 과제 수정 |
DELETE | /v1/assignments/\{id\} | 과제 삭제 |
GET | /v1/assignments/class/\{classId\} | 반별 과제 목록 |
정렬 허용 필드
createdAt, title, dueDate, status
제출물 관리 API — 기본 경로: /v1/assignments/\{assignmentId\}/submissions
| 메서드 | 경로 | 설명 |
|---|---|---|
GET | /v1/assignments/\{assignmentId\}/submissions | 제출물 목록 |
POST | /v1/assignments/\{assignmentId\}/submissions | 제출물 등록 (201 Created) |
PATCH | /v1/assignments/\{assignmentId\}/submissions/\{submissionId\} | 제출물 수정 (채점·반환 포함) |
GET | /v1/assignments/\{assignmentId\}/submissions/student/\{studentId\} | 학생별 제출물 조회 |
통계 API
| 메서드 | 경로 | 설명 |
|---|---|---|
GET | /v1/assignments/\{id\}/statistics | 과제별 통계 (제출율, 평균 점수 등) |
내부 API (libs/internal-api)
AssignmentService 인터페이스를 구현한 AssignmentServiceAdapter가 adapter/in/internal/에 위치합니다.
public interface AssignmentService {
Optional<AssignmentData> getAssignment(String tenantSlug, Long assignmentId);
AssignmentListData getAssignmentsByClass(String tenantSlug, Long classId, int page, int size);
}
멀티테넌시
assignments 및 assignment_submissions 테이블 모두 tenant_id BIGINT NOT NULL을 가지며 RLS 정책이 적용됩니다.
관련 문서
- Class 모듈 — 과제가 귀속되는 반 관리
- Student 모듈 — 제출 학생 검증
- Lecture 모듈 — 강의와 연계된 과제 참조
- Exam 모듈 — 시험형 채점과의 구분