Skip to content

Latest commit

Β 

History

History
1494 lines (1188 loc) Β· 57.3 KB

File metadata and controls

1494 lines (1188 loc) Β· 57.3 KB

데이터 λͺ¨λΈ

Altsis 학ꡐ 정보 μ‹œμŠ€ν…œμ˜ MongoDB μŠ€ν‚€λ§ˆ(Mongoose) 전체 λͺ…μ„Έμž…λ‹ˆλ‹€. λͺ¨λ“  λͺ¨λΈμ€ backend/src/models/ 디렉토리에 μ •μ˜λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.


λͺ©μ°¨

  1. Academy (아카데미)
  2. User (μ‚¬μš©μž)
  3. School (학ꡐ)
  4. Season (ν•™κΈ°)
  5. Registration (ν•™κΈ° 등둝)
  6. Syllabus (κ°•μ˜κ³„νšμ„œ)
  7. Enrollment (μˆ˜κ°•)
  8. Archive (기둝)
  9. Form (양식)
  10. Board (λ³΄λ“œ)
  11. Post (κ²Œμ‹œκΈ€)
  12. Comment (λŒ“κΈ€)
  13. Notification (μ•Œλ¦Ό)
  14. NotificationSetting (μ•Œλ¦Ό μ„€μ •)
  15. CalendarEvent (μΊ˜λ¦°λ” 일정)
  16. UserCalendar (μ‚¬μš©μž μΊ˜λ¦°λ”)
  17. ChatRoom (μ±„νŒ…λ°©)
  18. ChatMessage (μ±„νŒ… λ©”μ‹œμ§€)
  19. ChatFile (μ±„νŒ… 파일)
  20. Reminder (λ¦¬λ§ˆμΈλ”)
  21. ThemeSetting (ν…Œλ§ˆ μ„€μ •)
  22. Apps (μ•±)
  23. TimeBlock (μ‹œκ°„ 블둝)
  24. AltForm (양식 λΉŒλ”)
  25. AltSheet (μ‹œνŠΈ)
  26. AltSheetRow (μ‹œνŠΈ ν–‰)
  27. AltSheetOpen (μ‹œνŠΈ μ—΄λžŒ)
  28. AIChatSession (AI μ±„νŒ… μ„Έμ…˜)
  29. AIChatMessage (AI μ±„νŒ… λ©”μ‹œμ§€)
  30. AIUsageLog (AI μ‚¬μš©λŸ‰ 둜그)
  31. BoardFavorite (λ³΄λ“œ 즐겨찾기)
  32. SurveyResponse (μ„€λ¬Έ 응닡)
  33. RequestStat (μš”μ²­ 톡계)

Academy (아카데미)

μ•„μΉ΄λ°λ―ΈλŠ” μ‹œμŠ€ν…œμ˜ μ΅œμƒμœ„ λ‹¨μœ„μž…λ‹ˆλ‹€. 아카데미 λ¬Έμ„œλŠ” 루트 DB에 μ €μž₯되며, 각 μ•„μΉ΄λ°λ―ΈλŠ” 독립적인 λ°μ΄ν„°λ² μ΄μŠ€({academyId}-db)λ₯Ό κ°€μ§‘λ‹ˆλ‹€.

파일: backend/src/models/Academy.js DB: 루트 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
academyId_1 UNIQUE

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
academyId String O - 아카데미 고유 ID (μœ νš¨μ„± 검사 적용)
academyName String O - 아카데미 이름 (μœ νš¨μ„± 검사 적용)
email String X - 이메일 (μœ νš¨μ„± 검사 적용)
tel String X - μ „ν™”λ²ˆν˜Έ (μœ νš¨μ„± 검사 적용)
adminId String O - κ΄€λ¦¬μž μ‚¬μš©μž ID (μœ νš¨μ„± 검사 적용)
adminName String O - κ΄€λ¦¬μž 이름 (μœ νš¨μ„± 검사 적용)
dbName String μžλ™ - 아카데미 DBλͺ… ({academyId}-db). API μ‘λ‹΅μ—μ„œ μ œμ™Έ (select: false)
isActivated Boolean X true ν™œμ„±ν™” μƒνƒœ. false이면 둜그인 λΆˆκ°€
chatEnabled Boolean X false μ±„νŒ… κΈ°λŠ₯ ν™œμ„±ν™” μƒνƒœ
boardEnabled Boolean X false λ³΄λ“œ κΈ°λŠ₯ ν™œμ„±ν™” μƒνƒœ
aiEnabled Boolean X false AI κΈ°λŠ₯ ν™œμ„±ν™” μƒνƒœ
aiProvider String X "gemini" AI 제곡자 (openai / anthropic / gemini)
aiApiKey String X - μ„ νƒν•œ 제곡자의 API ν‚€. API μ‘λ‹΅μ—μ„œ μ œμ™Έ (select: false)
aiModel String X "gemini-3.6-flash" μ‚¬μš© AI λͺ¨λΈλͺ…
aiUsageLimits Object X { enabled: false, dailyUserAlts: 0 } μ‚¬μš©μžλ³„ 일(UTC) Alt ν•œλ„
aiUsageLimits.enabled Boolean X false ν•œλ„ 적용 μ—¬λΆ€
aiUsageLimits.dailyUserAlts Number X 0 1인당 일일 Alt ν•œλ„ (1 Alt = 10,000 토큰)
createdAt Date μžλ™ - 생성 μ‹œκ° (timestamps)
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ° (timestamps)

pre-save ν›…

  • academyIdκ°€ λ³€κ²½λ˜λ©΄ dbName을 {academyId}-db둜 μžλ™ μ„€μ •ν•©λ‹ˆλ‹€.

User (μ‚¬μš©μž)

μ‚¬μš©μž 계정 μ •λ³΄μž…λ‹ˆλ‹€. λΉ„λ°€λ²ˆν˜ΈλŠ” bcrypt둜 ν•΄μ‹œν™”λ˜μ–΄ μ €μž₯λ©λ‹ˆλ‹€.

파일: backend/src/models/User.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
userId_1 UNIQUE

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
userId String O - μ‚¬μš©μž 고유 ID (μœ νš¨μ„± 검사 적용)
userName String O - μ‚¬μš©μž 이름 (μœ νš¨μ„± 검사 적용)
password String O - λΉ„λ°€λ²ˆν˜Έ. bcrypt ν•΄μ‹œ. API μ‘λ‹΅μ—μ„œ μ œμ™Έ (select: false)
auth String X "member" κΆŒν•œ λ“±κΈ‰. enum: "owner", "admin", "manager", "member"
email String X - 이메일 (μœ νš¨μ„± 검사 적용)
tel String X - μ „ν™”λ²ˆν˜Έ (μœ νš¨μ„± 검사 적용)
snsId Object X - μ†Œμ…œ 둜그인 계정
snsId.google String X - μ—°κ²°λœ Google 이메일
schools Array X [] λ“±λ‘λœ 학ꡐ λͺ©λ‘
schools[].school ObjectId - - 학ꡐ _id
schools[].schoolId String - - 학ꡐ ID
schools[].schoolName String - - 학ꡐ 이름
profile String X - ν”„λ‘œν•„ 사진 URL
academyId String X - μ†Œμ† 아카데미 ID
academyName String X - μ†Œμ† 아카데미 이름
createdAt Date μžλ™ - 생성 μ‹œκ° (timestamps)
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ° (timestamps)

pre-save ν›…

  • passwordκ°€ λ³€κ²½λ˜λ©΄ bcrypt둜 ν•΄μ‹œν™”ν•˜μ—¬ μ €μž₯ν•©λ‹ˆλ‹€ (salt rounds: ν™˜κ²½λ³€μˆ˜ saltRounds).

μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ

  • comparePassword(plainPassword): 평문 λΉ„λ°€λ²ˆν˜Έλ₯Ό ν•΄μ‹œμ™€ λΉ„κ΅ν•©λ‹ˆλ‹€.

School (학ꡐ)

학ꡐ 정보와 기둝 양식(FormArchive)을 κ΄€λ¦¬ν•©λ‹ˆλ‹€.

