GitHub 입문 — 로그인부터 자동 배포·정기 실행까지

목표: "내 코드를 GitHub에 올린다 → 웹사이트로 공개한다 → 매일 자동으로 작동하게 한다"까지 스스로 한다

---

0. 이 강의에서 답하려는 질문들

  1. GitHub가 도대체 뭐고 왜 다들 쓰는가?
  2. 내 PC의 파일을 어떻게 GitHub에 올리고 받아오는가?
  3. 저장소(repository)는 어떻게 관리하고 정리하는가?
  4. GitHub Pages로 내 웹페이지를 어떻게 공짜로 공개하는가?
  5. GitHub Actions로 어떤 자동화가 가능한가?
  6. 매일 새벽 3시에 자동으로 뉴스를 수집하게 하려면?

---

1. GitHub가 뭐고 왜 쓰는가

1.1 한 문장 정의

GitHub는 "코드와 파일을 위한 구글 드라이브 + SNS + 자동화 서버" 입니다.

비유로 풀어보면:

1.2 Git vs GitHub — 헷갈리는 두 단어

Git GitHub
파일 변경 이력 관리 프로그램 Git 저장소를 호스팅하는 웹 서비스
내 PC에서 작동 클라우드에서 작동
무료 오픈소스 Microsoft 소유

비유: Git = MS Word, GitHub = OneDrive. Word(Git)로 문서를 편집하고, OneDrive(GitHub)에 저장해서 공유하는 구조입니다.

1.3 왜 미디어학과 학생도 GitHub를 배워야 하는가

---

2. 가입과 첫 설정

2.1 회원가입

  1. https://github.com 접속

  2. 우상단 "Sign up" 클릭

  3. 이메일, 비밀번호, 사용자명 입력

    • 사용자명은 신중하게 결정: 이게 곧 github.com/사용자명 URL이 됨, 이력서·명함에 적게 됨
    • 권장: 본인 영문 이름 또는 일관된 별명. 학부 학번이나 무의미한 숫자는 피할 것
  4. 이메일 인증

  5. 무료 계정 자동 부여 (별도 결제 없음)

2.2 첫 설정 (선택이지만 추천)

가입 후 우상단 프로필 → Settings:

2.3 무료 계정으로 무엇이 되나

학부생 기준으로는 거의 무제한입니다.

학생용 추가 혜택: https://education.github.com 에서 학교 이메일(@khu.ac.kr 등)로 인증하면 GitHub Pro 무료, GitHub Copilot 무료, 다양한 개발자 도구 무료 제공.

---

3. 저장소(Repository) 만들기

3.1 저장소란

저장소(Repository, 줄여서 repo) 는 하나의 프로젝트가 들어가는 폴더입니다. 이력서 사이트, 데이터 분석 코드, 강의 자료 — 각각 별도 저장소로 만드는 게 일반적입니다.

3.2 새 저장소 만들기

  1. 우상단 + 버튼 → New repository

  2. 입력:

    • Repository name: 영문, 숫자, 하이픈만 사용 (예: my-portfolio, news-crawler)

    • Description: 한 줄 설명 (선택)

    • Public vs Private 선택

      • Public: 누구나 볼 수 있음. 포트폴리오, 강의 자료에 적합.
      • Private: 본인과 초대한 사람만. 미공개 연구 데이터에 적합.
    • Add a README file 체크 권장 (저장소 첫 화면에 보일 설명서)

    • .gitignore 선택: 프로젝트 언어 선택 (Python이면 Python, JS면 Node)

    • License: 공개 저장소면 MIT 정도 선택. 비공개는 무시 가능.

  3. Create repository 클릭

생성되면 https://github.com/사용자명/저장소명 주소가 만들어집니다.

3.3 저장소 페이지의 주요 메뉴

메뉴 역할
Code 현재 저장소의 파일 목록
Issues 할 일, 버그, 토론 게시판
Pull requests 협업자가 제안한 변경 사항 검토
Actions 자동화 작업 (뒤에서 자세히)
Settings 저장소 설정 (Pages, 협업자, Secrets 등)

---

4. 로컬에서 파일 올리기

이게 가장 자주 쓰는 작업입니다. 두 가지 방법이 있는데, 초보자는 1번부터, 익숙해지면 2번으로 가세요.

4.1 방법 A — 브라우저로 드래그앤드롭 (가장 쉬움)

  1. 저장소 페이지 → Add file → Upload files
  2. 윈도우 탐색기/Finder에서 파일을 끌어다 놓기
  3. 아래 Commit changes 메시지 입력 (예: "이력서 페이지 추가")
  4. Commit changes 버튼 클릭

5분 만에 끝납니다. 처음에는 이 방법으로 충분합니다.

