목표: "내 코드를 GitHub에 올린다 → 웹사이트로 공개한다 → 매일 자동으로 작동하게 한다"까지 스스로 한다
---
---
GitHub는 "코드와 파일을 위한 구글 드라이브 + SNS + 자동화 서버" 입니다.
비유로 풀어보면:
| Git | GitHub |
|---|---|
| 파일 변경 이력 관리 프로그램 | Git 저장소를 호스팅하는 웹 서비스 |
| 내 PC에서 작동 | 클라우드에서 작동 |
| 무료 오픈소스 | Microsoft 소유 |
비유: Git = MS Word, GitHub = OneDrive. Word(Git)로 문서를 편집하고, OneDrive(GitHub)에 저장해서 공유하는 구조입니다.
---
우상단 "Sign up" 클릭
이메일, 비밀번호, 사용자명 입력
github.com/사용자명 URL이 됨, 이력서·명함에 적게 됨이메일 인증
무료 계정 자동 부여 (별도 결제 없음)
가입 후 우상단 프로필 → Settings:
학부생 기준으로는 거의 무제한입니다.
학생용 추가 혜택: https://education.github.com 에서 학교 이메일(@khu.ac.kr 등)로 인증하면 GitHub Pro 무료, GitHub Copilot 무료, 다양한 개발자 도구 무료 제공.
---
저장소(Repository, 줄여서 repo) 는 하나의 프로젝트가 들어가는 폴더입니다. 이력서 사이트, 데이터 분석 코드, 강의 자료 — 각각 별도 저장소로 만드는 게 일반적입니다.
우상단 + 버튼 → New repository
입력:
Repository name: 영문, 숫자, 하이픈만 사용 (예: my-portfolio, news-crawler)
Description: 한 줄 설명 (선택)
Public vs Private 선택
Add a README file 체크 권장 (저장소 첫 화면에 보일 설명서)
.gitignore 선택: 프로젝트 언어 선택 (Python이면 Python, JS면 Node)
License: 공개 저장소면 MIT 정도 선택. 비공개는 무시 가능.
Create repository 클릭
생성되면 https://github.com/사용자명/저장소명 주소가 만들어집니다.
| 메뉴 | 역할 |
|---|---|
| Code | 현재 저장소의 파일 목록 |
| Issues | 할 일, 버그, 토론 게시판 |
| Pull requests | 협업자가 제안한 변경 사항 검토 |
| Actions | 자동화 작업 (뒤에서 자세히) |
| Settings | 저장소 설정 (Pages, 협업자, Secrets 등) |
---
이게 가장 자주 쓰는 작업입니다. 두 가지 방법이 있는데, 초보자는 1번부터, 익숙해지면 2번으로 가세요.
5분 만에 끝납니다. 처음에는 이 방법으로 충분합니다.
VSCode 터미널이나 명령 프롬프트에서:
# 1. 작업 폴더로 이동
cd /Users/이름/Documents/my-portfolio
# 2. Git 초기화 (한 번만)
git init
# 3. 원격 저장소 연결 (한 번만)
git remote add origin https://github.com/사용자명/my-portfolio.git
# 4. 파일 추가
git add .
# 5. 커밋 (변경 사항 기록)
git commit -m "이력서 페이지 추가"
# 6. GitHub에 업로드
git push -u origin main
처음에는 git push 시 GitHub 로그인 인증을 요구합니다. Personal Access Token(PAT) 발급이 필요한데, 너무 복잡하면 다음 절의 GitHub Desktop을 쓰세요.
명령어가 부담스러운 학생을 위한 GUI 도구.
이게 가장 균형 잡힌 방법입니다. 강의에서는 Desktop을 권장합니다.
---
저장소 페이지 → 녹색 Code 버튼 → Download ZIP
내려받은 ZIP을 풀면 파일 전체가 있습니다. 하지만 이렇게 받은 폴더는 GitHub와 연결돼 있지 않습니다. 수정해도 자동으로 안 올라가요. 자료를 한 번 받기만 할 때 사용.
# 원하는 폴더로 이동 후
git clone https://github.com/사용자명/저장소명.git
또는 GitHub Desktop에서 File → Clone repository.
Clone하면:
집 PC에서 작업 → push → 학교 PC에서 pull → 이어서 작업 → push → 다시 집 PC에서 pull...
# 학교 PC에서 (처음 한 번)
git clone https://github.com/사용자명/저장소명.git
# 이후 매번 작업 시작 시
git pull # 최신 버전 받기
# 작업 후
git add .
git commit -m "오늘 작업 내용"
git push # GitHub에 올리기
규칙 하나: 작업 전 반드시 pull, 작업 후 반드시 push. 안 그러면 충돌(conflict)이 생깁니다.
---
저장소 첫 화면에 표시되는 설명서입니다. 마크다운 문법으로 작성.
# 프로젝트 이름
한 줄 설명: 이 프로젝트가 무엇인가.
## 기능
- 기능 1
- 기능 2
## 사용법
1. 이렇게 설치한다
2. 이렇게 실행한다
## 라이선스
MIT
채용 담당자나 다른 학생이 처음 보는 화면입니다. 공들여 작성할 가치가 있습니다.
# Python
__pycache__/
*.pyc
.venv/
# Node
node_modules/
# 환경변수와 비밀
.env
*.key
# OS
.DS_Store
Thumbs.db
# 큰 데이터 파일
data/raw/
*.csv
이런 내용을 .gitignore 파일에 적으면, Git이 그 파일들을 무시합니다. API 키, 비밀번호, 대용량 데이터, 임시 파일을 올리지 않게 막아주는 안전장치입니다.
나쁜 예: update, fix, asdf, 1
좋은 예: 홈페이지 메뉴 색상 수정, 데이터 크롤러 timeout 오류 해결, 2026 봄 강의계획서 추가
미래의 나(또는 협업자)가 한 달 후 "이 커밋이 뭐였지?" 했을 때 알아볼 수 있게 적습니다.
| 종류 | 공개 | 비공개 |
|---|---|---|
| 이력서, 포트폴리오 사이트 | ✅ | |
| 강의 자료 (학생 공유용) | ✅ | |
| 공개 데이터 분석 코드 | ✅ | |
| 진행 중 연구 (미발표) | ✅ | |
| API 키 포함된 코드 | ✅ (그래도 환경변수 분리 권장) | |
| 학생 개인정보 데이터 | ✅ |
---
저장소에 HTML/CSS/JS 파일을 올리면 자동으로 웹사이트로 공개해주는 기능. 무료. 도메인은 사용자명.github.io/저장소명.
hello-site)저장소에서 Add file → Create new file:
파일명: index.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>내 첫 GitHub Pages</title>
<style>
body {
font-family: 'Noto Sans KR', sans-serif;
max-width: 700px;
margin: 50px auto;
padding: 20px;
line-height: 1.6;
}
h1 { color: #2c3e50; }
</style>
</head>
<body>
<h1>안녕하세요, 이종혁입니다</h1>
<p>경희대학교 미디어학과 교수입니다. 컴퓨테이셔널 저널리즘을 연구합니다.</p>
<h2>관심 분야</h2>
<ul>
<li>AI와 저널리즘</li>
<li>뉴스 품질 평가</li>
<li>생성 에이전트 시뮬레이션</li>
</ul>
</body>
</html>
Commit new file 클릭.
저장소 Settings → Pages:
main, 폴더 / (root)페이지 상단에 Your site is live at https://사용자명.github.io/hello-site/ 가 표시됩니다.
이 URL을 누구에게나 보낼 수 있습니다. 여러분의 첫 웹사이트가 무료로 공개됐습니다.
mysite.com)으로 바꾸려면 별도 설정.학부 강의 용도, 포트폴리오, 인터랙티브 기사, 시각화 페이지 등에는 완벽하게 충분합니다.
학생 과제로 자주 나옵니다.
저장소 구조:
my-viz/
├── index.html ← Plotly/D3 시각화
├── data.csv ← 데이터
├── styles.css
└── README.md
Pages 켜면 사용자명.github.io/my-viz/에서 인터랙티브 시각화 공개. 친구·교수에게 URL 하나로 공유 가능.
---
저장소에 어떤 일이 일어났을 때, 또는 정해진 시각에, 자동으로 코드를 실행해주는 기능. GitHub의 가장 강력한 기능 중 하나.
가능한 일들:
.github/workflows/ 폴더를 만든다.yml 파일을 만든다 (워크플로 정의)[트리거 발생]
├─ push: 누가 코드를 올렸을 때
├─ schedule: 정해진 시각이 됐을 때
├─ workflow_dispatch: 수동 버튼으로 실행
└─ issues: 이슈가 생겼을 때 등
↓
[GitHub의 가상 서버 (Runner) 켜짐]
↓
[.yml에 적힌 단계들 순서대로 실행]
↓
[결과 저장 / 배포 / 통지]
↓
[서버 종료]
저장소에서 Add file → Create new file:
파일명: .github/workflows/hello.yml
name: Hello World
on:
push: # 코드를 푸시할 때마다
branches: [main]
jobs:
greet:
runs-on: ubuntu-latest # 우분투 서버에서 실행
steps:
- name: 인사하기
run: echo "안녕하세요, GitHub Actions입니다!"
- name: 현재 시각
run: date
- name: 파일 목록
run: ls -la
커밋 후, Actions 탭에 가면 워크플로 실행 결과를 볼 수 있습니다. 녹색 체크면 성공.
| 저장소 유형 | 무료 Actions 시간 |
|---|---|
| Public 저장소 | 무제한 |
| Private 저장소 | 월 2,000분 (약 33시간) |
학부 강의용 공개 프로젝트는 사실상 무제한입니다.
---
본문 강의에서 다룬 Vite 프로젝트를 GitHub Pages에 자동 배포해봅시다.
.github/workflows/deploy.yml:
name: Vite 자동 배포
on:
push:
branches: [main]
workflow_dispatch: # 수동 실행 버튼도 추가
permissions:
contents: read
pages: write
id-token: write
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: 코드 받기
uses: actions/checkout@v4
- name: Node.js 설치
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: 패키지 설치
run: npm ci
- name: 빌드
run: npm run build
- name: Pages 설정 준비
uses: actions/configure-pages@v4
- name: 빌드 결과 업로드
uses: actions/upload-pages-artifact@v3
with:
path: './dist'
- name: Pages에 배포
uses: actions/deploy-pages@v4
저장소 이름이 my-app이라면:
export default defineConfig({
plugins: [react()],
base: '/my-app/' // ← 저장소 이름과 일치시킴
})
저장소 Settings → Pages:
Deploy from a branch 가 아닌 GitHub Actions 선택이제 코드를 push할 때마다:
npm run build)dist/)을 Pages로 배포개발자는 코드만 푸시하면 끝. 배포는 GitHub가 다 해줍니다.
---
이게 GitHub Actions의 진짜 매력입니다. 서버 한 대 없이도 정기 작업이 가능합니다.
매일 새벽 3시 (한국 시간), 네이버 IT 뉴스 헤드라인 50건을 수집해서 CSV로 저장하고, 변경된 CSV를 자동으로 저장소에 커밋. 결과는 Pages에서 그래프로 볼 수 있게.
crawler.py:
import requests
from bs4 import BeautifulSoup
import csv
from datetime import datetime
import os
def crawl_naver_it_news():
url = "https://news.naver.com/section/105"
headers = {
'User-Agent': 'Mozilla/5.0 (educational research, Kyung Hee Univ Media)'
}
response = requests.get(url, headers=headers, timeout=30)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
headlines = []
for item in soup.select('.sa_text_strong')[:50]:
title = item.get_text(strip=True)
if title:
headlines.append(title)
return headlines
def save_to_csv(headlines):
os.makedirs('data', exist_ok=True)
today = datetime.now().strftime('%Y-%m-%d')
filepath = f'data/headlines_{today}.csv'
with open(filepath, 'w', encoding='utf-8-sig', newline='') as f:
writer = csv.writer(f)
writer.writerow(['순위', '제목', '수집시각'])
now = datetime.now().isoformat()
for i, title in enumerate(headlines, 1):
writer.writerow([i, title, now])
print(f'✅ {len(headlines)}건 저장: {filepath}')
if __name__ == '__main__':
headlines = crawl_naver_it_news()
save_to_csv(headlines)
requirements.txt:
requests==2.32.3
beautifulsoup4==4.12.3
.github/workflows/daily-crawl.yml:
name: 매일 뉴스 자동 수집
on:
schedule:
# cron 표현식: UTC 기준 매일 18:00 = 한국 시각 새벽 3:00
- cron: '0 18 * * *'
workflow_dispatch: # 수동 실행도 가능
permissions:
contents: write # 데이터 자동 커밋을 위해 쓰기 권한 필요
jobs:
crawl:
runs-on: ubuntu-latest
steps:
- name: 저장소 코드 받기
uses: actions/checkout@v4
- name: Python 설치
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: 패키지 설치
run: pip install -r requirements.txt
- name: 크롤러 실행
run: python crawler.py
- name: 데이터 자동 커밋
run: |
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add data/
git diff --staged --quiet || git commit -m "📊 $(date +'%Y-%m-%d') 자동 수집"
git push
* * * * *
│ │ │ │ │
│ │ │ │ └── 요일 (0-6, 일=0)
│ │ │ └──── 월 (1-12)
│ │ └────── 일 (1-31)
│ └──────── 시간 (0-23, UTC 기준)
└────────── 분 (0-59)
중요 함정: GitHub Actions의 cron은 UTC 기준입니다. 한국은 UTC+9이므로 한국 시각 새벽 3시는 UTC 18시입니다.
| Cron | 의미 | 한국 시각 |
|---|---|---|
0 18 * * * |
UTC 매일 18:00 | 매일 새벽 3:00 |
0 0 * * * |
UTC 매일 00:00 | 매일 오전 9:00 |
0 23 * * 0 |
UTC 일요일 23:00 | 월요일 오전 8:00 |
0 */6 * * * |
UTC 6시간마다 | 6시간마다 |
30 14 1 * * |
UTC 매월 1일 14:30 | 매월 1일 23:30 |
복잡한 표현식은 https://crontab.guru 에서 검증. UTC로 입력하고 결과 시각도 UTC로 표시됨에 유의.
GitHub Actions cron은 정시에 안 돌 수 있습니다. 공식적으로:
진짜 정확한 정기 실행이 필요하면, 결정적 작업에 의존하지 말고:
며칠 후 저장소를 보면:
data/
├── headlines_2026-05-12.csv
├── headlines_2026-05-13.csv
├── headlines_2026-05-14.csv
└── ...
자동으로 쌓입니다. 서버 하나 안 빌리고, 한 번 설정해두면 끝. 학생 강의용 데이터 저널리즘 실습으로 매우 강력합니다.
---
크롤링이나 API 호출에 비밀 키가 필요할 때.
저장소 Settings → Secrets and variables → Actions → New repository secret:
GEMINI_API_KEY저장 후엔 본인도 다시 볼 수 없습니다 (수정/삭제만 가능). 암호화돼서 저장됨.
- name: API 호출 스크립트 실행
env:
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
run: python summarize_news.py
스크립트 안에서는:
import os
api_key = os.environ['GEMINI_API_KEY']
중요: Secrets는 워크플로 로그에 출력해도 자동으로 마스킹됩니다. 코드에 직접 적지 않는 한 안전합니다.
---
저장소 Actions 탭 → 실패한 워크플로 클릭 → 빨간 X 표시된 단계 클릭 → 상세 로그 확인.
가장 흔한 오류:
Permission denied (publickey) → 권한 설정 (permissions: 블록 확인)Module not found → pip install 또는 npm install 단계 빠짐Cron not running on time → GitHub 부하 또는 60일 비활성 (수동 한 번 돌려서 활성화)Timed out → timeout-minutes 설정 추가워크플로 yml과 같은 명령을 본인 PC에서 먼저 실행해 보기. 거기서 안 되면 워크플로에서도 안 됩니다.
on:
workflow_dispatch:
이 한 줄 추가하면 Actions 탭에서 Run workflow 버튼이 생깁니다. 매번 push하지 않고도 테스트 가능. 개발 단계에서 필수.
---
여기까지는 혼자 작업하는 흐름이었습니다. 둘 이상이 함께 작업하면 추가 개념이 필요해요.
Branch = 평행 우주의 코드. 메인 코드(main)는 그대로 두고, 별도 가지에서 새 기능을 실험.
# 새 가지 만들고 이동
git checkout -b new-feature
# 작업 후
git add .
git commit -m "새 기능 추가"
git push origin new-feature
PR = "내 가지에서 작업한 거 main에 합쳐주세요" 라는 요청.
한 줄 정리: 혼자 작업할 땐 main에 바로, 협업할 땐 별도 branch + PR.
---
GUI(GitHub Desktop)로 시작. 1~2달 익숙해진 후 명령어로 넘어가도 충분합니다. 명령어가 진입 장벽이 되어 GitHub를 포기하는 경우가 많아요.
즉시 그 비밀번호를 재발급(rotate) 하세요. 한 번 GitHub에 올라간 정보는 히스토리에서 완벽히 삭제하기 매우 어렵습니다. 옛 비밀번호를 무효화하는 게 빠른 해결.
없습니다. 무료 계정에서 비공개 저장소 무제한. 단, 협업자 수가 무료에선 제한됩니다 (Pro 등급 필요할 수 있음).
"Soft limit"이 있습니다. 권장 한도는 저장소 1GB, 월 트래픽 100GB, 일 빌드 10회. 학부 강의용으론 절대 초과 안 합니다.
GitHub 계정은 개인 소유. 학교를 떠나도 그대로 유지됩니다. 학생 인증 혜택만 만료됩니다.
저장소의 라이선스(LICENSE) 파일 확인. MIT, Apache 2.0, BSD면 보통 자유롭게 사용 가능 (출처 표시 권장). GPL은 사용 시 본인 코드도 공개해야 함. 라이선스 없으면 무단 사용 위험.
가능성:
---
pull, 작업 후 push.github/workflows/에 yml 파일0 18 * * *workflow_dispatch 한 줄 추가---
---