1. 다운로드 분석 통계 개요
DXCMS 관리자 패널의 [다운로드 분석 통계] 메뉴는 게시판에 첨부된 파일의 다운로드 현황을 다각도로 분석하는 전문 통계 도구입니다. 인기 파일 순위•게시판별 현황•회원별 이용량•최근 다운로드 이력의 4개 탭으로 구성되며, 포인트 기반 유료 다운로드 소모 현황도 함께 추적합니다.
📌 접근 경로: 관리자 대시보드 → 다운로드 분석 통계 (URL: /admin/downloads) 관리자(Admin) 권한이 있는 계정만 접근 가능합니다.
1.1 참조 DB 테이블
| 테이블명 |
역할 |
주요 컬럼 |
| download_log |
다운로드 이력 기록 |
id / file_id / post_id / member_id / ip / point_used / created_at |
| post_files |
파일 메타 정보 |
id / post_id / orig_name / file_ext / file_size / download_count |
| posts |
게시글 정보 |
id / board_id / member_id / title / status |
| boards |
게시판 정보 |
id / board_name / board_key / status |
| members |
회원 정보 |
id / name / login_id / point |
⚠️ download_log 테이블이 없으면 모든 다운로드 이력 관련 기능(인기 파일 순위•회원별 이용량•최근 로그)이 비활성화되고 안내 배너가 표시됩니다. post_files 테이블은 항상 존재하므로 게시판별 통계는 download_log 없이도 파일 수•총 용량은 조회 가능합니다.
1.2 화면 전체 구성
| 영역 |
설명 |
| 페이지 헤더 |
"다운로드 분석 통계" 제목. 부제: "콘텐츠 파일의 다운로드 횟수 및 포인트 소모 현황을 분석합니다." |
| download_log 없음 배너 |
hasDlLog=false일 때 황색 경고 배너 표시. "기록 테이블이 존재하지 않습니다." |
| KPI 요약 카드 4종 |
누적 다운로드 / 오늘 다운로드 / 전체 첨부파일 / 소모 포인트 합계. 탭 변경에 관계없이 항상 표시. |
| 탭 내비게이션 |
4개 탭 버튼(인기 파일 순위·게시판별 통계·회원별 이용량·최근 다운로드 로그). 선택된 탭은 흰색 배경·하늘색 텍스트. |
| 탭 본문 영역 |
선택된 탭에 따라 각 분석 테이블이 표시됩니다. |
2. KPI 요약 카드 4종
화면 상단에 항상 표시되는 4개의 핵심 지표 카드입니다. 탭을 변경해도 KPI 카드는 유지됩니다. 모든 수치는 기간 제한 없는 전체 누적 기준입니다.
| 카드 |
아이콘 색상 |
집계 방법 및 설명 |
| 누적 다운로드 |
하늘색 |
SELECT COUNT(*) FROM download_log. download_log 전체 레코드 수. 전체 기간 누적 다운로드 총 횟수. |
| 오늘 다운로드 |
초록색 |
SELECT COUNT(*) FROM download_log WHERE DATE(created_at)=CURDATE(). 오늘(서버 날짜 기준) 다운로드 횟수. |
| 전체 첨부파일 |
보라색 |
SELECT COUNT(*) FROM post_files WHERE post_id>0. 게시글에 첨부된 전체 파일 수. download_log 없이도 표시됩니다. |
| 소모 포인트 합계 |
주황색 |
SELECT COALESCE(SUM(point_used),0) FROM download_log. 전체 기간 회원들이 다운로드에 소모한 포인트 총합. |
💡 [소모 포인트 합계] KPI는 포인트 기반 유료 다운로드 기능을 사용하는 사이트에서 특히 중요합니다. 이 값이 높을수록 파일 콘텐츠에 대한 수요가 높고 포인트 생태계가 활발하다는 의미입니다. point_used=0인 무료 다운로드는 0으로 기록되어 합산에 포함되지 않습니다.
3. 인기 파일 순위 탭 (rank) — 기본 탭
download_log가 있을 때 post_files.download_count 기준으로 정렬한 인기 파일 TOP 100을 표시합니다. URL 파라미터 tab=rank 또는 tab이 없으면 이 탭이 기본으로 표시됩니다.
3.1 집계 쿼리
4개 테이블을 JOIN하여 파일•게시글•게시판•업로더 정보를 한 번에 조회합니다.
| 기준 테이블 |
post_files (f) — 파일 정보의 기준 테이블. |
| JOIN 조건 1 |
LEFT JOIN posts (p) ON f.post_id = p.id — 파일이 첨부된 게시글 정보. |
| JOIN 조건 2 |
LEFT JOIN boards (b) ON p.board_id = b.id — 게시글이 속한 게시판 정보. |
| JOIN 조건 3 |
LEFT JOIN members (m) ON p.member_id = m.id — 게시글 작성자(업로더) 정보. |
| 필터 조건 |
WHERE f.post_id > 0 AND p.status = 1. 게시글에 연결된 파일이고 활성 게시글에만 한정. |
| 정렬 |
ORDER BY f.download_count DESC. 다운로드 횟수 내림차순. |
| 최대 결과 |
LIMIT 100. 상위 100개만 표시. |
💡 download_count는 download_log 레코드가 생성될 때마다 post_files.download_count가 1씩 증가하여 집계됩니다. 실시간 카운터입니다.
3.2 테이블 컬럼 상세
| 컬럼 |
내용 및 설명 |
| 순위 |
1위=🥇, 2위=🥈, 3위=🥉 메달 이모지. 4위 이후는 "#N" 숫자(회색 이탤릭체). 메달 행은 주황색(text-amber-500)으로 강조. |
| 파일명 / 확장자 |
post_files.orig_name(원본 파일명, 굵은 글씨). 아래 줄에 file_ext를 대문자로 표시 (예: PDF 파일, ZIP 파일). 마우스 호버 시 하늘색으로 변경. |
| 게시판 |
boards.board_name. 회색 pill 배지 형태로 표시. 클릭 시 해당 게시판 목록(/{board_key}/list)이 새 탭에서 열림. |
| 첨부 게시글 |
posts.title. 클릭 시 해당 게시글 상세 보기(/{board_key}/view/{post_id})가 새 탭에서 열림. 최대 200px 너비에서 truncate. |
| 업로더 |
members.name. 게시글 작성자(파일 업로더)의 이름. 비회원이면 빈 값. |
| 크기 |
post_files.file_size를 dl_filesize()로 변환. 1MB 이상→MB, 1KB 이상→KB, 미만→B. 우측 정렬 모노스페이스. |
| 다운로드 수 |
post_files.download_count. 하늘색 배지(sky-50 배경, sky-100 테두리)로 강조. 천 단위 쉼표 모노스페이스. |
3.3 인기 파일 순위 활용
- 다운로드 수 1위 파일 → 가장 수요가 높은 콘텐츠. 비슷한 파일•연관 자료 추가로 트래픽 증대.
- 특정 확장자(PDF, ZIP 등)가 상위권 독점 → 해당 유형 콘텐츠에 대한 수요 파악.
- 인기 파일이 속한 게시판 확인 → 해당 게시판 홍보 강화 또는 유사 게시판 개설 검토.
- 다운로드 수는 높으나 포인트 소모 0인 파일 → 무료 파일. 유료 전환 시 포인트 경제 활성화.
- 오래된 게시글의 파일이 상위권이면 → 에버그린 콘텐츠. SEO 최적화 우선 순위 대상.
4. 게시판별 통계 탭 (boards)
활성(status=1) 게시판별로 첨부 파일 수, 총 다운로드 횟수, 총 파일 용량을 집계합니다. download_log 테이블이 없어도 post_files 기반 통계는 표시됩니다.
4.1 집계 쿼리
| 기준 테이블 |
boards (b) — 활성 게시판 전체. |
| JOIN 조건 1 |
LEFT JOIN posts (p) ON p.board_id=b.id AND p.status=1 — 활성 게시글만 대상. |
| JOIN 조건 2 |
LEFT JOIN post_files (f) ON f.post_id=p.id — 해당 게시글의 첨부 파일. |
| 필터 조건 |
WHERE b.status=1. 활성(판매 중) 게시판만 대상. |
| 집계 항목 |
COUNT(DISTINCT f.id) AS file_count / COALESCE(SUM(f.download_count),0) AS total_downloads / COALESCE(SUM(f.file_size),0) AS total_size |
| 정렬 |
ORDER BY total_downloads DESC. 다운로드 합계 내림차순. |
| 제한 |
LIMIT 없음. 활성 게시판 전체. |
4.2 테이블 컬럼 상세
| 컬럼 |
내용 및 설명 |
| 게시판 |
board_name 링크(새 탭으로 게시판 목록 이동) + 우측에 "/board_key" 경로가 회색 작은 폰트로 표시. |
| 파일 수 |
COUNT(DISTINCT f.id). 해당 게시판 활성 게시글에 첨부된 파일 총 수. 천 단위 쉼표 모노스페이스. |
| 총 다운로드 |
SUM(f.download_count). 해당 게시판 전체 파일의 다운로드 횟수 합계. 초록색 배지(emerald-50 배경, emerald-100 테두리). |
| 총 용량 |
SUM(f.file_size)를 dl_filesize()로 변환. 해당 게시판 전체 첨부 파일 용량 합계. 우측 정렬 모노스페이스. |
4.3 게시판별 통계 활용
- 총 다운로드가 많은 게시판 → 파일 수요가 높은 게시판. 업로드 정책 강화 또는 전용 파일 게시판 개설 검토.
- 파일 수 대비 다운로드가 적은 게시판 → 파일이 많지만 관심이 낮음. 파일 품질•홍보 개선 필요.
- 총 용량이 큰 게시판 → 스토리지 관리 우선순위 대상. 오래된 파일 정리 또는 스토리지 확장 검토.
- 다운로드 0인 게시판 → 파일 첨부 기능 미활용. 해당 게시판에 파일 첨부 유도.
5. 회원별 이용량 탭 (members)
다운로드를 실행한 회원별로 총 다운로드 횟수와 소모한 포인트를 집계하여 다운로드 활동이 많은 TOP 100 회원을 표시합니다. download_log 테이블이 있어야 표시됩니다.
5.1 집계 쿼리
| 기준 테이블 |
members (m) — 회원 정보. |
| JOIN 조건 |
INNER JOIN download_log (dl) ON m.id=dl.member_id — 다운로드 이력이 있는 회원만 포함. (비회원 다운로드는 member_id=0이므로 제외.) |
| 집계 항목 |
COUNT(dl.id) AS dl_count / COALESCE(SUM(dl.point_used),0) AS total_point_used |
| 보조 정보 |
m.point — 현재 보유 포인트 잔액. |
| 정렬 |
ORDER BY dl_count DESC. 다운로드 횟수 내림차순. |
| 최대 결과 |
LIMIT 100. 상위 100명. |
5.2 테이블 컬럼 상세
| 컬럼 |
내용 및 설명 |
| 회원 정보 |
이름(members.name, 굵은 글씨) + 아래에 로그인 ID(members.login_id, 모노스페이스 회색 코드 텍스트). |
| 총 다운로드 수 |
dl_count. 해당 회원의 전체 다운로드 횟수. 하늘색(sky-600) 굵은 모노스페이스. |
| 포인트 소모 |
total_point_used. "-NP" 형식으로 빨간색(rose-500) 굵은 모노스페이스 표시. 유료 다운로드로 소모한 포인트 총합. 0이면 "-0P"로 표시. |
| 현재 잔액 |
members.point. 현재 보유 포인트. 초록색(emerald-600) 굵은 모노스페이스로 "NP" 형식 표시. |
5.3 회원별 이용량 활용
- 다운로드 1위 회원 → 가장 활발한 파일 소비자. 포인트 지급 이벤트•VIP 혜택 대상 검토.
- 포인트 소모가 많은 회원 → 유료 파일에 적극적으로 참여. 포인트 경제 활성화에 기여.
- 현재 잔액이 0이면서 소모가 많은 회원 → 포인트가 바닥남. 포인트 충전 유도 또는 보상 지급.
- 동일 회원의 dl_count가 비정상적으로 높으면 → 자동화 다운로드 봇 의심. IP 확인 및 제한 조치 검토.
6. 최근 다운로드 로그 탭 (recent)
가장 최근 200건의 다운로드 이벤트를 역순으로 표시합니다. 개별 다운로드의 파일 정보•게시판•다운로더•포인트 소모•IP까지 상세하게 확인할 수 있습니다.
6.1 집계 쿼리
| 기준 테이블 |
download_log (dl) — 다운로드 이벤트 로그. |
| JOIN 1 |
LEFT JOIN post_files (f) ON dl.file_id=f.id — 파일명·확장자. |
| JOIN 2 |
LEFT JOIN posts (p) ON dl.post_id=p.id — 게시글 제목. |
| JOIN 3 |
LEFT JOIN boards (b) ON p.board_id=b.id — 게시판명·키. |
| JOIN 4 |
LEFT JOIN members (m) ON dl.member_id=m.id — 회원 이름·로그인 ID. |
| 정렬 |
ORDER BY dl.id DESC. 가장 최근 다운로드부터. |
| 최대 결과 |
LIMIT 200. 최근 200건. |
6.2 테이블 컬럼 상세
| 컬럼 |
내용 및 설명 |
| 일시 |
download_log.created_at의 앞 16자(YYYY-MM-DD HH:MM). 마우스 호버 시 slate-600으로 강조. |
| 파일 정보 |
post_files.orig_name(원본 파일명, 굵은 글씨) + 아래에 file_ext 대문자(회색 아주 작은 글씨, 예: PDF 형식). |
| 게시판 |
boards.board_name 링크(새 탭으로 게시판 목록 이동). 정보 없으면 "-" 표시. |
| 다운로더 |
로그인 회원: members.name(굵은 슬레이트) + 아래에 login_id(모노스페이스 회색). 비회원: "비회원" 회색 소문자 표시. |
| 포인트 |
download_log.point_used > 0이면 빨간색 "-NP" 표시. 0이면 회색 "무료" 표시. 유료/무료 다운로드 구분. |
| IP 주소 |
download_log.ip. 다운로드 요청 IP 주소. 회색 모노스페이스. |
6.3 포인트 표시 규칙
| point_used 값 |
표시 형식 |
의미 |
| 0 |
무료 |
포인트 소모 없는 무료 다운로드. |
| 1 이상 |
-NP (빨간색) |
포인트 N개를 소모한 유료 다운로드. |
💡 [최근 다운로드 로그]는 실시간 모니터링에 특히 유용합니다. 방금 업로드한 파일이 실제로 다운로드되고 있는지, 포인트 차감이 정상적으로 이루어지고 있는지를 바로 확인할 수 있습니다.
6.4 최근 로그 활용
- 새 파일 업로드 직후 → [최근 다운로드 로그]에서 실제 다운로드 발생 여부 확인.
- 특정 IP에서 반복 다운로드 → 자동화 봇 또는 대량 수집 의심. IP 차단 검토.
- "무료" 표시 파일이 예상보다 많으면 → 포인트 다운로드 설정 누락 확인.
- 비회원 다운로드가 많으면 → 회원 가입 유도 페이지 개선 또는 회원 전용 다운로드 정책 검토.
7. 파일 크기 표시 — dl_filesize() 헬퍼 함수
post_files.file_size(바이트 단위 정수)를 사람이 읽기 쉬운 형식으로 변환하는 PHP 헬퍼 함수입니다. 파일 순위 탭과 게시판별 탭에서 사용됩니다.
| 바이트 범위 |
변환 단위 |
예시 |
| 1,048,576 이상 |
MB |
5,242,880 bytes → 5.0MB |
| 1,024 이상 |
KB |
51,200 bytes → 50.0KB |
| 1,024 미만 |
B |
500 bytes → 500B |
변환 공식: MB = round(bytes/1048576, 1) / KB = round(bytes/1024, 1) / B = bytes 그대로.
8. 4개 탭 종합 비교표
4개 탭의 특성을 한눈에 비교하여 상황에 맞는 탭을 빠르게 선택하세요.
| 탭 |
URL 파라미터 |
필요 테이블 |
최대 결과 |
주요 분석 목적 |
| 🏆 인기 파일 순위 |
tab=rank |
post_files + download_log |
TOP 100 |
어떤 파일이 가장 많이 받히는가? 콘텐츠 인기도 분석. |
| 📊 게시판별 통계 |
tab=boards |
boards + posts + post_files |
전체 게시판 |
어느 게시판이 파일 활동이 활발한가? 게시판 성과 비교. |
| 👥 회원별 이용량 |
tab=members |
members + download_log |
TOP 100 |
누가 파일을 많이 받는가? 헤비 유저 파악 및 포인트 경제 분석. |
| ⏱ 최근 다운로드 |
tab=recent |
download_log + 4테이블 JOIN |
최근 200건 |
지금 무슨 파일이 받히고 있는가? 실시간 모니터링. |
9. 전체 사용 절차
9.1 기본 조회
- 관리자 대시보드 → [다운로드 분석 통계] 메뉴 클릭
- 상단 KPI 카드에서 누적 다운로드•오늘 다운로드•전체 파일 수•소모 포인트 합계 확인
- 탭 클릭으로 원하는 분석 뷰 선택 (인기 파일 순위 → 게시판별 → 회원별 → 최근 로그)
- 각 탭 테이블에서 링크 클릭 시 해당 게시판•게시글로 새 탭 이동 가능
9.2 콘텐츠 전략 수립 프로세스
- [인기 파일 순위] 탭 → TOP 10 파일의 확장자•게시판•업로더 파악
- 인기 파일이 속한 게시판 확인 → [게시판별 통계] 탭에서 해당 게시판 다운로드 합계 비교
- [회원별 이용량] 탭 → 다운로드 TOP 10 회원 파악 → 포인트 보상 지급 대상 선정
- [최근 다운로드 로그] 탭 → 신규 업로드 파일 다운로드 시작 여부 실시간 확인
- 데이터 기반으로 인기 카테고리•파일 유형•업로더 패턴 파악 후 콘텐츠 운영 전략 수립
9.3 포인트 다운로드 현황 점검
- [KPI 카드] 소모 포인트 합계 확인 (전체 기간 누적)
- [최근 다운로드 로그] 탭 → 포인트 컬럼에서 "-NP" vs "무료" 비율 육안 확인
- [회원별 이용량] 탭 → 포인트 소모 상위 회원의 현재 잔액 확인 → 잔액 0 회원에게 보상 검토
10. 자주 묻는 질문 (FAQ)
Q1. 다운로드 통계 탭에 "다운로드 데이터가 없습니다"가 표시됩니다.
A. download_log 테이블이 없거나 비어있는 상태입니다. 테이블이 없으면 황색 경고 배너가 상단에 표시됩니다. 마이그레이션을 통해 download_log 테이블을 생성하고, 이후 다운로드가 발생하면 자동으로 로그가 쌓입니다.
Q2. 게시판별 통계에서 총 다운로드가 0인 게시판이 있습니다.
A. 해당 게시판의 활성 게시글에 첨부 파일이 없거나, 파일은 있지만 아직 다운로드가 발생하지 않은 경우입니다. post_files.download_count가 0이면 합산 결과도 0입니다.
Q3. 회원별 이용량에 비회원이 표시되지 않습니다.
A. 회원별 이용량 탭은 INNER JOIN members ON m.id=dl.member_id를 사용하므로 member_id=0인 비회원 다운로드는 포함되지 않습니다. 비회원의 다운로드는 [최근 다운로드 로그] 탭에서 "비회원"으로 표시됩니다.
Q4. 인기 파일 순위에 파일이 나타나지 않습니다.
A. 다음을 확인하세요: ① download_log 테이블 존재 여부. ② post_files에 post_id>0인 파일이 있는지. ③ 해당 파일이 첨부된 게시글의 status가 1(활성)인지. 비활성 게시글(status≠1)의 파일은 순위에서 제외됩니다.
Q5. 파일 크기가 "0B"로 표시됩니다.
A. post_files.file_size 컬럼이 0 또는 NULL로 저장된 파일입니다. 파일 업로드 시 file_size가 정상적으로 기록되지 않은 경우입니다. 해당 파일을 다시 업로드하거나 DB를 직접 수정하여 file_size를 채워야 합니다.
Q6. 같은 파일을 여러 번 다운로드해도 횟수가 올라가지 않습니다.
A. download_count는 download_log 레코드가 INSERT될 때 증가합니다. 다운로드 처리 코드에서 download_log INSERT와 download_count 업데이트 로직이 정상적으로 실행되는지 확인하세요.
Q7. 최근 200건 이전 이력을 확인하려면?
A. 현재 [최근 다운로드 로그] 탭은 LIMIT 200으로 최근 200건만 표시합니다. 더 오래된 이력은 DB에서 직접 SELECT * FROM download_log ORDER BY id DESC LIMIT N OFFSET M 쿼리로 조회하거나, 개발자가 페이지네이션 기능을 추가해야 합니다.
11. 용어 정리
| 용어 |
설명 |
| download_log |
다운로드 이벤트 기록 테이블. id/file_id/post_id/member_id/ip/point_used/created_at 컬럼. |
| post_files |
게시글 첨부 파일 메타 테이블. id/post_id/orig_name/file_ext/file_size/download_count 컬럼. |
| hasDlLog |
download_log 테이블 존재 여부 PHP 변수. false면 이력 기반 기능 비활성화. |
| file_id |
download_log.file_id. 다운로드된 파일의 post_files.id 참조 외래키. |
| post_id |
download_log.post_id. 다운로드된 파일이 첨부된 게시글 ID. |
| member_id |
download_log.member_id. 다운로드한 회원 ID. 비회원은 0. |
| point_used |
download_log.point_used. 해당 다운로드에 소모된 포인트. 무료면 0. |
| download_count |
post_files.download_count. 해당 파일의 누적 다운로드 횟수 카운터. |
| orig_name |
post_files.orig_name. 업로드 시 원본 파일명. |
| file_ext |
post_files.file_ext. 파일 확장자(소문자, 예: pdf, zip). 화면에서 대문자로 표시. |
| file_size |
post_files.file_size. 파일 크기(바이트 단위 정수). dl_filesize()로 KB/MB 변환. |
| dl_filesize() |
바이트를 KB/MB로 변환하는 PHP 헬퍼 함수. 1MB=1048576B, 1KB=1024B 기준. |
| dl_count |
회원별 이용량 탭의 집계 컬럼. COUNT(download_log.id) WHERE member_id=회원ID. |
| total_point_used |
회원별 이용량 탭의 집계 컬럼. COALESCE(SUM(point_used),0). |
| total_downloads |
게시판별 통계 탭의 집계 컬럼. COALESCE(SUM(post_files.download_count),0). |
| total_size |
게시판별 통계 탭의 집계 컬럼. COALESCE(SUM(post_files.file_size),0). |
| file_count |
게시판별 통계 탭의 집계 컬럼. COUNT(DISTINCT post_files.id). |
| p.status=1 |
활성 게시글 필터. 비공개/삭제된 게시글의 파일은 순위에서 제외. |
| b.status=1 |
활성 게시판 필터. 비활성 게시판은 게시판별 통계에서 제외. |
| COALESCE(SUM(...),0) |
SUM 결과가 NULL이면 0으로 대체. 데이터 없는 게시판도 정상 표시. |