스터디룸 도메인 (StudyRoom)¶
1. 한 줄 정의¶
선생님이 개설·운영하는 학습 공간 단위. 학생을 초대해 수업노트·과제·QnA를 한 곳에 모은다. 선생님에겐 자기표현·포트폴리오 공간, 학생에겐 소통·질문 동기부여 공간. (구 "클래스"가 스터디룸으로 통합)
2. 핵심 개념¶
- StudyRoom — 본체(선생님 소유).
name,description,characteristic(에디터),visibility(PRIVATE/PUBLIC),modality/classForm/subjectType, 학교·학년은SchoolInfo임베디드(school_level/grade),capacity(생성 시 기본 100),enrollmentStatus(OPEN/OPERATING),thumbnailMediaId. FK는member_id(→TeacherEntity). 링크(StudyRoomLinkEntity)는 최대 5개(MAX_LINK_COUNT) - StudyRoomStudent — 학생 가입·승인 매핑.
state는 공통ConnectionStateenum 재사용:PENDING / APPROVED / REJECTED / TERMINATED.out_date(수업 종료일, nullable) - 초대(Invitation) — Owner(생성 선생님)만 가능. 이메일 입력 or 초대 링크(token). 학생만 초대(보호자는 학생에 귀속) → 학생 초대 개발 명세 (FRD)
- 프리뷰 — PUBLIC 스터디룸은 비회원도 미리보기(이름/설명/문의) 조회 가능 → 스터디룸 소개(프리뷰) PRD
3. 관련 코드¶
mvp-back:domain/studyroom,mvp-back:domain/studyroomstudentmvp-back:application/service/studyroommvp-front:src/app/(private)/studyroom,(public)/studyrooms(프리뷰)- 엔티티 영속화: StudyRoomEntity는 영속 TeacherEntity를
findById로 조회 후 조립 (어댑터 패턴, 엔티티/도메인 상호 비의존)
4. 상태/생명주기¶
StudyRoom.enrollmentStatus: OPEN(모집 중) → OPERATING(운영 중) → soft delete (deleted_at)
StudyRoomStudent.state(ConnectionState): PENDING → APPROVED → TERMINATED
→ REJECTED
StudyRoomEntity·StudyRoomStudentEntity 모두 @SQLDelete+@SQLRestriction("deleted_at IS NULL")로 soft delete. 룸 삭제 시 StudyRoomService.deleteStudyRoomCascade가 수업노트 계열만 연쇄 삭제: teachingNoteStudent → teachingNote → teachingNoteGroup → studyRoomStudent → studyRoomInvitation → studyRoom 순(벌크). 과제(Homework)는 이 cascade에 포함되지 않는다(코드상 미연쇄) → teaching-note.
5. 외부 의존¶
- S3 (썸네일/첨부)
- 초대 발송 시 알림 생성(LNB 빨간점/GNB) — qna 외 알림 공통 → 알림 개발 명세 (FRD)
6. UI 노출¶
- 스터디룸 리스트:
(home)/studyrooms(정렬: 생성순 default / 가나다순) - 생성/관리/대시보드:
(private)/studyroom→ 스터디룸 대시보드 PRD - 공개 프리뷰(비회원):
(public)/studyrooms
7. 권한 / 정책 요약¶
| 역할 | 권한 |
|---|---|
| 비회원 | PUBLIC 목록·프리뷰·초대 링크(token) 조회만 |
| 선생님 | 자신이 생성한 룸 CRUD(validateTeacher로 소유 검증), 학생 초대·퇴장(terminate)·재수강(resume) |
| 학생 | 직접 생성·가입요청 불가. 초대(study-room-invites/{id}/respond 또는 {token}/respond)로만 입장 |
| 보호자 | 전용 API 없음. 연결된 자녀 활동을 통해 간접 조회 → member |
- 코드 강제 제한: 초대 인원은
capacity(기본 100) 초과 불가(canInviteMembers), 링크는 룸당 최대 5개(MAX_LINK_COUNT) - "사용자당 룸 5개 / 룸당 로그 1,000개"는 기획 정책으로, 현재 백엔드에 카운트 제한 코드 없음
- 역할별 접근 권한 SSOT는 member §7