리더보드 및 게임화
학생들의 포인트, 레벨, 랭킹 시스템을 설명합니다.
목차
게임화 시스템 소개
목적
게임화 시스템은 다음과 같은 목적을 가지고 있습니다:
- 학습 동기 부여
- 꾸준한 학습 습관 형성
- 학생들 간 선의의 경쟁
- 학습 성취감 제공
주요 요소
- 포인트 (Points): 활동별로 획득
- 레벨 (Level): 누적 포인트로 상승
- 랭킹 (Ranking): 커뮤니티 내 순위
- 스트릭 (Streak): 연속 출석 일수
- 칭호 (Title): 레벨별 칭호
포인트 시스템
포인트 획득 방법
학생들은 다양한 활동을 통해 포인트를 획득할 수 있습니다:
| 활동 | 포인트 | 비고 |
|---|---|---|
| 게시글 작성 | +10P | 타입 무관 |
| 댓글 작성 | +5P | 답글 포함 |
| 과제 제출 | +20P | 점수 무관 |
| 퀴즈 완료 | +점수P | 획득 점수만큼 |
| 일기 작성 | +10P | 하루 1회 |
| 체크인 | +5P | 하루 1회 |
| 게시글 좋아요 받기 | +2P | 받은 좋아요당 |
보너스 포인트
특별한 성취에 대한 보너스:
- 연속 7일 체크인: +50P
- 월 30일 일기 작성: +100P
- 퀴즈 100점: +20P 추가
- 과제 만점: +10P 추가
포인트 확인
현재 포인트는:
- 사이드바 상단에 표시
- 프로필 카드에 표시
- 리더보드에서 확인
포인트 사용
현재는 포인트 소비 시스템 없음:
- 레벨 상승에만 사용
- 향후 뱃지, 아이템 구매 기능 추가 예정
레벨 시스템
레벨 구조
누적 포인트에 따라 자동으로 레벨이 상승합니다:
| 레벨 | 필요 포인트 | 칭호 | 설명 |
|---|---|---|---|
| Level 1 | 0 - 99P | 입문자 | 한국어 학습 시작 |
| Level 2 | 100 - 299P | 초급자 | 기본기를 다지는 중 |
| Level 3 | 300 - 599P | 중급자 | 실력이 향상되고 있음 |
| Level 4 | 600 - 999P | 고급자 | 상당한 실력 보유 |
| Level 5 | 1000P+ | 마스터 | 한국어 마스터! |
레벨 업 알림
레벨이 상승하면:
- 축하 알림 표시
- 사이드바에 새 칭호 표시
- 리더보드 랭킹 업데이트
다음 레벨까지
사이드바에 표시:
Level 2 (초급자)
200/300P
100 points needed
레벨별 혜택
각 레벨별로 다음과 같은 혜택:
- Level 1: 기본 기능 사용
- Level 2: 프로필 커스터마이징
- Level 3: 뱃지 획득 가능
- Level 4: 특별 칭호 선택
- Level 5: 골드 배지, VIP 기능
리더보드
페이지 접근
/c/{community-slug}/leaderboard 페이지에서 랭킹을 확인할 수 있습니다.
랭킹 표시
리더보드에는 다음 정보가 표시됩니다:
-
순위
- 1위, 2위, 3위는 메달 표시
- 4위부터는 숫자로 표시
-
학생 정보
- 프로필 사진
- 이름
- 칭호 (레벨별)
-
포인트
- 현재 총 포인트
- 포인트 증가량 (주간)
-
레벨
- 현재 레벨
- 레벨 진행도
기간별 랭킹
다음 기간별로 랭킹 확인 가능:
- 전체 기간: 누적 포인트
- 이번 달: 이번 달 획득 포인트
- 이번 주: 이번 주 획득 포인트
내 순위
리더보드 상단에 내 정보가 고정 표시:
Your Ranking: #5
Points: 350P
Level: 3 (중급자)
순위 변동
- 실시간 업데이트
- 포인트 획득 시 즉시 반영
- 다른 학생들과 경쟁
출석 스트릭
스트릭이란?
연속으로 체크인한 일수를 의미합니다.
스트릭 확인
- 사이드바 하단에 표시
- 불 아이콘과 함께
- "7 day streak" 형식
스트릭 유지
스트릭을 유지하려면:
- 매일 체크인 페이지 방문
- "체크인" 버튼 클릭
- 하루라도 빠지면 스트릭 초기화
스트릭 보상
연속 출석에 대한 보상:
- 7일: +50P
- 14일: +100P
- 30일: +200P
- 100일: +500P + 특별 뱃지
스트릭 복구
스트릭이 끊긴 경우:
- 다음 날부터 다시 시작
- 복구 아이템 사용 (향후 기능)
관련 파일
페이지
-
/app/c/[slug]/leaderboard/page.tsx(라인 1-250)- 리더보드 페이지
- 랭킹 표시
- 기간별 필터
-
/app/c/[slug]/check-in/page.tsx(라인 1-200)- 체크인 페이지
- 스트릭 관리
API 라우트
-
/app/api/leaderboard/route.ts(라인 1-150)- GET: 리더보드 데이터 조회
- 기간별 랭킹 계산
-
/app/api/check-in/route.ts(라인 1-100)- POST: 체크인 처리
- 스트릭 업데이트
- 포인트 부여
-
/app/api/points/award/route.ts(라인 1-200)- POST: 포인트 부여
- 레벨 업데이트
- 활동 로그 기록
컴포넌트
-
/components/leaderboard-table.tsx(라인 1-200)- 리더보드 테이블 UI
- 순위 표시
-
/components/user-stats-card.tsx(라인 1-150)- 사이드바 사용자 정보
- 포인트, 레벨, 스트릭 표시
서비스
/lib/services/points-service.ts(라인 1-300)- 포인트 부여 로직
- 레벨 계산
- 활동 추적
주요 기능
실시간 업데이트
포인트 및 랭킹:
- 실시간으로 업데이트
- 새로고침 없이 반영
- WebSocket 또는 폴링 사용
활동 히스토리
모든 포인트 활동 기록:
- 언제, 어떤 활동으로 포인트 획득
- 포인트 증감 내역
- 레벨 업 히스토리
배지 시스템
특별한 성취에 대한 배지:
- Early Bird: 아침 6시 전 체크인
- Night Owl: 밤 11시 이후 활동
- Perfectionist: 퀴즈 3회 연속 100점
- Writer: 일기 30일 연속 작성
- Helper: 댓글 100개 작성
사용 예시
1. 포인트 획득
학생: 게시글 작성
시스템: "게시글이 작성되었습니다. +10P"
사이드바: 포인트 100P → 110P
학생: 과제 제출
시스템: "과제가 제출되었습니다. +20P"
사이드바: 포인트 110P → 130P
2. 레벨 업
학생: 퀴즈 완료 (80점)
시스템: "퀴즈 완료! +80P"
포인트: 90P → 170P
시스템: "축하합니다! Level 2 달성!"
칭호: 입문자 → 초급자
알림: 레벨 업 축하 메시지
3. 리더보드 확인
학생: Leaderboard 페이지 접근
표시:
1위 🥇 김철수 - 850P (Level 4, 고급자)
2위 🥈 이영희 - 720P (Level 4, 고급자)
3위 🥉 박민수 - 680P (Level 4, 고급자)
4위 나 - 350P (Level 3, 중급자)
5위 최지원 - 320P (Level 3, 중급자)
4. 체크인
학생: Check-In 페이지 접근
학생: "체크인" 버튼 클릭
시스템: "체크인 완료! +5P"
스트릭: 6일 → 7일
시스템: "7일 연속 체크인! +50P 보너스!"
데이터베이스 스키마
user_points 테이블
{
id: string,
userId: string,
communityId: string,
totalPoints: number,
level: number,
lastCheckIn: Date | null,
checkInStreak: number,
updatedAt: Date
}
point_activities 테이블
{
id: string,
userId: string,
communityId: string,
activityType: string, // 'post', 'comment', 'quiz', etc.
points: number,
description: string,
createdAt: Date
}
achievements 테이블
{
id: string,
userId: string,
badgeType: string,
badgeName: string,
earnedAt: Date
}
포인트 부여 로직
중복 방지
하루 1회만 포인트 부여:
// 예: 체크인
if (lastCheckIn?.toDateString() === today.toDateString()) {
return { error: "이미 오늘 체크인하셨습니다." }
}
레벨 계산
누적 포인트로 레벨 자동 계산:
function calculateLevel(points: number): number {
if (points < 100) return 1
if (points < 300) return 2
if (points < 600) return 3
if (points < 1000) return 4
return 5
}
스트릭 계산
연속 출석 계산:
const daysDiff = (today - lastCheckIn) / (1000 * 60 * 60 * 24)
if (daysDiff === 1) {
// 연속 출석
streak++
} else if (daysDiff > 1) {
// 스트릭 끊김
streak = 1
}
랭킹 계산
전체 랭킹
누적 포인트로 정렬:
SELECT userId, totalPoints, level
FROM user_points
WHERE communityId = ?
ORDER BY totalPoints DESC
LIMIT 100
기간별 랭킹
특정 기간 내 획득 포인트로 정렬:
SELECT userId, SUM(points) as periodPoints
FROM point_activities
WHERE communityId = ?
AND createdAt >= ?
AND createdAt <= ?
GROUP BY userId
ORDER BY periodPoints DESC
LIMIT 100
문제 해결
포인트가 부여되지 않는 경우
- 이미 오늘 포인트를 받았는지 확인
- 활동이 정상적으로 완료되었는지 확인
- 네트워크 연결 확인
레벨이 올라가지 않는 경우
- 충분한 포인트를 획득했는지 확인
- 페이지 새로고침
- 레벨 업 조건 확인
스트릭이 끊긴 경우
- 어제 체크인했는지 확인
- 자정 기준으로 하루 계산
- 다시 시작 (복구 불가)
리더보드가 업데이트되지 않는 경우
- 페이지 새로고침
- 캐시 클리어
- 실시간 업데이트 대기 (최대 1분)
모범 사례
효과적인 포인트 획득
- 매일 체크인하기 (+5P)
- 하루에 게시글 1개 작성 (+10P)
- 댓글로 다른 학생 돕기 (+5P)
- 과제 마감일 전에 제출 (+20P)
- 퀴즈 복습하여 고득점 (최대 +100P)
- 매일 일기 작성 (+10P)
레벨 업 전략
- 꾸준히 활동 (단기간 집중보다 장기간 꾸준히)
- 다양한 활동 참여 (게시글, 댓글, 과제, 퀴즈 등)
- 스트릭 유지 (보너스 포인트)
- 퀴즈 만점 목표 (추가 포인트)
랭킹 상승 팁
- 매일 최소 활동 목표 설정 (예: 30P/일)
- 주간 목표 달성 (예: 200P/주)
- 다른 학생들과 선의의 경쟁
- 리더보드 확인 및 동기 부여
향후 기능
계획 중인 기능
-
포인트 샵
- 포인트로 아이템 구매
- 프로필 커스터마이징
- 특별 뱃지
-
그룹 챌린지
- 팀별 경쟁
- 그룹 목표 달성
- 공동 보상
-
주간/월간 미션
- 특별 미션 제공
- 미션 달성 시 보너스
- 한정 뱃지
-
스트릭 복구
- 포인트로 스트릭 복구
- 1회 복구 기회
-
개인 통계
- 활동 그래프
- 학습 시간 추적
- 성과 분석
게임화의 교육적 효과
긍정적 효과
- 동기 부여: 포인트와 레벨로 학습 의욕 증가
- 꾸준함: 스트릭 시스템으로 규칙적 학습
- 경쟁: 선의의 경쟁으로 실력 향상
- 성취감: 레벨 업과 배지로 성취감 제공
- 커뮤니티: 리더보드로 소속감 형성
주의사항
- 과도한 경쟁 지양
- 학습 자체보다 포인트에 집착하지 않기
- 건강한 경쟁 문화 조성
- 순위보다 개인 성장 중시