콘텐츠로 이동
✍️ 수정가능누구나 고쳐도 됩니다. 고치면 하단 frontmatter의 갱신일·작성자·변경요약을 남겨 주세요.작성 Claude · 2026-06-05 · 엔티티·FK·enum·cascade·권한을 백엔드 코드와 정렬

스터디룸 도메인 (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는 공통 ConnectionState enum 재사용: PENDING / APPROVED / REJECTED / TERMINATED. out_date(수업 종료일, nullable)
  • 초대(Invitation) — Owner(생성 선생님)만 가능. 이메일 입력 or 초대 링크(token). 학생만 초대(보호자는 학생에 귀속) → 학생 초대 개발 명세 (FRD)
  • 프리뷰 — PUBLIC 스터디룸은 비회원도 미리보기(이름/설명/문의) 조회 가능 → 스터디룸 소개(프리뷰) PRD

3. 관련 코드

  • mvp-back:domain/studyroom, mvp-back:domain/studyroomstudent
  • mvp-back:application/service/studyroom
  • mvp-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. 외부 의존

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

8. 결정 이력 / TODO

  • 스터디룸 (+학생초대) FRD — 2차 스프린트 DONE → 스터디룸 FRD
  • 헥사고날 — StudyRoom save 어댑터 패턴 (영속 엔티티 안전 조립)
  • 활성화/비활성화 토글 (TBD)
  • 챌린지 기능이 StudyRoom 컨텍스트 안인지 글로벌인지 → 코드상 challenge는 글로벌 단일 도메인(스터디룸 귀속 미구현)
  • 스터디룸 육성/프리미엄 기능 (추후 BM)