Class 모듈
학원의 반(학급) 생성·수정·삭제, 학생 수강 등록·취소, 수강 현황 조회 및 대시보드 통계를 담당하는 모듈입니다. 패키지 이름은 com.lumie.classroom입니다.
모듈 개요
| 항목 | 내용 |
|---|---|
| Gradle 서브프로젝트 | modules/class |
| 베이스 패키지 | com.lumie.classroom |
| 데이터베이스 | PostgreSQL (멀티테넌트 RLS, classes / class_enrollments 테이블) |
| 외부 노출 internal-api | ClassService |
주요 책임
- 반 개설·수정·삭제
- 담당 강사(teacherId) 지정
- 수업 일정 패턴(요일별 시작·종료 시간) 관리 —
SchedulePatternJSONB 저장 - 학생의 반 수강 등록·취소·수료 처리
- 반별 수강 현황 및 대시보드 통계 집계
도메인 모델
ClassEntity 엔티티
@Entity
@Table(name = "classes")
public class ClassEntity extends TenantScopedEntity {
private Long id;
@Version Long version;
String name;
Long teacherId;
SchedulePattern schedulePattern; // JSONB — 요일·시간 패턴
String description;
}
SchedulePattern은 jsonb 컬럼에 직렬화되며, 요일별 수업 세션 목록(sessions)을 기준으로 저장합니다. 각 세션은 day, startTime, endTime을 가지며, 기존 days, startTime, endTime 필드는 호환용으로 유지됩니다. 모든 세션 시간이 같을 때만 호환용 시작·종료 시간이 채워지고, 요일별 시간이 다르면 호환용 시간 필드는 null입니다.
ClassEnrollment 엔티티
@Entity
@Table(name = "class_enrollments",
uniqueConstraints = @UniqueConstraint(columnNames = {"class_id", "student_id"}))
public class ClassEnrollment extends TenantScopedEntity {
private Long id;
@Version Long version;
ClassEntity classEntity;
Long studentId;
Instant enrolledAt;
Instant droppedAt;
EnrollmentStatus status; // ENROLLED | DROPPED | COMPLETED
}
한 학생은 한 반에 하나의 수강 레코드만 가질 수 있습니다 (unique_constraint).
EnrollmentStatus
| 값 | 의미 |
|---|---|
ENROLLED | 수강 중 |
DROPPED | 수강 취소됨 |
COMPLETED | 수료 완료 |
REST API
반 관리 API — 기본 경로: /v1/classes
| 메서드 | 경로 | 설명 |
|---|---|---|
POST | /v1/classes | 반 생성 (201 Created) |
GET | /v1/classes | 반 목록 조회 (teacherId, search 필터, 페이지) |
GET | /v1/classes/\{id\} | 반 상세 조회 |
PATCH | /v1/classes/\{id\} | 반 정보 수정 |
DELETE | /v1/classes/\{id\} | 반 삭제 |
GET | /v1/classes/teacher/\{teacherId\} | 강사별 담당 반 목록 |
GET | /v1/classes/student/\{studentId\} | 학생 수강 반 목록 |
GET | /v1/classes/statistics/dashboard | 반 현황 대시보드 통계 |
정렬 허용 필드
createdAt, name
수강 등록 API — 기본 경로: /v1/classes/\{classId\}/enrollments
| 메서드 | 경 로 | 설명 |
|---|---|---|
GET | /v1/classes/\{classId\}/enrollments | 수강생 목록 조회 |
POST | /v1/classes/\{classId\}/enrollments | 학생 수강 등록 (201 Created) |
DELETE | /v1/classes/\{classId\}/enrollments/\{enrollmentId\} | 수강 취소 (enrollmentId 기준) |
DELETE | /v1/classes/\{classId\}/enrollments/student/\{studentId\} | 수강 취소 (studentId 기준) |
PATCH | /v1/classes/\{classId\}/enrollments/\{enrollmentId\} | 수강 상태 변경 |
내부 API (libs/internal-api)
ClassService 인터페이스를 구현한 ClassServiceAdapter가 adapter/in/internal/에 위치합니다.
public interface ClassService {
Optional<ClassData> getClass(String tenantSlug, Long classId);
ClassListData getClassesByTeacher(String tenantSlug, Long teacherId, int page, int size);
ClassListData getClassesByStudent(String tenantSlug, Long studentId, int page, int size);
ClassListData getAllClasses(String tenantSlug, int page, int size);
List<Long> getEnrolledStudentIds(String tenantSlug, Long classId);
List<EnrolledClassData> getEnrolledClassesForStudents(
String tenantSlug, Collection<Long> studentIds);
}
소비 모듈 (in-process 주입):
| 소비자 모듈 | 사용 목적 |
|---|---|
notification | 반 전체 문자 발송 시 수강생 ID 조회 |
lecture | 강의 생성 시 반 존재 검증 |
assignment | 과제 생성 시 반 존재 검증 |
tuition | 청구서 발행 시 수강 여부 조회 |
멀티테넌시
classes 및 class_enrollments 테이블 모두 tenant_id BIGINT NOT NULL을 가지며 RLS 정책이 적용됩니다.