콘텐츠로 이동

TeachingNote

1. 한 줄 정의

선생님이 작성·공유하는 수업/학습 기록(수업 로그). 그룹 단위로 묶고, 세밀한 공개 범위로 학생·보호자에게 노출한다. 선생님 포트폴리오·브랜드, 학생 복습, 학부모 학습 현황 확인이 목적.

2. 핵심 개념

  • TeachingNote — 노트 본체. title(30자), content(text, 3,000자), taught_at, view_count, visibility(6단계 enum), study_room_id/teaching_note_group_id FK
  • TeachingNoteGroup — 노트 묶음. title(15자), study_room_id FK (룸 삭제 시 CASCADE)
  • TeachingNoteStudent — 특정 학생 공개 시 매핑 테이블 (학생별 접근 권한)
  • TeachingNoteImage — 이미지 첨부. image_id(unique), mime_type, s3key, size_bytes, teacher_id FK
  • Visibility 6단계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
  • DDL: teaching_note, teaching_note_group, teaching_note_student, teaching_note_image (teams/engineering/infra/db-ddl)
  • GET /teaching-notes/{teachingNoteId} — content 리소스 상세조회 시 image_id → presigned URL 변환 (teams/engineering/guides/image-media-api)
  • mvp-front:src/app/(private)/learn-log

4. 상태/생명주기

draft → published → soft deleted (deleted_at)

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

5. 외부 의존

  • S3 (이미지 첨부 — image_id 기반 presigned URL 변환)
  • Tiptap (프론트 에디터)

6. UI 노출

  • 학습노트 작성/수정: Tiptap 에디터, 대상 학생 선택 flow
  • 학습노트 상세 + 조회수(가능하면 동일 IP 1일 1회)
  • 로그 리스트: 검색(제목/이름), 정렬(최신 default / 오래된 / 가나다 / 조회수)

7. 결정 이력

  • 수업 노트 관리 FRD — 2차 스프린트 DONE
  • Entity 변환은 엔티티/도메인이 서로 모르게 어댑터에서 책임 (teams/engineering/guides/jpa-query 어댑터 패턴)

8. 정책 요약

  • 사용자당 생성 제한 5,000개 / 룸당 1,000개
  • 회원 탈퇴 시 자동 삭제 안 됨
  • 동적 항목: 수정 시 참조 항목 모두 업데이트
  • CRUD: 선생님 전부 O, 학생/보호자/비회원 R만 (선생님이 visibility로 권한 부여)

9. 열린 질문 / TODO

  • 뷰카운트 정교화(중복 방지) 구현 비용 검토 — 3일+ 예상 시 단순 카운트만
  • 수업노트별 숙제 다는 기능, 학생 읽음 확인 (팔로우업)
  • 사고력 답변 구조가 노트 답변 형태에 도입될 수 있는지 → teams/engineering/concepts/사고력-답변구조-v0.2