본문으로 건너뛰기

과제 서비스

이 페이지는 lumie-backend/modules/assignment를 다룹니다.

책임

assignment 모듈은 다음을 소유합니다.

  • class에 연결된 과제
  • 학생별 제출물
  • 과제 dashboard 통계
  • ID 또는 class 기준 과제 조회를 위한 internal API

소스 경로

Path역할
lumie-backend/modules/assignment/src/main/java/com/lumie/assignment/adapter/in/web공개 assignment, submission, statistics controller
lumie-backend/modules/assignment/src/main/java/com/lumie/assignment/adapter/in/internal/AssignmentServiceAdapter.javainternal monolith API 구현
lumie-backend/modules/assignment/src/main/java/com/lumie/assignment/application/servicecommand, query, statistics service
lumie-backend/modules/assignment/src/main/java/com/lumie/assignment/domain/entityAssignment, AssignmentSubmission
lumie-backend/libs/internal-api/src/main/java/com/lumie/assignment/api/AssignmentService.javainternal 조회 계약
lumie-backend/app/src/main/resources/db/migration/public/V18__rls_baseline.sqlbaseline assignments, assignment_submissions table

공개 인터페이스

SurfaceEntrypoints
Assignment CRUDPOST /v1/assignments, GET /v1/assignments, GET /v1/assignments/{id}, PATCH /v1/assignments/{id}, DELETE /v1/assignments/{id}
Class listGET /v1/assignments/class/{classId}
Submission managementGET /v1/assignments/{assignmentId}/submissions, POST /v1/assignments/{assignmentId}/submissions, PATCH /v1/assignments/{assignmentId}/submissions/{submissionId}, GET /v1/assignments/{assignmentId}/submissions/student/{studentId}
DashboardGET /v1/assignments/statistics/dashboard

내부 인터페이스

AssignmentService는 다음을 export합니다.

  • getAssignment(...)
  • getAssignmentsByClass(...)

이 모듈은 다른 모듈에 submission 수정이나 grading 기능을 export하지 않습니다. internal consumer는 lookup 데이터만 받습니다.

집계와 테이블

AggregateTable참고
Assignmentassignmentsclass ID, type, due date, max score, JSONB attachment ID, lifecycle status 저장
AssignmentSubmissionassignment_submissions(assignment_id, student_id) unique, 내용/첨부/점수/피드백/상태 포함

두 aggregate는 custom converter를 통해 attachment ID 목록을 JSONB로 직렬화합니다. 직렬화 실패는 조용한 persistence 손상이 아니라 business exception으로 surface됩니다.

런타임 흐름

제출 라이프사이클

핵심 동작

  • 과제 생성은 ClassService.getClass(...)를 통해 class를 검증합니다.
  • delete는 row 삭제가 아닙니다. deleteAssignment(...)는 상태를 바꿔 assignment를 닫고 다시 저장합니다.
  • 제출물은 학생당 과제당 하나만 허용됩니다.
  • 제출물 업데이트에서 status 쓰기는 다음 의미를 가집니다.
  • GRADED -> score, feedback, graded_at 설정
  • RETURNED -> feedback 설정 후 반환 처리
  • status가 없어도 score나 feedback 변경이 있으면 service는 여전히 제출물을 grading합니다.

대표 계약 예시

이 예시는 UpdateSubmissionRequest, SubmissionResponse, AssignmentSubmissionControllerTest.updateSubmission_returns200, AssignmentCommandServiceTest.updateSubmission_grade_success와 일치합니다.

PATCH /v1/assignments/1/submissions/10

{
"score": 85,
"feedback": "잘했습니다.",
"status": "GRADED"
}
{
"id": 10,
"assignmentId": 1,
"studentId": 42,
"content": "답안",
"attachments": null,
"score": 85,
"feedback": "잘했습니다.",
"submittedAt": "2026-04-15T14:00:00Z",
"gradedAt": "2026-04-15T14:05:00Z",
"status": "GRADED",
"createdAt": "2026-04-15T14:00:00Z",
"updatedAt": "2026-04-15T14:05:00Z"
}

같은 학생이 POST /v1/assignments/{assignmentId}/submissions에 두 번째 제출을 보내면, 모듈은 DUPLICATE_SUBMISSION을 발생시키고 controller는 이를 409 Conflict로 매핑합니다.

의존성과 경계

Dependency존재 이유
ClassService소유 class가 존재하는지 검증

assignment 모듈은 class 중심입니다. class_id를 직접 저장하고 class 모듈에 소유권 검증을 의존하지만, 자체 table 안에 classroom detail을 해석하거나 cache하지는 않습니다.

실패 모드

  • 알 수 없는 class, assignment, submission은 CLASS_NOT_FOUND, ASSIGNMENT_NOT_FOUND, SUBMISSION_NOT_FOUND로 실패합니다.
  • 중복 제출은 DUPLICATE_SUBMISSION으로 실패합니다.
  • 잘못된 assignment type, assignment status, submission status 문자열은 INVALID_STATUS로 실패합니다.
  • JSON attachment 직렬화 실패는 JSON_SERIALIZATION_FAILED로 실패합니다.

관측성

  • 모듈은 assignment 생성, 수정, 종료, submission 생성, submission 갱신을 로그합니다.
  • 현재 assignment write surface에는 worker, event, queue, retry 동작이 없습니다.

검증

./gradlew :modules:assignment:test
./gradlew :app:test --tests '*Assignment*'
cd lumie-document/docusaurus && npm run build

예상 성공 신호:

  • Gradle이 BUILD SUCCESSFUL로 끝납니다.
  • AssignmentSubmissionControllerTestAssignmentCommandServiceTest가 실패 없이 통과합니다.
  • Docusaurus가 backend/assignment-svc에 대해 MDX 또는 broken-link 오류 없이 완료됩니다.

관련 페이지