선생님 대시보드
선생님 대시보드는 커뮤니티의 전반적인 학습 현황을 한눈에 파악할 수 있는 통합 관리 페이지입니다.
개요
- 경로:
/c/[slug]/teacher-dashboard - 권한: Owner, Admin만 접근 가능
- 목적: 학생 활동, 과제 현황, 성적 추이를 실시간으로 모니터링
주요 기능
1. 통계 카드 (8개)
학생 관련
- 총 학생: 커뮤니티 전체 멤버 수
- 활동 중 학생: 연속 출석일(streak)이 0보다 큰 학생 수
학습 자료
- 총 과제: 생성된 과제 총 개수
- 총 퀴즈: 생성된 퀴즈 총 개수
제출 현황
- 과제 제출: 제출된 과제 수
- 과제 채점 완료: 채점이 완료된 과제 수
성적 현황
- 퀴즈 평균 점수: 전체 학생의 퀴즈 평균 점수
최근 활동 (30일 기준)
- 최근 일기 (7일): 지난 7일간 작성된 일기 수
- 출석 세션 (30일): 지난 30일간 생성된 출석 세션 수
2. 상위 학생 (점수 기준)
Top 5 학생을 점수 순으로 표시:
- 순위 표시 (#1, #2, ...)
- 프로필 사진
- 이름
- 레벨
- 총 점수
- 연속 출석일 (불꽃 아이콘)
3. 관심 필요 학생
연속 출석일이 0인 학생 목록 (최대 10명):
- 학습 동기 저하가 의심되는 학생
- 프로필 정보
- "주의" 뱃지 표시
- 개별 학생 진도 페이지로 바로 이동 가능
4. 수동 채점 대기 과제
AI 자동 채점은 되었지만 선생님의 수동 채점이 필요한 과제:
- 과제 제목
- 제출 학생 이름
- 제출 시간
- "채점하기" 버튼 → 채점 페이지로 이동
5. 빠른 액션 버튼
자주 사용하는 기능으로 바로 이동:
- 출석 관리: 출석 세션 생성/관리
- 과제 관리: 과제 목록 및 관리
- 퀴즈 관리: 퀴즈 목록 및 관리
- 커뮤니티 설정: 커뮤니티 전반 설정
API 엔드포인트
GET /api/teacher/dashboard?community=slug
Response:
{
"stats": {
"totalMembers": 25,
"totalAssignments": 10,
"totalQuizzes": 5,
"assignmentSubmissions": 150,
"assignmentsGraded": 120,
"quizAttempts": 75,
"avgQuizScore": 82,
"recentDiaries": 30,
"attendanceSessions": 8,
"attendanceMarks": 180
},
"topStudents": [
{
"id": 1,
"userId": 10,
"name": "김철수",
"avatar": "/avatars/user1.jpg",
"level": 5,
"points": 1250,
"streak": 15
}
],
"lowEngagementStudents": [
{
"id": 5,
"userId": 20,
"name": "이영희",
"avatar": "/avatars/user5.jpg",
"level": 2,
"points": 350,
"streak": 0
}
],
"pendingGrading": [
{
"submissionId": "123",
"assignmentId": "45",
"assignmentTitle": "한국어 작문 과제 1",
"studentName": "박민수",
"submittedAt": "2025-12-14T10:30:00.000Z"
}
]
}
데이터 소스
대시보드는 다음 테이블에서 데이터를 집계합니다:
통계 계산
communityMembers: 총 학생 수, 활동 중 학생assignments: 총 과제 수assignmentSubmissions: 제출/채점 현황quizzes: 총 퀴즈 수quizAttempts: 퀴즈 평균 점수diaries: 최근 일기 수 (7일)attendanceSessions,attendanceRecords: 출석 현황 (30일)
학생 목록
communityMembers+users: 상위 학생, 관심 필요 학생- 정렬 기준:
- 상위:
points DESC - 관심 필요:
streak = 0
- 상위:
채점 대기
assignmentSubmissions:gradedBy IS NULL(AI 채점만 된 상태)assignments,users조인
UI 컴포넌트
통계 카드
<Card>
<CardContent>
<Icon /> {/* 아이콘 */}
<Value /> {/* 숫자 */}
<Label /> {/* 설명 */}
</CardContent>
</Card>
학생 카드
<StudentCard>
<Rank>#1</Rank>
<Avatar />
<Name>김철수</Name>
<Level>레벨 5</Level>
<Points>1,250점</Points>
<Streak>🔥 15일</Streak>
</StudentCard>
실시간 업데이트
데이터 갱신
- 페이지 로드 시 초기 데이터 fetch
- 새로고침 시 최신 데이터 반영
- 향후 WebSocket 연동 가능 (실시간 업데이트)
자동 갱신 (Optional)
useEffect(() => {
const interval = setInterval(() => {
fetchDashboard();
}, 60000); // 1분마다 갱신
return () => clearInterval(interval);
}, []);
색상 코딩
통계 카드 색상
- 파란색: 학생 관련
- 초록색: 과제 관련
- 보라색: 퀴즈 관련
- 노란색: 일반 통계
- 빨간색: 출석 관련
학생 상태
- 초록색: 활발히 활동 중 (streak > 0)
- 노란색: 관심 필요 (streak = 0)
- 빨간색: 심각한 비활동 (향후 확장)
사용 시나리오
매일 아침 체크리스트
- 대시보드 접속
- 전체 통계 확인
- 관심 필요 학생 확인 → 개별 연락
- 채점 대기 과제 확인 → 수동 채점
- 상위 학생 확인 → 칭찬/격려
주간 분석
- 최근 7일 일기 작성 추이 확인
- 퀴즈 평균 점수 모니터링
- 출석률 분석
- 학생별 진도 추적
월간 리포트
- 전체 통계 스크린샷
- 상위 학생 시상 준비
- 비활동 학생 상담 계획
- 다음 달 목표 설정
권한 관리
Owner
- 모든 통계 접근 가능
- 모든 학생 정보 확인
- 모든 빠른 액션 사용
Admin
- Owner와 동일한 권한
- 커뮤니티 설정 제외 가능 (Owner 전용으로 제한 가능)
Student
- 대시보드 접근 불가
- 403 Forbidden → 커뮤니티 페이지로 리다이렉트
성능 최적화
쿼리 최적화
- 필요한 컬럼만 선택 (
select) - 인덱스 활용 (
communityId,role,streak) - 집계 쿼리 최소화 (SQL
count,avg활용)
데이터 캐싱
- React Query 또는 SWR 사용 가능
- 5분 캐시 TTL 권장
- 백그라운드 리페치
로딩 상태
{isLoading ? (
<Loader2 className="animate-spin" />
) : (
<DashboardContent />
)}
확장 가능성
향후 추가 기능
- 📊 그래프 및 차트 (성적 추이, 출석률 추이)
- 📅 캘린더 뷰 (중요 일정 표시)
- 📧 일괄 알림 발송
- 📈 AI 기반 인사이트
- 🎯 학습 목표 달성률
- 📱 모바일 앱 푸시 알림
- 🔔 중요 이벤트 알림 (마감 임박, 신규 제출 등)
- 📤 Excel/PDF 리포트 내보내기
트러블슈팅
통계가 0으로 표시되는 경우
- 실제로 데이터가 없는지 확인
- API 응답 확인 (개발자 도구)
- 커뮤니티 멤버십 확인
학생 목록이 비어있는 경우
- 커뮤니티에 멤버가 등록되어 있는지 확인
- 데이터베이스 연결 상태 확인
채점 대기 목록이 업데이트되지 않는 경우
- 페이지 새로고침
- 실제로 수동 채점이 필요한 과제가 있는지 확인 (AI 채점만 된 상태)