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

수업노트 도메인 (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_id FK (룸 삭제 시 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/teachingnote
  • mvp-back:application/service/teachingnote
  • mvp-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. 상태/생명주기

draft → published → soft deleted (deleted_at)

조회 로직(접근권한): PUBLIC이면 join 없이 룸 전원 조회, SPECIFIC_STUDENTS_*teaching_note_student join해 지정 학생만. 룸 삭제 시 그룹/노트 cascade 소프트 딜리트.

그룹화는 현행 유지하되, 추후 [모의고사]·[내신대비]태그 기능으로 디벨롭 예정 (250702 PD-BE 회의).

5. 외부 의존

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

8. 결정 이력 / TODO

  • 수업 노트 관리 FRD — 2차 스프린트 DONE → 수업노트 FRD
  • Entity 변환은 엔티티/도메인이 서로 모르게 어댑터에서 책임
  • 뷰카운트 정교화(중복 방지) — 구현 비용 3일+ 예상 시 단순 카운트만
  • 수업노트별 숙제 다는 기능, 학생 읽음 확인 (팔로우업) → homework