제한사항

4.2 방법 B — Git 명령어로 (본격적인 방법)

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을 쓰세요.

4.3 방법 C — GitHub Desktop (방법 A와 B의 중간)

명령어가 부담스러운 학생을 위한 GUI 도구.

  1. https://desktop.github.com 에서 다운로드 후 설치
  2. 본인 GitHub 계정으로 로그인
  3. File → Clone repository → 저장소 선택 → 로컬 폴더 지정
  4. 그 폴더에서 파일 추가/수정
  5. GitHub Desktop 창으로 돌아가면 변경 사항이 보임
  6. 아래 메시지 박스에 커밋 메시지 입력 → Commit to main
  7. 상단 Push origin 클릭

이게 가장 균형 잡힌 방법입니다. 강의에서는 Desktop을 권장합니다.

---

5. 파일 다운로드하기 (Clone과 Download)

5.1 방법 A — ZIP으로 다운로드 (일회성)

저장소 페이지 → 녹색 Code 버튼 → Download ZIP

내려받은 ZIP을 풀면 파일 전체가 있습니다. 하지만 이렇게 받은 폴더는 GitHub와 연결돼 있지 않습니다. 수정해도 자동으로 안 올라가요. 자료를 한 번 받기만 할 때 사용.

5.2 방법 B — Git Clone (계속 동기화하려면)

# 원하는 폴더로 이동 후
git clone https://github.com/사용자명/저장소명.git

또는 GitHub Desktop에서 File → Clone repository.

Clone하면:

5.3 다른 PC에서 작업 이어가기

집 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)이 생깁니다.

---

6. 저장소 관리 실용 팁

6.1 README.md를 잘 쓰기

저장소 첫 화면에 표시되는 설명서입니다. 마크다운 문법으로 작성.

# 프로젝트 이름

한 줄 설명: 이 프로젝트가 무엇인가.

## 기능
- 기능 1
- 기능 2

## 사용법
1. 이렇게 설치한다
2. 이렇게 실행한다

## 라이선스
MIT

채용 담당자나 다른 학생이 처음 보는 화면입니다. 공들여 작성할 가치가 있습니다.

6.2 .gitignore — 올리지 말아야 할 파일 지정

# Python
__pycache__/
*.pyc
.venv/

# Node
node_modules/

# 환경변수와 비밀
.env
*.key

# OS
.DS_Store
Thumbs.db

# 큰 데이터 파일
data/raw/
*.csv

이런 내용을 .gitignore 파일에 적으면, Git이 그 파일들을 무시합니다. API 키, 비밀번호, 대용량 데이터, 임시 파일을 올리지 않게 막아주는 안전장치입니다.

6.3 커밋 메시지 잘 쓰기

나쁜 예: update, fix, asdf, 1 좋은 예: 홈페이지 메뉴 색상 수정, 데이터 크롤러 timeout 오류 해결, 2026 봄 강의계획서 추가

미래의 나(또는 협업자)가 한 달 후 "이 커밋이 뭐였지?" 했을 때 알아볼 수 있게 적습니다.

6.4 비공개 vs 공개 결정

종류 공개 비공개
이력서, 포트폴리오 사이트 ✅
강의 자료 (학생 공유용) ✅
공개 데이터 분석 코드 ✅
진행 중 연구 (미발표) ✅
API 키 포함된 코드 ✅ (그래도 환경변수 분리 권장)
학생 개인정보 데이터 ✅

---

7. GitHub Pages — 무료 웹페이지 호스팅

7.1 Pages가 뭔가

저장소에 HTML/CSS/JS 파일을 올리면 자동으로 웹사이트로 공개해주는 기능. 무료. 도메인은 사용자명.github.io/저장소명.

7.2 5분 만에 사이트 만들기

Step 1: 저장소 만들기

Step 2: index.html 추가

저장소에서 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 클릭.

Step 3: Pages 활성화

저장소 Settings → Pages:

Step 4: 1~2분 대기 후 확인

페이지 상단에 Your site is live at https://사용자명.github.io/hello-site/ 가 표시됩니다.

이 URL을 누구에게나 보낼 수 있습니다. 여러분의 첫 웹사이트가 무료로 공개됐습니다.

7.3 Pages의 한계

학부 강의 용도, 포트폴리오, 인터랙티브 기사, 시각화 페이지 등에는 완벽하게 충분합니다.

7.4 사례: 데이터 시각화 페이지

학생 과제로 자주 나옵니다.

저장소 구조:
my-viz/
├── index.html        ← Plotly/D3 시각화
├── data.csv          ← 데이터
├── styles.css
└── README.md

Pages 켜면 사용자명.github.io/my-viz/에서 인터랙티브 시각화 공개. 친구·교수에게 URL 하나로 공유 가능.

