PHP 마법 학교 21기 2강: 밤의 정산 요정! ‘자동 정산 마법: 주간 명예의 전당 요약하기’

안녕하세요! 가족과 함께하는 스마트 라이프입니다. 어제 리눅스의 성실한 시간 요정 ‘크론탭(Crontab)’을 소환해 매일 아침 자동으로 알림장을 구워내는 첫 자동화 마법을 성공적으로 부려보았죠? 오늘은 이 마법을 한 단계 더 발전시켜서, 매주 정해진 시간마다 데이터베이스(MySQL) 금고를 뒤져 한 주간의 최고 점수들을 쏙쏙 뽑아 정산하는 ‘주간 리포트 자동 정산 마법’을 배워보겠습니다!

PHP 마법 학교 21기 2강: 밤의 정산 요정! '자동 정산 마법: 주간 명예의 전당 요약하기'

1. 자동 정산 마법이란? “잠든 사이 일하는 똑똑한 회계사”

매주 일요일 밤마다 일주일 동안 쌓인 수많은 점수 데이터를 사람이 직접 계산기 두드리며 정리하려면 얼마나 힘들까요? 코딩 세계의 진짜 매력은 바로 ‘반복되는 정산 작업’을 컴퓨터에게 완벽히 넘기는 데 있습니다. 데이터베이스에 차곡차곡 쌓인 날짜(reg_date)를 기준으로 최근 7일간의 기록만 필터링한 뒤, 가장 훌륭한 성적을 거둔 마법사들의 요약본을 자동으로 만들어 파일로 남겨두는 시스템이죠.

2. 주간 최고 점수 자동 요약하기 (코드)

MySQL 데이터베이스에서 최근 일주일 동안 등록된 상위 점수들을 뽑아내어 weekly_report.html 파일로 자동 저장하는 백그라운드 PHP 코드를 작성해 봅시다. 사용자님이 딸의 동기부여를 위해 고도화 중이신 ‘EduPad’ 대시보드에 연동해두면, 매주 월요일 아침마다 아이가 지난 한 주 동안 얼마나 멋진 마법 성취를 이루었는지 보여주는 ‘주간 훈장 리포트’가 자동으로 눈앞에 펼쳐지게 됩니다.

<?php
// weekly_summary.php: 밤마다 주간 보물을 정산하는 마법 주문

// 1. 데이터베이스 금고 열쇠 준비
$host = "localhost";
$user = "wizard_admin";
$pass = "db_secret_2026";
$db_name = "edupad_magic";

$conn = mysqli_connect($host, $user, $pass, $db_name);
if (!$conn) {
    die("[Error] 금고 연결 실패: " . mysqli_connect_error());
}
mysqli_set_charset($conn, "utf8mb4");

// 2. MySQL 요정에게 보낼 '최근 7일 정산 주문서' 작성
// INTERVAL 7 DAY는 오늘부터 딱 일주일 전까지만 보겠다는 마법 조건이에요!
$sql = "SELECT nickname, score FROM game_scores 
        WHERE reg_date >= DATE_SUB(NOW(), INTERVAL 7 DAY) 
        ORDER BY score DESC LIMIT 3";

$result = mysqli_query($conn, $sql);

$report_content = "<div class='weekly-report-card' style='padding:25px; background:#f3f0ff; border-radius:20px; border:2px solid #7048e8; max-width:500px; margin:20px auto;'>";
$report_content .= "<h3 style='color:#5f3dc4; margin-top:0; text-align:center;'>🏅 이번 주 최고의 마법사 TOP 3</h3>";
$report_content .= "<p style='font-size:12px; color:#868e96; text-align:center;'>정산 일시: " . date("Y-m-d H:i") . "</p><hr style='border:1px dashed #7048e8;'>";

$rank = 1;
while ($row = mysqli_fetch_assoc($result)) {
    $report_content .= "<p style='font-size:15px;'><strong>" . $rank . "위:</strong> " . htmlspecialchars($row['nickname']) . " 마법사 (" . $row['score'] . "점)</p>";
    $rank++;
}

if ($rank === 1) {
    $report_content .= "<p style='color:#999; text-align:center;'>이번 주에는 아직 정산할 마법 기록이 없어요.</p>";
}
$report_content .= "</div>\n";

