매주 토요일 로또 추첨 결과가 발표된 뒤, 동행복권의 공식 결과와 1·2등 당첨판매점 정보를 가져옵니다. 이어서 회차별 리포트 JSON 파일을 만들고, GitHub Pages에 게시 중인 사이트의 리포트 목록을 최신 글 순으로 갱신합니다.

핵심은 사람이 매주 파일을 직접 올리지 않아도 된다는 점입니다. GitHub Actions가 정해 둔 시간에 Node.js 스크립트를 실행하고, 변경된 결과 파일을 다시 GitHub 저장소에 커밋합니다. GitHub Pages는 그 변경 사항을 배포해 리포트 목록과 상세 페이지에 최신 회차를 보여줍니다.
당첨번호와 판매점 정보는 반드시 동행복권 공식 결과와 당첨판매점 조회를 기준으로 가져오는 것이 좋습니다. 결과 발표 직후에는 판매점 정보가 늦게 반영될 수 있으므로, 한 번만 실행하기보다 일정 시간 간격으로 재확인하도록 구성합니다.
1. 완성 구조 먼저 이해하기
아래처럼 역할을 나누면 유지보수가 쉽습니다.
| 파일 또는 폴더 | 역할 |
|---|---|
| scripts/update-lotto.mjs | 동행복권 공식 결과에서 최신 회차의 당첨번호와 등수별 당첨금을 가져와 data/latest.json을 갱신합니다. |
| scripts/sync-report.mjs | 최신 결과와 1·2등 당첨판매점 데이터를 조합해 회차별 기사형 리포트를 생성합니다. |
| data/reports/1241.json | 제1241회처럼 개별 글 하나에 해당하는 데이터 파일입니다. |
| data/reports/index.json | 리포트 목록에 표시할 회차를 최신순으로 정리한 목록 파일입니다. |
| reports.html | 게시글 목록 페이지입니다. |
| report.html?round=1241 | 각 회차를 하나의 독립 기사 페이지로 보여 줍니다. |
| .github/workflows/lotto-update.yml | 매주 자동 실행되는 GitHub Actions 워크플로 파일입니다. |
2. GitHub에서 자동화 파일을 만드는 메뉴 순서
예: 사용자이름/저장소이름 형태의 저장소 메인 화면입니다.
저장소 이름 아래에 보이는 Code, Issues, Actions, Settings 탭 중 Code로 이동합니다.
새 파일 이름 입력란에 아래 경로를 정확히 입력합니다.
.github/workflows/lotto-update.yml
폴더가 없어도 경로를 한 번에 입력하면 GitHub가 자동으로 만듭니다.
이미 같은 이름의 파일이 있다면 새로 만들지 말고, 파일을 열어 연필 모양의 Edit this file 버튼으로 수정합니다.
name: Update Lotto result report
on:
workflow_dispatch:
schedule:
# GitHub Actions cron은 UTC 기준입니다.
# 한국 시간 토요일 20:50, 21:10, 21:30, 21:50
- cron: '50 11 * * 6'
- cron: '10 12 * * 6'
- cron: '30 12 * * 6'
- cron: '50 12 * * 6'
# 한국 시간 일요일 00:10에 한 번 더 확인
- cron: '10 15 * * 6'
permissions:
contents: write
jobs:
update-report:
runs-on: ubuntu-latest
steps:
- name: 저장소 파일 가져오기
uses: actions/checkout@v4
- name: Node.js 설치
uses: actions/setup-node@v4
with:
node-version: 20
- name: 최신 당첨 결과 갱신
run: node scripts/update-lotto.mjs
- name: 기사형 리포트 생성
run: node scripts/sync-report.mjs
- name: 변경 파일 커밋 및 푸시
run: |
if git diff --quiet -- data/latest.json data/history.json data/reports; then
echo "새로운 변경 사항이 없습니다."
else
git config user.name "lotto-report-bot"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add data/latest.json data/history.json data/reports
git commit -m "Update Lotto result report"
git push
fi
커밋 제목은 예를 들어 Add weekly Lotto report automation으로 입력합니다. 기본 브랜치가 main이라면 Commit directly to the main branch를 선택해 저장합니다.
3. 가장 중요한 설정: Actions가 파일을 저장할 수 있게 권한 주기
자동화가 데이터를 가져오는 것까지는 성공했는데, 마지막에 git push에서 실패한다면 대개 쓰기 권한 문제입니다. 다음 순서로 확인합니다.
- 저장소 상단의 Settings 탭을 누릅니다.
- 왼쪽 메뉴에서 Actions를 펼친 뒤 General을 선택합니다.
- 페이지 아래쪽의 Workflow permissions 영역으로 이동합니다.
- Read and write permissions를 선택합니다.
- Save 버튼을 눌러 저장합니다.
워크플로 파일 안에도 permissions: contents: write를 넣어 두면, 결과 JSON을 저장소에 커밋할 권한을 명시할 수 있습니다. GitHub의 기본 권한 설정과 워크플로 권한은 함께 확인해야 합니다. GitHub 공식 권한 설정 안내도 참고하세요.
4. 처음에는 Actions 메뉴에서 직접 실행해 보기
토요일까지 기다리지 않아도 됩니다. 수동 실행 메뉴로 먼저 테스트하면 오류를 빨리 찾을 수 있습니다.
- 저장소 상단의 Actions 탭을 누릅니다.
- 왼쪽 워크플로 목록에서 Update Lotto result report를 선택합니다.
- 오른쪽 위의 Run workflow 버튼을 누릅니다.
- 브랜치가 main인지 확인합니다.
- 초록색 Run workflow 버튼을 한 번 더 눌러 실행합니다.
- 목록에 새 실행 기록이 나타나면 클릭합니다.
- update-report 작업을 누른 뒤 각 단계의 로그를 확인합니다.
정상이라면 마지막 단계에서 커밋과 푸시가 완료되고, 저장소의 data/reports 폴더에 새 회차 JSON이 생깁니다.
5. 기사형 제목과 본문을 자동으로 만드는 핵심
단순히 “제1241회 당첨 결과”라고 쓰는 대신, 당첨번호와 1등 당첨자 수를 제목에 담으면 목록에서 어떤 글인지 바로 이해할 수 있습니다. 예시는 아래와 같습니다.
const title =
`로또 ${round}회 당첨번호 ${numbers.join('·')}…1등 ${firstWinners.toLocaleString('ko-KR')}명`;
const article = {
deck: `제${round}회 로또6/45 추첨 결과를 당첨번호와 등수별 당첨금, 1·2등 판매점 정보로 정리했습니다.`,
lead: `동행복권이 발표한 제${round}회 로또6/45 당첨번호는 ${numbers.join(', ')}이며, 보너스번호는 ${bonus}입니다.`,
firstPrize: `이번 회차 1등은 ${firstWinners.toLocaleString('ko-KR')}명으로, 1인당 ${firstPrize.toLocaleString('ko-KR')}원을 받습니다.`,
stores: `공식 당첨판매점 조회 기준으로 1등 판매점은 ${firstStoreCount}곳, 2등 판매점은 ${secondStoreCount}곳입니다.`
};
이렇게 만든 title과 article 객체를 회차별 JSON에 저장하고, 상세 페이지에서 불러와 제목·문단으로 출력하면 됩니다. 이 방식은 회차가 늘어나도 디자인을 따로 복사할 필요가 없습니다.
6. cron 시간은 왜 한국 시간이 아닌 UTC로 쓰나?
GitHub Actions의 schedule은 기본적으로 UTC 기준입니다. 한국은 UTC보다 9시간 빠르므로, 토요일 밤 20시 50분은 UTC 토요일 11시 50분이 됩니다.
| 한국 시간 | UTC cron | 의미 |
|---|---|---|
| 토요일 20:50 | 50 11 * * 6 | 추첨 후 첫 결과 확인 |
| 토요일 21:10 | 10 12 * * 6 | 공식 결과 재확인 |
| 토요일 21:30 | 30 12 * * 6 | 판매점 정보 반영 확인 |
| 토요일 21:50 | 50 12 * * 6 | 한 번 더 갱신 |
| 일요일 00:10 | 10 15 * * 6 | 늦게 반영된 정보 보완 |
GitHub Actions의 예약 실행은 혼잡한 시간대에 약간 지연될 수 있습니다. 따라서 “정각 한 번만 실행”보다 여러 차례 확인하는 방식이 더 안전합니다. cron 문법과 예약 실행의 기준 시간은 GitHub Actions 공식 문서에서 확인할 수 있습니다.
7. 자주 발생하는 오류와 해결 방법
YAML 파일에 workflow_dispatch:가 있어야 합니다. 파일을 main 브랜치에 저장한 뒤 Actions 탭을 새로고침하세요.
Settings → Actions → General → Workflow permissions에서 Read and write permissions를 선택했는지 확인합니다. YAML의 permissions: contents: write도 확인하세요.
발표 직후에는 판매점 데이터가 늦게 공개될 수 있습니다. 스크립트를 실패 처리하지 말고, 판매점 상태를 pending으로 저장한 뒤 다음 예약 실행에서 다시 조회하도록 만드세요.
data/reports/index.json에 새 회차가 들어갔는지 확인하고, GitHub Pages 배포가 완료됐는지 저장소의 Actions 탭에서 확인합니다. 브라우저 캐시 때문에 이전 화면이 남을 수 있으므로 새로고침도 해봅니다.
8. 마지막 점검 체크리스트
- .github/workflows/lotto-update.yml 파일이 main 브랜치에 있는가?
- Actions 수동 실행이 정상 완료되는가?
- Settings → Actions → General에서 쓰기 권한을 허용했는가?
- data/reports/index.json이 최신 회차부터 정렬되는가?
- 개별 글 주소가 report.html?round=회차번호 형태로 열리는가?
- 판매점 정보가 미반영일 때 “확인 중”으로 안내되는가?
- 당첨번호·당첨금·판매점 데이터의 출처가 공식 동행복권인지 확인했는가?
이 구조를 한 번 만들어 두면 로또뿐 아니라 환율, 주간 통계, 쇼핑몰 재고, 블로그 데이터처럼 “정기적으로 바뀌는 정보를 정적 사이트에 자동 게시하는 작업”에도 그대로 응용할 수 있습니다.
'IT 학습 아카이브 > IT Tech' 카테고리의 다른 글
| Codex 스킬로 만드는 녹음 부스 AI 뮤직비디오: Seedance 2.5 립싱크·커버 이미지 자동 제작법 (0) | 2026.09.19 |
|---|---|
| Codex 스킬로 자동 제작하는 Seedance 2.5 립싱크 뮤직비디오: 사진·음원·가사만 넣고 영상 완성하기 (0) | 2026.09.19 |
| Codex 스킬로 만드는 Seedance 2.5 립싱크 뮤직비디오: 캐릭터 사진·음원·가사로 영상 제작하기 (0) | 2026.09.19 |
| Codex와 Higgsfield CLI·MCP를 함께 쓰는 이유와 실습: AI 영상 크레딧을 아끼는 제작법 (0) | 2026.09.19 |
| Codex 사용하던 스킬 새 컴퓨터에서도 그대로 쓰는 Codex 스킬 설치하는 방법 (0) | 2026.09.16 |