---

8. GitHub Actions — 자동화의 핵심

8.1 Actions가 뭔가

저장소에 어떤 일이 일어났을 때, 또는 정해진 시각에, 자동으로 코드를 실행해주는 기능. GitHub의 가장 강력한 기능 중 하나.

가능한 일들:

8.2 작동 원리

  1. 저장소에 .github/workflows/ 폴더를 만든다
  2. 그 안에 .yml 파일을 만든다 (워크플로 정의)
  3. 정해둔 조건(트리거)이 충족되면 GitHub의 서버가 자동 실행
[트리거 발생]
   ├─ push: 누가 코드를 올렸을 때
   ├─ schedule: 정해진 시각이 됐을 때
   ├─ workflow_dispatch: 수동 버튼으로 실행
   └─ issues: 이슈가 생겼을 때 등
        ↓
[GitHub의 가상 서버 (Runner) 켜짐]
        ↓
[.yml에 적힌 단계들 순서대로 실행]
        ↓
[결과 저장 / 배포 / 통지]
        ↓
[서버 종료]

8.3 첫 워크플로 — "Hello World"

저장소에서 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 탭에 가면 워크플로 실행 결과를 볼 수 있습니다. 녹색 체크면 성공.

8.4 무료 한도

저장소 유형 무료 Actions 시간
Public 저장소 무제한
Private 저장소 월 2,000분 (약 33시간)

학부 강의용 공개 프로젝트는 사실상 무제한입니다.

---

9. 사례 1: Vite + React 프로젝트를 Pages에 자동 배포

본문 강의에서 다룬 Vite 프로젝트를 GitHub Pages에 자동 배포해봅시다.

9.1 워크플로 파일

.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

9.2 추가 설정 1 — vite.config.ts

저장소 이름이 my-app이라면:

export default defineConfig({
  plugins: [react()],
  base: '/my-app/'   // ← 저장소 이름과 일치시킴
})

9.3 추가 설정 2 — Pages 소스 변경

저장소 Settings → Pages:

이제 코드를 push할 때마다:

  1. GitHub 서버가 자동으로 빌드 (npm run build)
  2. 결과물(dist/)을 Pages로 배포
  3. 1~2분 후 사이트에 반영

개발자는 코드만 푸시하면 끝. 배포는 GitHub가 다 해줍니다.

---

10. 사례 2: 매일 새벽 3시 뉴스 자동 수집 (Cron Job)

이게 GitHub Actions의 진짜 매력입니다. 서버 한 대 없이도 정기 작업이 가능합니다.

10.1 시나리오

매일 새벽 3시 (한국 시간), 네이버 IT 뉴스 헤드라인 50건을 수집해서 CSV로 저장하고, 변경된 CSV를 자동으로 저장소에 커밋. 결과는 Pages에서 그래프로 볼 수 있게.

10.2 Python 크롤링 스크립트

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)

10.3 의존성 파일

requirements.txt:

requests==2.32.3
beautifulsoup4==4.12.3

10.4 Actions 워크플로

.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

10.5 Cron 표현식 읽는 법

