본문으로 건너뛰기

Class 모듈

학원의 반(학급) 생성·수정·삭제, 학생 수강 등록·취소, 수강 현황 조회 및 대시보드 통계를 담당하는 모듈입니다. 패키지 이름은 com.lumie.classroom입니다.

모듈 개요

항목내용
Gradle 서브프로젝트modules/class
베이스 패키지com.lumie.classroom
데이터베이스PostgreSQL (멀티테넌트 RLS, classes / class_enrollments 테이블)
외부 노출 internal-apiClassService

주요 책임

  • 반 개설·수정·삭제
  • 담당 강사(teacherId) 지정
  • 수업 일정 패턴(요일별 시작·종료 시간) 관리 — SchedulePattern JSONB 저장
  • 학생의 반 수강 등록·취소·수료 처리
  • 반별 수강 현황 및 대시보드 통계 집계

도메인 모델

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;
}

SchedulePatternjsonb 컬럼에 직렬화되며, 요일별 수업 세션 목록(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 인터페이스를 구현한 ClassServiceAdapteradapter/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청구서 발행 시 수강 여부 조회

멀티테넌시

classesclass_enrollments 테이블 모두 tenant_id BIGINT NOT NULL을 가지며 RLS 정책이 적용됩니다.

관련 문서