수업노트 도메인 (TeachingNote)¶
1. 한 줄 정의¶
선생님이 작성·공유하는 수업/학습 기록(수업 로그). 그룹 단위로 묶고, 세밀한 공개 범위로 학생·보호자에게 노출한다. 선생님 포트폴리오·브랜드, 학생 복습, 학부모 학습 현황 확인이 목적.
2. 핵심 개념¶
- TeachingNote — 노트 본체.
title,content(MEDIUMTEXT),taughtAt,viewCount,representative(대표 노트 여부),visibility(6단계 enum). FK:study_room_id(→ StudyRoom),teaching_note_group_id(→ Group, nullable) - TeachingNoteGroup — 노트 묶음.
study_room_idFK (룸 삭제 시 cascade) - TeachingNoteStudent — 특정 학생 공개(
SPECIFIC_STUDENTS_*) 시 매핑 테이블 (학생별 접근 권한) - TeachingNoteComment / TeachingNoteCommentRead — 노트 댓글과 학생별 읽음 기록
- 이미지는 별도
TeachingNoteImage엔티티가 아니라 공통 MediaAsset(target_type=TEACHING_NOTE) + 본문media://치환으로 처리(코드에 TeachingNoteImage 엔티티 없음) - Visibility 6단계 (
TeachingNoteVisibility) —TEACHER_ONLY/SPECIFIC_STUDENTS_ONLY/SPECIFIC_STUDENTS_AND_PARENTS/STUDY_ROOM_STUDENTS_ONLY/STUDY_ROOM_STUDENTS_AND_PARENTS/PUBLIC
3. 관련 코드¶
mvp-back:domain/teachingnotemvp-back:application/service/teachingnotemvp-front:src/app/(private)/learn-log
주요 API (실제 구현 — TeachingNoteController/TeachingNoteGroupController, prefix /api)¶
| Method | Path | 설명 |
|---|---|---|
| POST | /teacher/teaching-notes |
노트 작성(선생) |
| PUT/DELETE | /teacher/teaching-notes/{teachingNoteId} |
수정·삭제(선생) |
| POST | /teacher/teaching-notes/{teachingNoteId}/copy |
노트 복제 |
| GET | /teacher/study-rooms/{studyRoomId}/teaching-notes |
선생 목록 |
| GET | /student/study-rooms/{studyRoomId}/teaching-notes |
학생 목록 |
| GET | /common/teaching-notes/{teachingNoteId} |
상세 조회(권한 공통) |
| GET | /parent/student/{studentId}/teaching-notes/{teachingNoteId} |
보호자 조회 |
| POST/PUT/DELETE/GET | /common/teaching-notes/{teachingNoteId}/comments[/{commentId}] |
댓글 CRUD·조회 |
| GET | /common/teaching-notes/{teachingNoteId}/comments/{commentId}/readers |
댓글 읽은 사람 |
| POST/PUT/DELETE | /teacher/teaching-note-groups[...] |
그룹 생성·수정·삭제·노트 그룹 배정 |
이미지 첨부는 응답에서 본문의 media:// 식별자를 presigned URL로 치환(MediaAsset).
4. 상태/생명주기¶
조회 로직(접근권한): PUBLIC이면 join 없이 룸 전원 조회, SPECIFIC_STUDENTS_*면 teaching_note_student join해 지정 학생만. 룸 삭제 시 그룹/노트 cascade 소프트 딜리트.
그룹화는 현행 유지하되, 추후 [모의고사]·[내신대비] 등 태그 기능으로 디벨롭 예정 (250702 PD-BE 회의).
5. 외부 의존¶
- S3 (이미지 첨부 — MediaAsset
media://기반 presigned URL 변환) - Tiptap (프론트 에디터) → 에디터 고도화 개발 명세 (FRD)
6. UI 노출¶
- 학습노트 작성/수정: Tiptap 에디터, 대상 학생 선택 flow
- 학습노트 상세 + 조회수(가능하면 동일 IP 1일 1회)
- 로그 리스트: 검색(제목/이름), 정렬(최신 default / 오래된 / 가나다 / 조회수)
7. 권한 / 정책 요약¶
- 코드 강제 제한: 대표 노트(
representative) 개수 상한(REPRESENTATIVE_LIMIT_EXCEEDED). "사용자당 5,000 / 룸당 1,000"은 기획 정책으로 백엔드 카운트 제한 코드 없음 - 노트 삭제 시
teaching_note_homework·teaching_note_student매핑도 함께 정리(TeachingNoteService) - CRUD: 선생님 전부 O, 학생/보호자/비회원 R만 (선생님이 visibility로 권한 부여)
- 역할별 접근 권한 SSOT는 member §7