* * * * *
│ │ │ │ │
│ │ │ │ └── 요일 (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

Cron 도구

복잡한 표현식은 https://crontab.guru 에서 검증. UTC로 입력하고 결과 시각도 UTC로 표시됨에 유의.

10.6 Cron 신뢰성 — 주의 필요

GitHub Actions cron은 정시에 안 돌 수 있습니다. 공식적으로:

진짜 정확한 정기 실행이 필요하면, 결정적 작업에 의존하지 말고:

10.7 결과 확인

며칠 후 저장소를 보면:

data/
├── headlines_2026-05-12.csv
├── headlines_2026-05-13.csv
├── headlines_2026-05-14.csv
└── ...

자동으로 쌓입니다. 서버 하나 안 빌리고, 한 번 설정해두면 끝. 학생 강의용 데이터 저널리즘 실습으로 매우 강력합니다.

---

11. 사례 3: Secrets로 API 키 안전하게 사용하기

크롤링이나 API 호출에 비밀 키가 필요할 때.

11.1 Secret 등록

저장소 Settings → Secrets and variables → Actions → New repository secret:

저장 후엔 본인도 다시 볼 수 없습니다 (수정/삭제만 가능). 암호화돼서 저장됨.

11.2 워크플로에서 사용

- 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는 워크플로 로그에 출력해도 자동으로 마스킹됩니다. 코드에 직접 적지 않는 한 안전합니다.

---

12. 워크플로 디버깅 — 안 될 때 어떻게 하나

12.1 Actions 탭에서 로그 보기

저장소 Actions 탭 → 실패한 워크플로 클릭 → 빨간 X 표시된 단계 클릭 → 상세 로그 확인.

가장 흔한 오류:

12.2 로컬에서 동일 환경 테스트

워크플로 yml과 같은 명령을 본인 PC에서 먼저 실행해 보기. 거기서 안 되면 워크플로에서도 안 됩니다.

12.3 워크플로 수동 실행 버튼

on:
  workflow_dispatch:

이 한 줄 추가하면 Actions 탭에서 Run workflow 버튼이 생깁니다. 매번 push하지 않고도 테스트 가능. 개발 단계에서 필수.

---

13. 협업 입문 — Branch와 Pull Request

여기까지는 혼자 작업하는 흐름이었습니다. 둘 이상이 함께 작업하면 추가 개념이 필요해요.

13.1 Branch (가지)

Branch = 평행 우주의 코드. 메인 코드(main)는 그대로 두고, 별도 가지에서 새 기능을 실험.

# 새 가지 만들고 이동
git checkout -b new-feature

# 작업 후
git add .
git commit -m "새 기능 추가"
git push origin new-feature

13.2 Pull Request (PR)

PR = "내 가지에서 작업한 거 main에 합쳐주세요" 라는 요청.

  1. GitHub에서 새 가지로 PR 생성
  2. 동료가 코드 검토, 댓글
  3. 수정 사항 반영
  4. Merge (병합) → main에 통합

한 줄 정리: 혼자 작업할 땐 main에 바로, 협업할 땐 별도 branch + PR.

---

14. 자주 묻는 질문

Q1. Git GUI vs 명령어, 뭐로 시작할까요?

GUI(GitHub Desktop)로 시작. 1~2달 익숙해진 후 명령어로 넘어가도 충분합니다. 명령어가 진입 장벽이 되어 GitHub를 포기하는 경우가 많아요.

Q2. 실수로 비밀번호를 푸시했어요!

즉시 그 비밀번호를 재발급(rotate) 하세요. 한 번 GitHub에 올라간 정보는 히스토리에서 완벽히 삭제하기 매우 어렵습니다. 옛 비밀번호를 무효화하는 게 빠른 해결.

Q3. Private 저장소가 무료에 무제한이라는데 함정 있나요?

없습니다. 무료 계정에서 비공개 저장소 무제한. 단, 협업자 수가 무료에선 제한됩니다 (Pro 등급 필요할 수 있음).

Q4. Pages는 정말 무료에 무제한인가요?

"Soft limit"이 있습니다. 권장 한도는 저장소 1GB, 월 트래픽 100GB, 일 빌드 10회. 학부 강의용으론 절대 초과 안 합니다.

Q5. 학교 컴퓨터에서 작업하다가 졸업하면 GitHub 어떻게 되나요?

GitHub 계정은 개인 소유. 학교를 떠나도 그대로 유지됩니다. 학생 인증 혜택만 만료됩니다.

Q6. 다른 사람 코드를 가져다 써도 되나요?

저장소의 라이선스(LICENSE) 파일 확인. MIT, Apache 2.0, BSD면 보통 자유롭게 사용 가능 (출처 표시 권장). GPL은 사용 시 본인 코드도 공개해야 함. 라이선스 없으면 무단 사용 위험.

Q7. Actions가 갑자기 안 돌아요.

가능성:

  1. 60일 비활성 → 수동으로 한 번 실행
  2. 무료 한도 초과 (Private 저장소만) → 다음 달 대기
  3. yml 문법 오류 → Actions 탭에서 빨간 X 확인
  4. GitHub 자체 장애 → https://www.githubstatus.com 확인

---

15. 핵심 요약

  1. Git ≠ GitHub: Git은 도구, GitHub는 클라우드 서비스
  2. 저장소 = 프로젝트 폴더: 하나의 프로젝트 = 하나의 저장소
  3. 공개 vs 비공개: 포트폴리오는 공개, 미공개 연구는 비공개
  4. 파일 올리기 3단계: 브라우저 드래그 → GitHub Desktop → Git 명령어
  5. 로컬과 GitHub 동기화: 작업 전 pull, 작업 후 push
  6. README.md는 첫인상: 공들여 작성
  7. .gitignore는 안전장치: 키, 비밀번호, 임시 파일을 거름
  8. Pages는 무료 호스팅: Settings → Pages → Branch 선택이면 끝
  9. Actions는 자동화: .github/workflows/에 yml 파일
  10. Cron은 UTC 기준: 한국 시각 새벽 3시 = 0 18 * * *
  11. Secrets로 API 키 관리: 코드에 직접 적지 말 것
  12. 수동 실행 버튼: workflow_dispatch 한 줄 추가

---

17. 더 공부하려면

---