파일: backend/src/models/School.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
schoolId_1 UNIQUE

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
schoolId String O - 학ꡐ 고유 ID (μœ νš¨μ„± 검사 적용)
schoolName String O - 학ꡐ 이름 (μœ νš¨μ„± 검사 적용)
formArchive Array X [] 기둝 양식 λͺ©λ‘
deletedFormArchive Array X [] μ‚­μ œλœ 기둝 양식 (νœ΄μ§€ν†΅)
links Array X [] μ™ΈλΆ€ 링크 λͺ©λ‘
createdAt Date μžλ™ - 생성 μ‹œκ°
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ°

μ„œλΈŒ λ„νλ¨ΌνŠΈ: FormArchiveItem

ν•„λ“œ νƒ€μž… κΈ°λ³Έκ°’ μ„€λͺ…
label String - 양식 이름
dataType String "array" 데이터 νƒ€μž…. enum: "array", "object"
fields Array - ν•„λ“œ μ •μ˜ λ°°μ—΄
fields[].label String - ν•„λ“œ 이름
fields[].type String "input" enum: "select", "input", "input-number", "file", "file-image"
fields[].options String[] [] 선택지
fields[].runningTotal Boolean false λˆ„μ  합계 ν‘œμ‹œ
fields[].total Boolean false 합계 ν‘œμ‹œ
authTeacher String "undefined" enum: "undefined", "viewAndEditStudents", "viewAndEditMyStudents"
authStudent String "undefined" enum: "undefined", "view", "viewAndEdit"
authManager String "undefined" enum: "undefined", "viewAndEdit"

μ„œλΈŒ λ„νλ¨ΌνŠΈ: DeletedFormArchiveItem

FormArchiveItemκ³Ό λ™μΌν•œ ꡬ쑰에 deletedAt ν•„λ“œκ°€ μΆ”κ°€λ©λ‹ˆλ‹€.

ν•„λ“œ νƒ€μž… κΈ°λ³Έκ°’ μ„€λͺ…
deletedAt Date Date.now μ‚­μ œ μ‹œμ 

μ„œλΈŒ λ„νλ¨ΌνŠΈ: Link

