Tenant 스키마
개요
V18(RLS baseline) 이후 모든 테넌트 스코프 테이블은 public 스키마에 존재하며, tenant_id BIGINT NOT NULL 컬럼과 Postgres RLS 정책으로 행 단위 격리를 강제합니다. Schema-per-tenant(tenant_{slug} 스키마)는 완전히 제거되었습니다.
V26에서 admins → staff, admin_permissions → staff_permissions으로 리네임되었습니다.
도메인별 ERD
사용자 + 권한
수업 + 수강 + 강의
과제
시험 + OMR 채점
출결 + 상담
AI
| 테이블 | 설명 |
|---|---|
ai_conversations | AI 대화 세션 (user_id, title, is_active) |
ai_chat_messages | 대화 메시지 (role, content, tool_calls JSONB, pending_action JSONB) |
ai_scheduled_tasks | 예약된 AI 작업 (cron 기반, frequency, tool_name, tool_arguments JSONB) |
모두 tenant_id + RLS 적용.
콘텐츠 + 홈페이지
| 테이블 | 설명 |
|---|---|
announcements | 공지사항 (author_id FK → users) |
qna_boards | Q&A 게시글 (qna_user_id FK → users) |
qna_comments | Q&A 댓글 (qna_id, student_id, user_id) |
counseling_schedules | 상담 가능 시간 슬롯 |
reviews | 학원 리뷰 (reviewer_name, title, content) |
toggles | 기능 토글 (is_review_popup_on, singleton per tenant) |
homepage_config | 홈페이지 템플릿 구성 (template_id, sections JSONB, published) |
파일 + 교재
| 테이블 | 설명 |
|---|---|
file_metadata | 파일 메타데이터 (UUID PK, entity_type, object_key, folder_id) |
textbook_folders | 교재 폴더 계층 (UUID PK, parent_id, depth 1~5) |
textbooks | 교재 정보 (name, author, publisher, isbn, subject, grade_level) |
SMS
| 테이블 | 설명 |
|---|---|
sms_templates | SMS 템플릿 (name, content, category) |
sms_messages | 발송된 SMS 메시지 (sender_id FK → staff, recipients JSONB) |
활동 로그
| 테이블 | 설명 |
|---|---|
activity_logs | 감사 로그 (actor_id, actor_role, action, entity_type, entity_id) |
report_generation_jobs | 성적 리포트 생성 배치 잡 (exam_id, status, zip_file_key) |
AI 분석
| 테이블 | 설명 |
|---|---|
exam_ai_analyses | 시험 AI 분석 결과 (V44) |
student_ai_feedbacks | 학생별 AI 피드백 (V45) |
전체 테이블 목록
| 도메인 | 테이블 |
|---|---|
| 사용자 | users, students, staff, permissions, staff_permissions |
| 수업 | classes, class_enrollments, lectures |
| 과제 | assignments, assignment_submissions |
| 시험 | exams, exam_templates, exam_results, question_results, omr_grading_jobs, report_generation_jobs, exam_ai_analyses, student_ai_feedbacks |
| 출결 | attendance_sessions, attendance_records |
| 상담 | counseling_schedules, counseling_reservations |
| AI | ai_conversations, ai_chat_messages, ai_scheduled_tasks |
| 콘텐츠 | announcements, qna_boards, qna_comments, reviews, toggles |
| 홈페이지 | homepage_config |
| 파일 | file_metadata, textbook_folders, textbooks |
| SMS | sms_templates, sms_messages |
| 감사 | activity_logs |
| 수납 (테넌트) | guardians, student_guardians, merchant_profiles, tuition_invoices, tuition_payments, cash_receipts |
수납 테이블 상세는 Billing 스키마를 참조하세요.
주요 마이그레이션 이력
| 버전 | 내용 |
|---|---|
| V18 | RLS baseline — schema-per-tenant 폐기, 모든 테넌트 테이블을 public에 통합, RLS 정책 일괄 적용 |
| V19 | activity_logs enum 컬럼 |
| V20 | qna_boards is_it_answered 리네임 |
| V21 | FK 인덱스 추가 |
| V22 | owner_directory 신설 |
| V23 | activity_logs 키셋 페이지네이션 인덱스 |
| V24 | 도메인 엔티티 version 컬럼 추가 |
| V25 | omr_grading_jobs_results 드롭 |
| V26 | admins → staff, admin_permissions → staff_permissions 리네임 |
| V29 | 수납 테이블 추가 (guardians, merchant_profiles, tuition_invoices 등) |
| V40 | omr_grading_jobs.version 추가 |
| V41 | exam_results.omr_grading_job_id 추가 |
| V43 | qna_boards.category_name 추가 |
| V44 | exam_ai_analyses 추가 |
| V45 | student_ai_feedbacks 추가 |
| V52 | attendance_sessions (class_id, session_date) UNIQUE 제약 |
| V53 | attendance_records 기본 상태 PENDING |