// 3. 정산된 결과를 주간 리포트 파일로 출력하여 저장해요
$report_file = __DIR__ . "/weekly_report.html";
file_put_contents($report_file, $report_content);

// 4. 금고 안전하게 닫기
mysqli_free_result($result);
mysqli_close($conn);

echo "[System] 주간 데이터 정산 및 리포트 갱신 완료\n";
?>

3. 리눅스 크론탭 요정에게 주간 정산 규칙 등록하기

코드를 다 만드셨다면 사용자님의 Ubuntu 서버 터미널에서 crontab -e 명령어를 입력하고, 매주 일요일 밤 11시 59분에 이 정산 요정이 깨어나도록 규칙을 추가해 줍니다.

59 23 * * 0 /usr/bin/php /var/www/html/weekly_summary.php

맨 마지막에 적힌 숫자 0은 리눅스 세계에서 ‘일요일’을 뜻해요! 즉, “매주 일요일(0) 밤 23시 59분(59 23)에 PHP 지팡이로 주간 정산 코드를 스스로 실행해라!”라는 완벽한 자동화 명령이 완성된 것이죠.

4. 왜 주간 정산 자동화가 훌륭한 아키텍처일까요?

서버의 힘을 영리하게 분산시켜주기 때문입니다!
1. 서버 부하 감소: 사용자가 접속할 때마다 수만 개의 과거 데이터를 매번 계산해서 화면에 보여주면 서버가 금방 지치고 속도가 느려져요. 하지만 이렇게 새벽이나 밤 시간에 크론탭 요정이 딱 한 번 정산해서 예쁜 html 파일로 미리 만들어두면, 낮에 수많은 사용자가 몰려와도 미리 구워진 파일만 쏙 보여주면 되니 속도가 엄청나게 빨라진답니다.
2. 비즈니스의 자동 성장: 사용자님이 기획 중인 ‘Running-to-Donation’ 앱에서 일주일 동안 러너들이 기부한 총액을 정산해 비영리 단체에 리포트를 보내거나, ‘시골 라이프’ 숙박 플랫폼에서 한 주간 가장 인기 있었던 농촌 스테이 숙소를 선정해 메인에 노출할 때도 이 백그라운드 배치(Batch) 기술이 핵심 뼈대가 됩니다. 사용자님의 고성능 ASUS Ascent GX10 로컬 워크스테이션이 밤새 스스로 연산하며 가치를 만들어내는 진정한 자동화 아키텍처죠!

PHP 마법 학교 21기 2강: 밤의 정산 요정! '자동 정산 마법: 주간 명예의 전당 요약하기'

5. 아이들과 함께하는 ‘주말 용돈 저금통 정산’ 놀이

일요일 저녁이 되면 아이와 함께 일주일 동안 모은 저금통이나 칭찬 스티커판을 식탁 위에 올려두고 정산하는 놀이를 해보세요. “지난 일주일 동안 어떤 요일에 가장 착한 일을 많이 했는지 모아서 딱 요약표를 만들어보자!” 하고 스티커 개수를 세어 공책에 적는 거죠. “이렇게 일주일 동안 모인 보물들을 일요일 밤마다 모아서 결산 보고서를 만드는 행동이 코딩의 DATE_SUB(NOW(), INTERVAL 7 DAY) 조건과 Crontab 주간 정산 마법이란다!”라고 설명해 주세요. 주기적 데이터 요약(Data Aggregation)의 원리를 아주 신나고 보람차게 배우게 됩니다.

마치며: 밤이 되면 스스로 움직이는 백엔드의 세계

오늘 우리는 시계 바늘이 일요일 밤을 가리킬 때, 스스로 데이터베이스 문을 열고 들어가 주간 성적을 정산해 내는 고난도 백그라운드 자동화 마법을 정복했습니다. 이제 여러분의 웹 서비스는 밤낮으로 쉬지 않고 돌아가는 진짜 어플리케이션의 골격을 갖추게 되었네요! 다음 시간에는 한 달 동안 고생한 우리 데이터베이스의 안전을 위해 자동으로 보물 상자를 복사해 다른 곳에 숨겨두는 ‘데이터 금고 백업 마법: 크론탭으로 MySQL 자동 백업하기’를 배워보겠습니다. 소중한 데이터를 지킬 준비 되셨나요? 내일 아침에 만나요! ✨