ν•„λ“œ νƒ€μž… μ„€λͺ…
url String URL (예: https://www.naver.com)
title String 링크 제λͺ© (예: "넀이버")

Season (ν•™κΈ°)

ν•™κΈ° μ •λ³΄λ‘œ, κΈ°κ°„, ꡐ과λͺ©, κ°•μ˜μ‹€, 양식, κΆŒν•œ 등을 ν¬ν•¨ν•©λ‹ˆλ‹€.

파일: backend/src/models/Season.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
school_1, year_-1, term_1 UNIQUE, COMPOUND

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
school ObjectId O - 학ꡐ _id
schoolId String O - 학ꡐ ID
schoolName String O - 학ꡐ 이름
year String O - 학년도 (예: "2024학년도")
term String O - ν•™κΈ° (예: "1ν•™κΈ°")
period Object X {start:"", end:""} κΈ°κ°„
period.start String - "" μ‹œμž‘μΌ (YYYY-MM-DD λ˜λŠ” 빈 λ¬Έμžμ—΄)
period.end String - "" μ’…λ£ŒμΌ (YYYY-MM-DD λ˜λŠ” 빈 λ¬Έμžμ—΄)
classrooms String[] X [] κ°•μ˜μ‹€ λͺ©λ‘
subjects Object X {label:[], data:[]} ꡐ과λͺ©
subjects.label String[] - [] λΆ„λ₯˜ 라벨 (예: ["ꡐ과","κ³Όλͺ©"])
subjects.data String[][] - [] ꡐ과λͺ© 데이터 (예: [["κ΅­μ–΄","ν˜„λŒ€μ‹œ"]])
formTimetable Object X - μ‹œκ°„ν‘œ 양식 ({title, data})
formSyllabus Object X - κ°•μ˜κ³„νšμ„œ 양식 ({title, data})
formEvaluation Array X [] 평가 양식 ν•­λͺ© λ°°μ—΄
permissionSyllabusV2 Object X (μ•„λž˜ μ°Έμ‘°) μˆ˜μ—… κ°œμ„€ κΆŒν•œ
permissionEnrollmentV2 Object X (μ•„λž˜ μ°Έμ‘°) μˆ˜κ°•μ‹ μ²­ κΆŒν•œ
permissionEvaluationV2 Object X (μ•„λž˜ μ°Έμ‘°) 평가 κΆŒν•œ
aiSettings Object X (μ•„λž˜ μ°Έμ‘°) AI μ„€μ •
isActivated Boolean X false ν™œμ„±ν™” μƒνƒœ
isActivatedFirst Boolean X false 졜초 ν™œμ„±ν™” μ—¬λΆ€
createdAt Date μžλ™ - 생성 μ‹œκ°
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ°

μ„œλΈŒ λ„νλ¨ΌνŠΈ: Permission

κΈ°λ³Έκ°’: { teacher: false, student: false, exceptions: [] }

ν•„λ“œ νƒ€μž… μ„€λͺ…
teacher Boolean ꡐ사 μ—­ν•  ν—ˆμš© μ—¬λΆ€
student Boolean 학생 μ—­ν•  ν—ˆμš© μ—¬λΆ€
exceptions Array μ˜ˆμ™Έ μ‚¬μš©μž λͺ©λ‘
exceptions[].registration String Registration _id
exceptions[].role String μ—­ν• 
exceptions[].user String μ‚¬μš©μž _id
exceptions[].userId String μ‚¬μš©μž ID
exceptions[].userName String μ‚¬μš©μž 이름
exceptions[].isAllowed Boolean ν—ˆμš© μ—¬λΆ€

μ„œλΈŒ λ„νλ¨ΌνŠΈ: FormEvaluationItem

ν•„λ“œ νƒ€μž… κΈ°λ³Έκ°’ μ„€λͺ…
label String - 평가 ν•­λͺ©λͺ… (예: "λ©˜ν† ν‰κ°€")
type String "input" enum: "input", "input-number", "select"
options String[] [] 선택지 (type이 select인 경우)
combineBy String "term" 동기화 λ‹¨μœ„. enum: "term", "year"
authOption String "editByTeacher" κΆŒν•œ μ˜΅μ…˜. enum: "editByStudent", "editByTeacher", "editByTeacherAndStudentCanView"
auth Object - authOption에 따라 μžλ™ μ„€μ •
auth.edit Object - νŽΈμ§‘ κΆŒν•œ ({teacher, student})
auth.view Object - μ—΄λžŒ κΆŒν•œ ({teacher, student})

μ„œλΈŒ λ„νλ¨ΌνŠΈ: AiSettings

κΈ°λ³Έκ°’: { enabled: false, permission: {teacher: false, student: false}, guidelines: "", references: [], examples: {} }

ν•„λ“œ νƒ€μž… κΈ°λ³Έκ°’ μ„€λͺ…
enabled Boolean false AI ν™œμ„±ν™”
permission.teacher Boolean false ꡐ사 AI μ‚¬μš© κΆŒν•œ
permission.student Boolean false 학생 AI μ‚¬μš© κΆŒν•œ
guidelines String "" AI κΈ°λ³Έ μ§€μΉ¨
examples Object {} 양식 ν•„λ“œλͺ… β†’ λͺ¨λ²” λ¬Έμž₯
references Array [] 참고자료 λ°°μ—΄
references[].title String - 자료 제λͺ©
references[].content String - 자료 λ‚΄μš©
references[].fileName String - 파일λͺ…
references[].fileKey String - S3 ν‚€
references[].fileSize Number - 파일 크기
references[].mimeType String - MIME νƒ€μž…

μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ

  • getSubdocument(): λ‹€λ₯Έ λͺ¨λΈμ— λ‚΄μž₯ν•  ν•™κΈ° ν•˜μœ„ λ¬Έμ„œλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

Registration (ν•™κΈ° 등둝)

μ‚¬μš©μžμ˜ 학기별 등둝 정보(μ—­ν• , ν•™λ…„, 담당ꡐ사 λ“±)λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€.

파일: backend/src/models/Registration.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
season_1, user_1 UNIQUE, COMPOUND
user_1 INDEX

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
season ObjectId O - ν•™κΈ° _id
school ObjectId X - 학ꡐ _id
schoolId String X - 학ꡐ ID
schoolName String X - 학ꡐ 이름
year String X - 학년도
term String X - ν•™κΈ°
period Object X - κΈ°κ°„ (Seasonμ—μ„œ 볡사)
user ObjectId O - μ‚¬μš©μž _id
userId String O - μ‚¬μš©μž ID
userName String O - μ‚¬μš©μž 이름
role String O "student" μ—­ν• . enum: "student", "teacher"
grade String X - ν•™λ…„
group String X - κ·Έλ£Ή
teacher ObjectId X - λ‹΄λ‹Ή ꡐ사 _id
teacherId String X - λ‹΄λ‹Ή ꡐ사 ID
teacherName String X - λ‹΄λ‹Ή ꡐ사 이름
subTeacher ObjectId X - λΆ€λ‹΄λ‹Ή ꡐ사 _id
subTeacherId String X - λΆ€λ‹΄λ‹Ή ꡐ사 ID
subTeacherName String X - λΆ€λ‹΄λ‹Ή ꡐ사 이름
isActivated Boolean X false ν•™κΈ° ν™œμ„±ν™” μƒνƒœ (Seasonμ—μ„œ 동기화)
memos Array X [] λ©”λͺ¨ λ°°μ—΄
memos[].title String - - λ©”λͺ¨ 제λͺ©
memos[].day String - - μš”μΌ
memos[].start String - - μ‹œμž‘ μ‹œκ°„
memos[].end String - - μ’…λ£Œ μ‹œκ°„
memos[].memo String - - λ©”λͺ¨ λ‚΄μš©
permissionSyllabusV2 Boolean X false μˆ˜μ—… κ°œμ„€ κΆŒν•œ
permissionEnrollmentV2 Boolean X false μˆ˜κ°•μ‹ μ²­ κΆŒν•œ
permissionEvaluationV2 Boolean X false 평가 κΆŒν•œ
formEvaluation Array X [] 평가 양식 (Seasonμ—μ„œ 볡사)

Syllabus (κ°•μ˜κ³„νšμ„œ)

μˆ˜μ—… κ°œμ„€ 정보λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€.

파일: backend/src/models/Syllabus.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
season_1 INDEX

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
season ObjectId O - ν•™κΈ° _id
school ObjectId X - 학ꡐ _id
schoolId String X - 학ꡐ ID
schoolName String X - 학ꡐ 이름
year String X - 학년도
term String X - ν•™κΈ°
user ObjectId O - κ°œμ„€μž _id
userId String O - κ°œμ„€μž μ‚¬μš©μž ID
userName String O - κ°œμ„€μž 이름
classTitle String O - μˆ˜μ—… 제λͺ©
time Array X [] μˆ˜μ—… μ‹œκ°„ (TimeBlock λ°°μ—΄)
classroom String X - κ°•μ˜μ‹€
subject String[] X [] ꡐ과λͺ© λΆ„λ₯˜
point Number X 0 학점
limit Number X 0 μˆ˜κ°• 정원 (0: λ¬΄μ œν•œ)
count Number X 0 ν˜„μž¬ μˆ˜κ°•μƒ 수
count_limit String X - μˆ˜κ°•/정원 ν‘œμ‹œ λ¬Έμžμ—΄
info Object X - μ„ΈλΆ€ 정보 (에디터 데이터)
teachers Array O - λ©˜ν† (ꡐ사) λͺ©λ‘ (μ΅œμ†Œ 1λͺ… ν•„μˆ˜)
teachers[]._id ObjectId O - ꡐ사 _id
teachers[].userId String O - ꡐ사 μ‚¬μš©μž ID
teachers[].userName String O - ꡐ사 이름
teachers[].confirmed Boolean X false 승인 μƒνƒœ
teachers[].isHiddenFromCalendar Boolean X false μΊ˜λ¦°λ” μˆ¨κΉ€
coverImage String X - 컀버 이미지 URL
coverColor String X - 컀버 λ°°κ²½ 색상
createdAt Date μžλ™ - 생성 μ‹œκ°
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ°

pre-save ν›…

  • time이 λ³€κ²½λ˜λ©΄ μš”μΌ+μ‹œμž‘μ‹œκ°„ 순으둜 μžλ™ μ •λ ¬ν•©λ‹ˆλ‹€.

Enrollment (μˆ˜κ°•)

ν•™μƒμ˜ μˆ˜κ°• 정보와 평가 데이터λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€. 평가 λ°μ΄ν„°λŠ” μ•”ν˜Έν™”λ˜μ–΄ μ €μž₯λ©λ‹ˆλ‹€.

파일: backend/src/models/Enrollment.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€ μ•”ν˜Έν™”: mongoose-encryption (evaluation ν•„λ“œ)

인덱슀

인덱슀 속성
_id UNIQUE
syllabus_1, student_1 UNIQUE, COMPOUND
student_1, season_1 COMPOUND

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
κ°•μ˜κ³„νšμ„œ 데이터
syllabus ObjectId O - κ°•μ˜κ³„νšμ„œ _id
season ObjectId X - ν•™κΈ° _id
school ObjectId X - 학ꡐ _id
schoolId String X - 학ꡐ ID
schoolName String X - 학ꡐ 이름
year String X - 학년도
term String X - ν•™κΈ°
user ObjectId X - κ°œμ„€μž _id
userId String X - κ°œμ„€μž μ‚¬μš©μž ID
userName String X - κ°œμ„€μž 이름
classTitle String X - μˆ˜μ—… 제λͺ©
time Array X [] μˆ˜μ—… μ‹œκ°„
classroom String X - κ°•μ˜μ‹€
subject String[] X [] ꡐ과λͺ©
point Number X - 학점
limit Number X - μˆ˜κ°• 정원
count_limit String X - μˆ˜κ°•/정원 ν‘œμ‹œ
info Object X - μ„ΈλΆ€ 정보
teachers Array X - λ©˜ν†  λͺ©λ‘
coverImage String X - 컀버 이미지
coverColor String X - 컀버 색상
μˆ˜κ°• 데이터
student ObjectId O - μˆ˜κ°•μƒ(학생) _id
studentId String X - 학생 μ‚¬μš©μž ID
studentName String X - 학생 이름
studentGrade String X - 학생 ν•™λ…„
evaluation Object X - 평가 데이터. μ•”ν˜Έν™” μ €μž₯. 예: {"λ©˜ν† ν‰κ°€": "...", "μΆœμ„λ“±κΈ‰": "A"}
memo String X - λ©”λͺ¨
isHiddenFromCalendar Boolean X false μΊ˜λ¦°λ” μˆ¨κΉ€ μ„€μ •
createdAt Date μžλ™ - 생성 μ‹œκ°
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ°

μ€‘μš”: evaluation ν•„λ“œλŠ” mongoose-encryption으둜 μ•”ν˜Έν™”λ©λ‹ˆλ‹€. 평가 쑰회 μ „μš© API(GET /api/enrollments/evaluation)μ—μ„œλ§Œ λ³΅ν˜Έν™”λœ 데이터가 λ°˜ν™˜λ©λ‹ˆλ‹€.


Archive (기둝)

ν•™μƒμ˜ 기둝 데이터λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€. ν•™κ΅μ˜ 기둝 양식(FormArchive)에 따라 κ΅¬μ‘°ν™”λœ 데이터가 μ•”ν˜Έν™”λ˜μ–΄ μ €μž₯λ©λ‹ˆλ‹€.

파일: backend/src/models/Archive.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€ μ•”ν˜Έν™”: mongoose-encryption (data ν•„λ“œ)

인덱슀

인덱슀 속성
_id UNIQUE
school_1, user_1 UNIQUE, COMPOUND

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
user ObjectId O - μ‚¬μš©μž _id
userId String X - μ‚¬μš©μž ID
userName String X - μ‚¬μš©μž 이름
school ObjectId O - 학ꡐ _id
schoolId String X - 학ꡐ ID
schoolName String X - 학ꡐ 이름
data Object X {} 기둝 데이터. μ•”ν˜Έν™” μ €μž₯. 예: {"인적사항": {"이름": "홍길동"}, "성적기둝": [{...}]}
createdAt Date μžλ™ - 생성 μ‹œκ°
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ°

Form (양식)

μ‹œκ°„ν‘œ, κ°•μ˜κ³„νšμ„œ, μΈμ‡„μš© 양식 λ“±μ˜ λ¬Έμ„œ ν…œν”Œλ¦Ώμ„ κ΄€λ¦¬ν•©λ‹ˆλ‹€.

파일: backend/src/models/Form.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
userId String X - μž‘μ„±μž μ‚¬μš©μž ID
userName String X - μž‘μ„±μž 이름
type String O - 양식 νƒ€μž… (예: "timetable", "syllabus", "print")
title String O - 양식 제λͺ©
archived Boolean X false 보관 처리 μ„€μ •
data Array X - 에디터에 μ˜ν•΄ μ„€μ •λœ 양식 데이터
permissionView Object X (μ•„λž˜ μ°Έμ‘°) λ¬Έμ„œ μ—΄λžŒ κΆŒν•œ
createdAt Date μžλ™ - 생성 μ‹œκ°
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ°

μ„œλΈŒ λ„νλ¨ΌνŠΈ: FormPermission

κΈ°λ³Έκ°’: { teacher: true, student: false, exceptions: [] }

ν•„λ“œ νƒ€μž… μ„€λͺ…
teacher Boolean ꡐ사 μ—΄λžŒ κΆŒν•œ
student Boolean 학생 μ—΄λžŒ κΆŒν•œ
exceptions Array μ˜ˆμ™Έ μ‚¬μš©μž λͺ©λ‘
exceptions[].user ObjectId μ‚¬μš©μž _id
exceptions[].userId String μ‚¬μš©μž ID
exceptions[].userName String μ‚¬μš©μž 이름
exceptions[].isAllowed Boolean ν—ˆμš© μ—¬λΆ€

Board (λ³΄λ“œ)

학ꡐ별 λ³΄λ“œλ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€. Alt Board λͺ¨λ“œμ—μ„œλŠ” 양식(Form), μ‹œνŠΈ(Sheet), λ³΄λ“œ μ±„νŒ…μ„ μ§€μ›ν•©λ‹ˆλ‹€. μž‘μ„±/읽기/λŒ“κΈ€ κΆŒν•œμ„ μ—­ν• λ³„λ‘œ μ„Έλ°€ν•˜κ²Œ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

파일: backend/src/models/Board.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
school_1 INDEX
school_1, slug_1 UNIQUE, COMPOUND

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
school ObjectId O - 학ꡐ _id
schoolId String O - 학ꡐ ID
schoolName String O - 학ꡐ 이름
name String O - κ²Œμ‹œνŒ 이름
slug String O - URL 슬러그
description String X "" κ²Œμ‹œνŒ μ„€λͺ…
creator ObjectId X - μƒμ„±μž _id
creatorId String X - μƒμ„±μž μ‚¬μš©μž ID
creatorName String X - μƒμ„±μž 이름
permissionWrite Object X {manager:true, teacher:true, student:false} κ²Œμ‹œκΈ€ μž‘μ„± κΆŒν•œ
permissionRead Object X {manager:true, teacher:true, student:true} κ²Œμ‹œκΈ€ 읽기 κΆŒν•œ
permissionComment Object X {manager:true, teacher:true, student:true} λŒ“κΈ€ μž‘μ„± κΆŒν•œ
isDefault Boolean X false κΈ°λ³Έ κ²Œμ‹œνŒ (곡지사항) μ—¬λΆ€
isActive Boolean X true ν™œμ„±ν™” μƒνƒœ
order Number X 0 μ •λ ¬ μˆœμ„œ
postCount Number X 0 κ²Œμ‹œκΈ€ 수
createdAt Date μžλ™ - 생성 μ‹œκ°
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ°

μ„œλΈŒ λ„νλ¨ΌνŠΈ: BoardPermission

ν•„λ“œ νƒ€μž… μ„€λͺ…
manager Boolean 운영자 κΆŒν•œ
teacher Boolean ꡐ사 κΆŒν•œ
student Boolean 학생 κΆŒν•œ
exceptions Array μ˜ˆμ™Έ μ‚¬μš©μž λͺ©λ‘

Post (κ²Œμ‹œκΈ€)

κ²Œμ‹œνŒμ˜ κ²Œμ‹œκΈ€μ„ κ΄€λ¦¬ν•©λ‹ˆλ‹€.

파일: backend/src/models/Post.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
board_1, createdAt_-1 COMPOUND
board_1, isPinned_-1, createdAt_-1 COMPOUND

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
board ObjectId O - κ²Œμ‹œνŒ _id
author ObjectId O - μž‘μ„±μž _id
authorId String O - μž‘μ„±μž μ‚¬μš©μž ID
authorName String O - μž‘μ„±μž 이름
authorProfile String X - μž‘μ„±μž ν”„λ‘œν•„ 사진 URL
title String O - 제λͺ©
content String O - λ‚΄μš© (Markdown)
category String X - μΉ΄ν…Œκ³ λ¦¬
isPinned Boolean X false 상단 κ³ μ • μ—¬λΆ€
isActive Boolean X true ν™œμ„±ν™” μƒνƒœ (soft delete)
viewCount Number X 0 쑰회수
targetAudience Object X - λŒ€μƒ μ§€μ • (μ•Œλ¦Ό λ°œμ†‘ λŒ€μƒ)
targetAudience.type String X "all" enum: "all", "manager", "teacher", "student", "custom"
targetAudience.users Array X - custom인 경우 μ‚¬μš©μž λͺ©λ‘
targetAudience.grade Number X - ν•™λ…„ μ§€μ •
attachments Array X [] μ²¨λΆ€νŒŒμΌ λ°°μ—΄
attachments[].url String - - 파일 URL
attachments[].fileName String - - 파일λͺ…
attachments[].fileSize Number - - 파일 크기 (bytes)
attachments[].mimeType String - - MIME νƒ€μž…
attachments[].key String - - S3 ν‚€
createdAt Date μžλ™ - 생성 μ‹œκ°
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ°

Comment (λŒ“κΈ€)

κ²Œμ‹œκΈ€μ˜ λŒ“κΈ€μ„ κ΄€λ¦¬ν•©λ‹ˆλ‹€. λŒ€λŒ“κΈ€(λ‹΅κΈ€)을 μ§€μ›ν•©λ‹ˆλ‹€.

파일: backend/src/models/Comment.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
post_1, createdAt_1 COMPOUND

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
post ObjectId O - κ²Œμ‹œκΈ€ _id
author ObjectId O - μž‘μ„±μž _id
authorId String O - μž‘μ„±μž μ‚¬μš©μž ID
authorName String O - μž‘μ„±μž 이름
authorProfile String X - μž‘μ„±μž ν”„λ‘œν•„ 사진 URL
content String O - λŒ“κΈ€ λ‚΄μš©
isActive Boolean X true ν™œμ„±ν™” μƒνƒœ (soft delete)
parentComment ObjectId X null λΆ€λͺ¨ λŒ“κΈ€ _id (λŒ€λŒ“κΈ€μΈ 경우)
createdAt Date μžλ™ - 생성 μ‹œκ°
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ°

Notification (μ•Œλ¦Ό)

λ°œμ‹  및 μˆ˜μ‹  μ•Œλ¦Όμ„ κ΄€λ¦¬ν•©λ‹ˆλ‹€.

파일: backend/src/models/Notification.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
user_1, createdAt_-1 COMPOUND

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
type String O - μ•Œλ¦Ό μœ ν˜•. enum: "sent", "received"
user ObjectId O - μ†Œμœ μž _id
userId String O - μ†Œμœ μž μ‚¬μš©μž ID
userName String O - μ†Œμœ μž 이름
λ°œμ‹  (type: "sent")
toUserList Array X - μˆ˜μ‹ μž λͺ©λ‘
toUserList[].user ObjectId O - μˆ˜μ‹ μž _id
toUserList[].userId String O - μˆ˜μ‹ μž μ‚¬μš©μž ID
toUserList[].userName String O - μˆ˜μ‹ μž 이름
μˆ˜μ‹  (type: "received")
fromUser ObjectId X - λ°œμ‹ μž _id
fromUserId String X - λ°œμ‹ μž μ‚¬μš©μž ID
fromUserName String X - λ°œμ‹ μž 이름
checked Boolean X - 확인 μ—¬λΆ€
곡톡
category String X - μΉ΄ν…Œκ³ λ¦¬
title String O - μ•Œλ¦Ό 제λͺ©
description String X - μ•Œλ¦Ό μ„€λͺ…
date Date X - μ•Œλ¦Ό μΌμ‹œ
notificationType String X "direct" μ•Œλ¦Ό μœ ν˜•. enum: "direct", "classInvitation", "classCancellation", "classApproval", "classApprovalCancel", "scheduleStart", "newPost", "reminder"
relatedEntity Object X - κ΄€λ ¨ μ—”ν‹°ν‹°
relatedEntity.type String X - enum: "enrollment", "syllabus", "calendarEvent", "post", "reminder"
relatedEntity.id ObjectId X - κ΄€λ ¨ μ—”ν‹°ν‹° _id
autoDeleteOnCheck Boolean X true 확인 μ‹œ μžλ™ μ‚­μ œ
createdAt Date μžλ™ - 생성 μ‹œκ°
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ°

NotificationSetting (μ•Œλ¦Ό μ„€μ •)

μ‚¬μš©μžλ³„ μ•Œλ¦Ό μˆ˜μ‹  섀정을 κ΄€λ¦¬ν•©λ‹ˆλ‹€.

파일: backend/src/models/NotificationSetting.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
user_1 UNIQUE

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
user ObjectId O - μ‚¬μš©μž _id
userId String O - μ‚¬μš©μž ID
userName String O - μ‚¬μš©μž 이름
settings Object X (μ•„λž˜ μ°Έμ‘°) μ•Œλ¦Ό μ„€μ •
createdAt Date μžλ™ - 생성 μ‹œκ°
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ°

Settings κΈ°λ³Έκ°’

ν•„λ“œ νƒ€μž… κΈ°λ³Έκ°’ μ„€λͺ…
classInvitation Boolean true μˆ˜μ—… μ΄ˆλŒ€ μ•Œλ¦Ό
classCancellation Boolean true μˆ˜μ—… μ΄ˆλŒ€ μ·¨μ†Œ μ•Œλ¦Ό
classApproval Boolean true μˆ˜μ—… 승인 μ•Œλ¦Ό
classApprovalCancel Boolean true μˆ˜μ—… 승인 μ·¨μ†Œ μ•Œλ¦Ό
scheduleStart Boolean true 일정 μ‹œμž‘ μ•Œλ¦Ό
newPost Boolean true μƒˆ κ²Œμ‹œκΈ€ μ•Œλ¦Ό
directMessage Boolean true 직접 λ©”μ‹œμ§€ μ•Œλ¦Ό
soundEnabled Boolean true μ•Œλ¦ΌμŒ ν™œμ„±ν™”
reminder Boolean true λ¦¬λ§ˆμΈλ” μ•Œλ¦Ό
eventReminderDefault Number 15 κΈ°λ³Έ 이벀트 λ¦¬λ§ˆμΈλ” (λΆ„)

CalendarEvent (μΊ˜λ¦°λ” 일정)

μΊ˜λ¦°λ” 일정을 κ΄€λ¦¬ν•©λ‹ˆλ‹€. μˆ˜λ™ 생성 일정 외에 μˆ˜κ°•/κ°•μ˜κ³„νšμ„œ/λ©”λͺ¨λ‘œλΆ€ν„° μžλ™ λ™κΈ°ν™”λœ 일정도 ν¬ν•¨λ©λ‹ˆλ‹€.

파일: backend/src/models/CalendarEvent.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
school_1, scope_1 COMPOUND
user_1, scope_1 COMPOUND
user_1, sourceType_1, sourceId_1 COMPOUND
user_1, recurrence.type_1, start_1, end_1 COMPOUND
school_1, recurrence.type_1, start_1, end_1 COMPOUND

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
title String O - 일정 제λͺ©
description String X "" 일정 μ„€λͺ…
start Date O - μ‹œμž‘ μΌμ‹œ
end Date O - μ’…λ£Œ μΌμ‹œ
isAllDay Boolean X false 쒅일 일정 μ—¬λΆ€
scope String O - λ²”μœ„. enum: "school", "personal"
school ObjectId X - 학ꡐ _id (scopeκ°€ school인 경우)
user ObjectId O - μƒμ„±μž _id
recurrence Object X {type:"none"} 반볡 μ„€μ •
recurrence.type String X "none" enum: "none", "daily", "weekly", "monthly"
recurrence.endDate Date X - 반볡 μ’…λ£ŒμΌ
recurrence.days Number[] X - 반볡 μš”μΌ (0=일, 1=μ›”, ..., 6=ν† )
color String X "#4285f4" 일정 색상
reminder Object X {enabled:false, useDefault:true} λ¦¬λ§ˆμΈλ” μ„€μ •
reminder.enabled Boolean X false λ¦¬λ§ˆμΈλ” ν™œμ„±ν™”
reminder.minutesBefore Number X - λͺ‡ λΆ„ μ „ μ•Œλ¦Ό
reminder.useDefault Boolean X true κΈ°λ³Έ μ„€μ • μ‚¬μš©
scheduleStart Object X {enabled:false} 일정 μ‹œμž‘ μ•Œλ¦Ό (옡트인)
scheduleStart.enabled Boolean X false 일정 μ‹œμž‘ μ•Œλ¦Ό ν™œμ„±ν™”
notifySchool Boolean X false 학ꡐ 전체 μ•Œλ¦Ό (scope=school일 λ•Œλ§Œ 유효)
sourceType String X "manual" 좜처 μœ ν˜•. enum: "manual", "enrollment", "syllabus", "memo"
sourceId String X - 좜처 ID
syllabusId ObjectId X - μ—°κ²°λœ κ°•μ˜κ³„νšμ„œ _id
calendarId ObjectId X - μ†Œμ† μ‚¬μš©μž μΊ˜λ¦°λ” _id
createdAt Date μžλ™ - 생성 μ‹œκ°
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ°

UserCalendar (μ‚¬μš©μž μΊ˜λ¦°λ”)

μ‚¬μš©μž μΊ˜λ¦°λ” 그룹을 κ΄€λ¦¬ν•©λ‹ˆλ‹€. 일정을 μΊ˜λ¦°λ”λ³„λ‘œ λΆ„λ₯˜ν•˜κ³  색상을 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

파일: backend/src/models/UserCalendar.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
user_1 INDEX
user_1, school_1 COMPOUND

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
user ObjectId O - μ†Œμœ μž _id
school ObjectId X - 학ꡐ _id (scopeκ°€ school인 경우)
name String O - μΊ˜λ¦°λ” 이름
color String X "#4285f4" μΊ˜λ¦°λ” 색상
scope String X "personal" enum: "school", "personal"
isDefault Boolean X false κΈ°λ³Έ μΊ˜λ¦°λ” μ—¬λΆ€ (μ‚­μ œ λΆˆκ°€)
createdAt Date μžλ™ - 생성 μ‹œκ°
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ°

ChatRoom (μ±„νŒ…λ°©)

1:1 μ±„νŒ…(direct) 및 κ·Έλ£Ή μ±„νŒ…(group)을 κ΄€λ¦¬ν•©λ‹ˆλ‹€.

파일: backend/src/models/ChatRoom.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
participants.user_1 INDEX

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
type String O - λ°© μœ ν˜•. enum: "direct", "group"
name String X - λ°© 이름 (κ·Έλ£Ή μ±„νŒ…μš©)
creator ObjectId X - μƒμ„±μž _id
creatorId String X - μƒμ„±μž μ‚¬μš©μž ID
creatorName String X - μƒμ„±μž 이름
participants Array X - μ°Έκ°€μž λͺ©λ‘
participants[].user ObjectId O - μ°Έκ°€μž _id
participants[].userId String O - μ°Έκ°€μž μ‚¬μš©μž ID
participants[].userName String O - μ°Έκ°€μž 이름
participants[].profile String X - ν”„λ‘œν•„ 이미지 URL
participants[].joinedAt Date X Date.now μ°Έκ°€ μ‹œκ°
participants[].lastReadAt Date X - λ§ˆμ§€λ§‰ 읽은 μ‹œκ°
lastMessage Object X - λ§ˆμ§€λ§‰ λ©”μ‹œμ§€ 미리보기
lastMessage.content String X - λ©”μ‹œμ§€ λ‚΄μš© (μš”μ•½)
lastMessage.sender ObjectId X - λ°œμ‹ μž _id
lastMessage.senderName String X - λ°œμ‹ μž 이름
lastMessage.sentAt Date X - λ°œμ‹  μ‹œκ°
isActive Boolean X true ν™œμ„±ν™” μƒνƒœ
settings Object X - λ°© μ„€μ •
settings.allowInvites Boolean X true μ΄ˆλŒ€ ν—ˆμš© μ—¬λΆ€
settings.allowChat Boolean X true μ±„νŒ… ν—ˆμš© μ—¬λΆ€
createdAt Date μžλ™ - 생성 μ‹œκ°
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ°

ChatMessage (μ±„νŒ… λ©”μ‹œμ§€)

μ±„νŒ…λ°©μ˜ κ°œλ³„ λ©”μ‹œμ§€λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€.

파일: backend/src/models/ChatMessage.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
room_1 INDEX
room_1, createdAt_-1 COMPOUND

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
room ObjectId O - μ±„νŒ…λ°© _id
sender ObjectId O - λ°œμ‹ μž _id
senderId String O - λ°œμ‹ μž μ‚¬μš©μž ID
senderName String O - λ°œμ‹ μž 이름
content String O - λ©”μ‹œμ§€ λ‚΄μš©
messageType String X "text" λ©”μ‹œμ§€ μœ ν˜•. enum: "text", "image", "file", "system"
attachment Object X - 첨뢀 파일 (image/file λ©”μ‹œμ§€μΈ 경우)
attachment.url String X - 파일 URL
attachment.fileName String X - 파일λͺ…
attachment.fileSize Number X - 파일 크기 (bytes)
attachment.mimeType String X - MIME νƒ€μž…
attachment.key String X - S3 ν‚€
readBy Array X - 읽은 μ‚¬μš©μž λͺ©λ‘
readBy[].user ObjectId X - μ‚¬μš©μž _id
readBy[].readAt Date X - 읽은 μ‹œκ°
isDeleted Boolean X false μ‚­μ œ μ—¬λΆ€ (soft delete)
createdAt Date μžλ™ - 생성 μ‹œκ°
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ°

ChatFile (μ±„νŒ… 파일)

μ±„νŒ…μ—μ„œ 곡유된 νŒŒμΌμ„ μ‚¬μš©μžλ³„λ‘œ κ΄€λ¦¬ν•©λ‹ˆλ‹€.

파일: backend/src/models/ChatFile.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
user_1, createdAt_-1 COMPOUND
user_1, fileType_1, createdAt_-1 COMPOUND

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
user ObjectId O - μ†Œμœ μž _id
userId String O - μ†Œμœ μž μ‚¬μš©μž ID
room ObjectId O - μ±„νŒ…λ°© _id
message ObjectId X - μ±„νŒ… λ©”μ‹œμ§€ _id
fileName String O - 원본 파일λͺ…
fileSize Number O - 파일 크기 (bytes)
mimeType String O - MIME νƒ€μž…
key String O - S3 ν‚€
url String O - 파일 URL
fileType String O - 파일 μœ ν˜•. enum: "image", "file"
isDeleted Boolean X false μ‚­μ œ μ—¬λΆ€ (soft delete)
createdAt Date μžλ™ - 생성 μ‹œκ°
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ°

Reminder (λ¦¬λ§ˆμΈλ”)

μ‚¬μš©μž λ¦¬λ§ˆμΈλ”λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€.

파일: backend/src/models/Reminder.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
user_1, completed_1, reminderTime_1 COMPOUND

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
user ObjectId O - μ‚¬μš©μž _id
userId String O - μ‚¬μš©μž ID
userName String O - μ‚¬μš©μž 이름
title String O - λ¦¬λ§ˆμΈλ” 제λͺ©
memo String X "" λ©”λͺ¨
reminderTime Date O - μ•Œλ¦Ό μ‹œκ°
completed Boolean X false μ™„λ£Œ μ—¬λΆ€
notified Boolean X false μ•Œλ¦Ό λ°œμ†‘ μ—¬λΆ€
createdAt Date μžλ™ - 생성 μ‹œκ°
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ°

ThemeSetting (ν…Œλ§ˆ μ„€μ •)

μ‚¬μš©μžλ³„ ν…Œλ§ˆ 섀정을 κ΄€λ¦¬ν•©λ‹ˆλ‹€.

파일: backend/src/models/ThemeSetting.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
user_1 UNIQUE

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
user ObjectId O - μ‚¬μš©μž _id
userId String O - μ‚¬μš©μž ID
userName String O - μ‚¬μš©μž 이름
selectedTheme String X "light" μ„ νƒλœ ν…Œλ§ˆ. κ°€λŠ₯ν•œ κ°’: "light", "dark", "high-contrast", "sepia", "system", "custom"
colors Object X (μ•„λž˜ μ°Έμ‘°) μ‚¬μš©μž μ •μ˜ 색상
createdAt Date μžλ™ - 생성 μ‹œκ°
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ°

Colors κΈ°λ³Έκ°’

ν•„λ“œ κΈ°λ³Έκ°’ μ„€λͺ…
primaryColor "#313775" μ£Ό λΈŒλžœλ“œ 색상
backgroundColor "#ffffff" νŽ˜μ΄μ§€ 배경색
componentColor "#f5f5f5" μ»΄ν¬λ„ŒνŠΈ 배경색
textColor "#000000" κΈ°λ³Έ ν…μŠ€νŠΈ 색상
accentColor "#007aff" κ°•μ‘°/ν•˜μ΄λΌμ΄νŠΈ 색상
successColor "#52c41a" 성곡 μƒνƒœ 색상
errorColor "#ff4d4f" 였λ₯˜ μƒνƒœ 색상

Apps (μ•±)

μ‹œμŠ€ν…œμ— λ“±λ‘λœ μ•± λͺ©λ‘μ„ κ΄€λ¦¬ν•©λ‹ˆλ‹€.

파일: backend/src/models/Apps.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
title_1 UNIQUE

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
title String X - μ•± 제λͺ© (고유)
description String X - μ•± μ„€λͺ…
createdAt Date μžλ™ - 생성 μ‹œκ°
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ°

TimeBlock (μ‹œκ°„ 블둝)

μˆ˜μ—… μ‹œκ°„ν‘œμ˜ κ°œλ³„ μ‹œκ°„ λΈ”λ‘μž…λ‹ˆλ‹€. Syllabus, Enrollment λ“±μ—μ„œ μ„œλΈŒ λ„νλ¨ΌνŠΈλ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.

파일: backend/src/models/TimeBlock.js

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ μ„€λͺ…
label String O μ‹œκ°„ 라벨 (예: "μ›”8", "수3")
day String X μš”μΌ (예: "μ›”", "ν™”", "수", "λͺ©", "금", "ν† ", "일")
start String X μ‹œμž‘ μ‹œκ°„ (예: "10:00")
end String X μ’…λ£Œ μ‹œκ°„ (예: "11:00")

μ°Έκ³ : _idκ°€ μ—†λŠ” μ„œλΈŒ λ„νλ¨ΌνŠΈμž…λ‹ˆλ‹€ ({ _id: false }).


AltForm (양식 λΉŒλ”)

Alt Board의 양식 λΉŒλ”λ‘œ, 데이터 μˆ˜μ§‘μš© Form을 κ΄€λ¦¬ν•©λ‹ˆλ‹€. Form 생성 μ‹œ μ—°κ²°λœ AltSheetκ°€ μžλ™ μƒμ„±λ©λ‹ˆλ‹€.

파일: backend/src/models/AltForm.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
board_1 INDEX
board_1, createdAt_-1 COMPOUND

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
board ObjectId O - λ³΄λ“œ _id
school ObjectId X - 학ꡐ _id
creator ObjectId X - μƒμ„±μž _id
creatorId String X - μƒμ„±μž μ‚¬μš©μž ID
creatorName String X - μƒμ„±μž 이름
title String O - 양식 제λͺ©
description String X "" 양식 μ„€λͺ…
fields Array X [] ν•„λ“œ μ •μ˜ λ°°μ—΄
fields[].label String O - ν•„λ“œλͺ…
fields[].type String O - ν•„λ“œ νƒ€μž… (text, textarea, number, date, file, select, multiSelect, checkbox, radio, userSelect, approval, rating, scale, counter)
fields[].permission String X "respondent" respondent λ˜λŠ” owner
fields[].visibleToRespondent Boolean X false owner ν•„λ“œλ₯Ό μ‘λ‹΅μžμ—κ²Œ 곡개
fields[].required Boolean X false ν•„μˆ˜ μž…λ ₯ μ—¬λΆ€
fields[].options [String] X [] 선택지 (select/radio/checkbox용)
fields[].validation Mixed X - νƒ€μž…λ³„ μœ νš¨μ„± 검사 κ·œμΉ™
fields[].order Number X - ν‘œμ‹œ μˆœμ„œ
settings Object X - Form μ„€μ •
settings.openAt Date X - 곡개 μ‹œμž‘ μ‹œκ°
settings.closeAt Date X - 곡개 μ’…λ£Œ μ‹œκ°
settings.allowResubmit Boolean X false 재제좜 ν—ˆμš©
settings.allowMultipleResponses Boolean X false 볡수 응닡 ν—ˆμš©
settings.requiredMode Boolean X false ν•„μˆ˜ 응닡(미제좜 ν•  일)
settings.requiredResponseCount Number X - ν•„μˆ˜+볡수일 λ•Œ λͺ©ν‘œ 제좜 횟수
settings.weekdaySchedule Object X - μš”μΌλ§ˆλ‹€ 회차 μ°½ (enabled, daysOfWeek 0=일…6=ν† , startTime/endTime HH:mm, Asia/Seoul). μ „μ œ: requiredMode + allowMultipleResponses + openAt + closeAt
settings.quizMode Boolean X false ν€΄μ¦ˆ λͺ¨λ“œ
settings.shareResponses Boolean X false 응닡 곡유
sheet ObjectId X - μ—°κ²°λœ AltSheet _id
isActive Boolean X true ν™œμ„±ν™” μƒνƒœ
createdAt Date μžλ™ - 생성 μ‹œκ°
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ°

AltSheet (μ‹œνŠΈ)

AltForm에 1:1둜 μ—°κ²°λ˜λŠ” 데이터 μ‹œνŠΈμž…λ‹ˆλ‹€. Form 생성 μ‹œ μžλ™ μƒμ„±λ©λ‹ˆλ‹€.

파일: backend/src/models/AltSheet.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
form_1 UNIQUE
board_1 INDEX

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
form ObjectId O - AltForm _id (1:1)
board ObjectId X - λ³΄λ“œ _id
school ObjectId X - 학ꡐ _id
name String X - μ‹œνŠΈ 이름 (= Form 제λͺ©)
isActive Boolean X true ν™œμ„±ν™” μƒνƒœ
createdAt Date μžλ™ - 생성 μ‹œκ°
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ°

AltSheetRow (μ‹œνŠΈ ν–‰)

AltSheet의 κ°œλ³„ ν–‰ λ°μ΄ν„°μž…λ‹ˆλ‹€. Form 응닡 제좜 μ‹œ λ˜λŠ” ꡐ사 직접 μž…λ ₯으둜 μƒμ„±λ©λ‹ˆλ‹€.

파일: backend/src/models/AltSheetRow.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
sheet_1, _respondent_1 COMPOUND
sheet_1, createdAt_-1 COMPOUND
form_1 INDEX
form_1, createdAt_1 COMPOUND

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
sheet ObjectId O - AltSheet _id
form ObjectId X - AltForm _id
board ObjectId X - λ³΄λ“œ _id
_respondent ObjectId X - μ‘λ‹΅μž _id
_respondentId String X - μ‘λ‹΅μž μ‚¬μš©μž ID
_respondentName String X - μ‘λ‹΅μž 이름
data Map<String, Mixed> X - ν•„λ“œ _id β†’ κ°’ λ§€ν•‘
_submittedAt Date X - 응닡 μ‹œκ°
_updatedAt Date X - μˆ˜μ • μ‹œκ°
isActive Boolean X true ν™œμ„±ν™” μƒνƒœ
createdAt Date μžλ™ - 생성 μ‹œκ°
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ°

AltSheetOpen (μ‹œνŠΈ μ—΄λžŒ)

κ΄€λ¦¬μž/μž‘μ„±μžκ°€ 양식 기둝(μ‹œνŠΈ)을 λ§ˆμ§€λ§‰μœΌλ‘œ μ—° μ‹œκ°μ„ μ‚¬μš©μžΒ·μ–‘μ‹ λ‹¨μœ„λ‘œ μ €μž₯ν•©λ‹ˆλ‹€. λͺ©λ‘ API의 unreadResponseCountλŠ” 이 μ‹œκ° 이후 μƒμ„±λœ 응닡 ν–‰ μˆ˜μž…λ‹ˆλ‹€. 기둝이 μ—†μœΌλ©΄ unreadλŠ” 0μž…λ‹ˆλ‹€.

파일: backend/src/models/AltSheetOpen.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
user_1, form_1 UNIQUE
user_1, board_1 COMPOUND
user_1 / form_1 / board_1 INDEX

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
user ObjectId O - μ—΄λžŒμž User _id
form ObjectId O - AltForm _id
board ObjectId O - Board _id
lastOpenedAt Date O Date.now λ§ˆμ§€λ§‰ 기둝 μ—΄λžŒ μ‹œκ°

λͺ©λ‘ 메타 (RAltForms, admin/writer): responseCount, unreadResponseCount (μ—΄λžŒ κΈ°μ€€ 이후 μ‹ κ·œ 응닡 수).


AIChatSession (AI μ±„νŒ… μ„Έμ…˜)

AI μ±„νŒ…(Alter)의 μ„Έμ…˜ 정보λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€. λ³΄λ“œλ‹Ή 학생 1인 1μ„Έμ…˜ κ΅¬μ‘°μž…λ‹ˆλ‹€.

파일: backend/src/models/AIChatSession.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
board_1, student_1 UNIQUE, COMPOUND
board_1, lastMessageAt_-1 COMPOUND

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
board ObjectId O - λ³΄λ“œ _id
student ObjectId O - 학생 _id
studentId String O - 학생 μ‚¬μš©μž ID
studentName String O - 학생 이름
isActive Boolean X true μ„Έμ…˜ ν™œμ„± μ—¬λΆ€
lastMessageAt Date X - λ§ˆμ§€λ§‰ λ©”μ‹œμ§€ μ‹œκ°
lastMessagePreview String X - λ§ˆμ§€λ§‰ λ©”μ‹œμ§€ 미리보기
messageCount Number X 0 λ©”μ‹œμ§€ 수
createdAt Date μžλ™ - 생성 μ‹œκ°
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ°

AIChatMessage (AI μ±„νŒ… λ©”μ‹œμ§€)

AI μ±„νŒ… μ„Έμ…˜μ˜ κ°œλ³„ λ©”μ‹œμ§€μž…λ‹ˆλ‹€. 학생, AI, ꡐ사 3κ°€μ§€ λ°œμ‹ μž μœ ν˜•μ„ μ§€μ›ν•©λ‹ˆλ‹€.

파일: backend/src/models/AIChatMessage.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
session_1, createdAt_-1 COMPOUND

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
session ObjectId O - AIChatSession _id
board ObjectId O - λ³΄λ“œ _id
senderType String O - λ°œμ‹ μž μœ ν˜•. enum: "student", "ai", "teacher"
sender ObjectId X null λ°œμ‹ μž _id (AI인 경우 null)
senderId String X null λ°œμ‹ μž μ‚¬μš©μž ID
senderName String O - λ°œμ‹ μž 이름
content String O - λ©”μ‹œμ§€ λ‚΄μš©
tokenUsage Object X - 토큰 μ‚¬μš©λŸ‰ (AI 응닡 μ‹œ)
tokenUsage.promptTokens Number X - ν”„λ‘¬ν”„νŠΈ 토큰 수
tokenUsage.candidatesTokens Number X - 응닡 토큰 수
tokenUsage.totalTokens Number X - 총 토큰 수
isDeleted Boolean X false μ†Œν”„νŠΈ μ‚­μ œ μ—¬λΆ€
createdAt Date μžλ™ - 생성 μ‹œκ°
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ°

μ°Έκ³ : tokenUsageλŠ” _idκ°€ μ—†λŠ” μ„œλΈŒ λ„νλ¨ΌνŠΈμž…λ‹ˆλ‹€ ({ _id: false }).


AIUsageLog (AI μ‚¬μš©λŸ‰ 둜그)

AI κΈ°λŠ₯ μ‚¬μš©λŸ‰μ„ μΆ”μ ν•˜λŠ” λ‘œκ·Έμž…λ‹ˆλ‹€. μš”μ²­λ³„ 토큰 μ‚¬μš©λŸ‰μ„ κΈ°λ‘ν•©λ‹ˆλ‹€.

파일: backend/src/models/AIUsageLog.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
createdAt_1 INDEX

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
user ObjectId O - μ‚¬μš©μž _id
userId String O - μ‚¬μš©μž ID
userName String O - μ‚¬μš©μž 이름
provider String X "unknown" AI 제곡자 (openai / anthropic / gemini)
model String O - AI λͺ¨λΈλͺ…
feature String X "unknown" κΈ°λŠ₯ (syllabus / chat λ“±)
success Boolean X true 호좜 성곡 μ—¬λΆ€
errorCode String X - μ‹€νŒ¨ μ‹œ μ—λŸ¬ μ½”λ“œ
promptTokens Number X 0 ν”„λ‘¬ν”„νŠΈ 토큰 수
candidatesTokens Number X 0 응닡 토큰 수
thoughtsTokens Number X 0 사고 토큰 수
totalTokens Number X 0 총 토큰 수
createdAt Date μžλ™ - 생성 μ‹œκ°
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ°

BoardFavorite (λ³΄λ“œ 즐겨찾기)

μ‚¬μš©μžμ˜ λ³΄λ“œ 즐겨찾기 μ •λ³΄μž…λ‹ˆλ‹€. μ‚¬μš©μžλ‹Ή λ³΄λ“œ 1개의 즐겨찾기λ₯Ό 보μž₯ν•©λ‹ˆλ‹€.

파일: backend/src/models/BoardFavorite.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
user_1, school_1 COMPOUND
user_1, board_1 UNIQUE, COMPOUND

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
user ObjectId O - μ‚¬μš©μž _id
board ObjectId O - λ³΄λ“œ _id
school ObjectId O - 학ꡐ _id
order Number X 0 μ •λ ¬ μˆœμ„œ
createdAt Date μžλ™ - 생성 μ‹œκ°
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ°

SurveyResponse (μ„€λ¬Έ 응닡)

κ²Œμ‹œκΈ€μ— μ²¨λΆ€λœ μ„€λ¬Έμ˜ κ°œλ³„ μ‘λ‹΅μž…λ‹ˆλ‹€. μ„€λ¬Έλ‹Ή μ‘λ‹΅μž 1인 1응닡을 보μž₯ν•©λ‹ˆλ‹€.

파일: backend/src/models/SurveyResponse.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
post_1 INDEX
post_1, surveyId_1, respondent_1 UNIQUE, COMPOUND
post_1, surveyId_1, createdAt_-1 COMPOUND

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
post ObjectId O - κ²Œμ‹œκΈ€ _id
surveyId ObjectId O - μ„€λ¬Έ _id
respondent ObjectId O - μ‘λ‹΅μž _id
respondentId String O - μ‘λ‹΅μž μ‚¬μš©μž ID
respondentName String O - μ‘λ‹΅μž 이름
answers Array O - λ‹΅λ³€ λ°°μ—΄
answers[].questionId String O - 질문 ID
answers[].value Mixed X - λ‹΅λ³€ κ°’
answers[].files Array X [] 첨뢀 파일 λͺ©λ‘
answers[].files[].fileName String X - 파일 이름
answers[].files[].fileSize Number X - 파일 크기 (bytes)
answers[].files[].mimeType String X - MIME νƒ€μž…
answers[].files[].key String X - S3 ν‚€
createdAt Date μžλ™ - 생성 μ‹œκ°
updatedAt Date μžλ™ - μˆ˜μ • μ‹œκ°

μ°Έκ³ : answers[] 및 answers[].files[]λŠ” _idκ°€ μ—†λŠ” μ„œλΈŒ λ„νλ¨ΌνŠΈμž…λ‹ˆλ‹€ ({ _id: false }).


RequestStat (μš”μ²­ 톡계)

일별 API μš”μ²­ 톡계λ₯Ό μ§‘κ³„ν•˜λŠ” λͺ¨λΈμž…λ‹ˆλ‹€. λ‚ μ§œλ³„ 1개의 λ¬Έμ„œλ‘œ κ΄€λ¦¬λ©λ‹ˆλ‹€.

파일: backend/src/models/RequestStat.js DB: 아카데미 λ°μ΄ν„°λ² μ΄μŠ€

인덱슀

인덱슀 속성
_id UNIQUE
date_1 UNIQUE

ν•„λ“œ

ν•„λ“œ νƒ€μž… ν•„μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
_id ObjectId μžλ™ - MongoDB κΈ°λ³Έ ν‚€
date String O - λ‚ μ§œ μ‹λ³„μž (YYYY-MM-DD)
requests Number X 0 총 μš”μ²­ 수
totalResponseTime Number X 0 응닡 μ‹œκ°„ 합계 (ms)
dataIn Number X 0 μˆ˜μ‹  λ°μ΄ν„°λŸ‰ (bytes)
dataOut Number X 0 솑신 λ°μ΄ν„°λŸ‰ (bytes)
uniqueUsers [String] X [] 고유 μ‚¬μš©μž ID λͺ©λ‘

λͺ¨λΈ 관계도

Academy (루트 DB)
  |
  +-- [아카데미 DB]
        |
        +-- User
        |     |
        |     +-- schools[] --> School
        |
        +-- School
        |     |
        |     +-- formArchive[]
        |     +-- deletedFormArchive[]
        |     +-- links[]
        |
        +-- Season
        |     |
        |     +-- school --> School
        |     +-- subjects, classrooms, formEvaluation
        |     +-- permissionSyllabusV2, permissionEnrollmentV2, permissionEvaluationV2
        |     +-- aiSettings
        |
        +-- Registration
        |     |
        |     +-- season --> Season
        |     +-- user --> User
        |     +-- teacher --> User (λ‹΄λ‹Ή ꡐ사)
        |
        +-- Syllabus
        |     |
        |     +-- season --> Season
        |     +-- user --> User (κ°œμ„€μž)
        |     +-- teachers[] --> User
        |     +-- time[] (TimeBlock)
        |
        +-- Enrollment
        |     |
        |     +-- syllabus --> Syllabus
        |     +-- student --> User
        |     +-- evaluation (μ•”ν˜Έν™”)
        |
        +-- Archive
        |     |
        |     +-- user --> User
        |     +-- school --> School
        |     +-- data (μ•”ν˜Έν™”)
        |
        +-- Board --> Post --> Comment
        |     |
        |     +-- AltForm --> AltSheet --> AltSheetRow
        |     |                 +-- AltSheetOpen (user별 μ—΄λžŒ)
        |     +-- BoardFavorite
        |     +-- SurveyResponse (via Post)
        |
        +-- AIChatSession --> AIChatMessage
        +-- AIUsageLog
        |
        +-- Notification, NotificationSetting
        |
        +-- CalendarEvent, UserCalendar
        |
        +-- ChatRoom --> ChatMessage, ChatFile
        |
        +-- Reminder, ThemeSetting, Form, Apps
        |
        +-- RequestStat