포스트

[이제와서 시작하는 GitHub 마스터하기 - 기초편 #6] .gitignore와 라이선스: 프로젝트 관리 필수 요소

[이제와서 시작하는 GitHub 마스터하기 - 기초편 #6] .gitignore와 라이선스: 프로젝트 관리 필수 요소

학습 목표

이 장을 마치면 다음을 할 수 있습니다:

  • ✅ .gitignore 파일의 역할을 이해하고 작성할 수 있습니다
  • ✅ 언어/프레임워크별 적절한 무시 패턴을 설정할 수 있습니다
  • ✅ 오픈소스 라이선스의 종류와 차이를 이해할 수 있습니다
  • ✅ 프로젝트에 적절한 라이선스를 선택하고 적용할 수 있습니다

지난 편 복습

기초편 #5에서는 README 작성법을 배웠습니다:

  • README.md 파일의 중요성과 기본 구조
  • Markdown 문법 완벽 정리
  • Badge, 이미지, 코드 블록 활용
  • 전문적인 README 작성 팁

1. .gitignore 파일 이해하기

1.1 .gitignore란?

Git이 추적하지 말아야 할 파일/폴더를 지정하는 파일입니다.

왜 필요한가?

1
2
3
4
5
6
my-project/
├── src/           # ✅ 추적 필요 (소스 코드)
├── node_modules/  # ❌ 추적 불필요 (설치된 패키지)
├── .env           # ❌ 추적 금지 (비밀 정보)
├── dist/          # ❌ 추적 불필요 (빌드 결과물)
└── .DS_Store      # ❌ 추적 불필요 (시스템 파일)

추적하지 말아야 할 파일:

  1. 빌드 결과물: dist/, build/, *.o, *.exe
  2. 의존성: node_modules/, vendor/, .venv/
  3. 환경 설정: .env, config.local.js
  4. 민감 정보: 비밀번호, API 키, 인증서
  5. 시스템 파일: .DS_Store, Thumbs.db, *.swp
  6. IDE 설정: .vscode/, .idea/, *.iml
  7. 로그 파일: *.log, logs/
  8. 캐시: .cache/, *.tmp

추적하면 안 되는 이유

  • 저장소 크기 증가: 불필요한 파일로 저장소가 무거워짐
  • 보안 위험: 비밀 키, 비밀번호 노출
  • 충돌 발생: 개발자마다 다른 빌드 결과물
  • 성능 저하: Git 명령어 실행 속도 느려짐

1.2 .gitignore 기본 문법

파일/폴더 지정

# 특정 파일
config.json
secret.key

# 특정 폴더 (모든 하위 항목 포함)
node_modules/
logs/

# 특정 확장자 (모든 위치)
*.log
*.tmp
*.swp

# 특정 폴더의 특정 파일
src/config.local.js

# 폴더 내 특정 확장자
logs/*.log

패턴 매칭

# * : 임의의 문자열 (/, 제외)
*.txt          # 모든 .txt 파일

# ** : 임의의 디렉토리 (/, 포함)
**/logs        # 모든 위치의 logs 폴더
**/logs/*.txt  # 모든 logs 폴더의 .txt 파일

# ? : 하나의 문자
file?.txt      # file1.txt, fileA.txt (O), file12.txt (X)

# [] : 문자 범위
file[0-9].txt  # file0.txt ~ file9.txt
file[abc].txt  # filea.txt, fileb.txt, filec.txt

# ! : 예외 (무시하지 않음)
*.log          # 모든 .log 무시
!important.log # 하지만 important.log는 추적

주석과 공백

# 이것은 주석입니다

# 빈 줄은 무시됩니다

*.log  # 라인 끝 주석도 가능

1.3 언어/프레임워크별 .gitignore

Node.js / JavaScript

# Dependencies
node_modules/
bower_components/

# Build
dist/
build/
*.bundle.js

# Environment
.env
.env.local
.env.*.local

# Logs
logs/
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# IDE
.vscode/
.idea/
*.suo
*.ntvs*
*.njsproj
*.sln

# OS
.DS_Store
Thumbs.db

# Cache
.npm
.eslintcache
.cache/

Python

# Byte-compiled / optimized
__pycache__/
*.py[cod]
*$py.class

# Virtual environment
venv/
env/
ENV/
.venv

# Distribution / packaging
build/
dist/
*.egg-info/
.eggs/

# PyCharm
.idea/

# Jupyter Notebook
.ipynb_checkpoints

# Environment
.env
.env.*

# pytest
.pytest_cache/
.coverage
htmlcov/

# mypy
.mypy_cache/

Java

# Compiled class file
*.class

# Package Files
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar

# Virtual machine crash logs
hs_err_pid*

# Build
target/
build/
out/

# IDE
.idea/
*.iml
*.ipr
*.iws
.project
.classpath
.settings/

# Maven
.mvn/
mvnw
mvnw.cmd

# Gradle
.gradle/
gradlew
gradlew.bat

React / Next.js

# Dependencies
node_modules/

# Production
build/
dist/
.next/
out/

# Testing
coverage/

# Misc
.DS_Store
*.pem

# Debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# Local env files
.env
.env.local
.env.development.local
.env.test.local
.env.production.local

# Vercel
.vercel

1.4 .gitignore 실전 팁

1. GitHub 템플릿 활용

GitHub가 제공하는 공식 템플릿: https://github.com/github/gitignore

1
2
3
4
# 저장소 생성 시 .gitignore 자동 생성
1. "Create a new repository" 페이지
2. "Add .gitignore" 드롭다운
3. 언어/프레임워크 선택 (예: Node, Python, Java)

2. gitignore.io 활용

https://www.toptal.com/developers/gitignore

1
2
3
4
# 여러 환경을 조합
Node + macOS + VisualStudioCode
↓
자동으로 최적화된 .gitignore 생성

3. 이미 추적 중인 파일 무시하기

1
2
3
4
5
6
7
8
9
10
11
12
13
# .gitignore에 추가했는데 여전히 추적되는 경우
# → Git 캐시에서 제거 필요

# 특정 파일 제거
git rm --cached file.txt

# 특정 폴더 제거
git rm -r --cached folder/

# .gitignore에 명시된 모든 파일 제거
git rm -r --cached .
git add .
git commit -m "Apply .gitignore"

4. 글로벌 .gitignore

모든 저장소에 공통 적용:

1
2
3
4
5
6
7
8
9
10
# 글로벌 .gitignore 파일 생성
touch ~/.gitignore_global

# 내용 추가 (예: macOS, IDE)
echo ".DS_Store" >> ~/.gitignore_global
echo ".vscode/" >> ~/.gitignore_global
echo ".idea/" >> ~/.gitignore_global

# Git에 등록
git config --global core.excludesfile ~/.gitignore_global

5. 예외 처리 주의사항

# ❌ 잘못된 예외 처리
build/
!build/important.js  # 작동 안 함 (build/ 전체가 이미 무시됨)

# ✅ 올바른 예외 처리
build/*
!build/important.js  # 작동함 (build/ 자체는 추적, 내용물만 무시)

6. 디버깅

1
2
3
4
5
6
# 특정 파일이 무시되는 이유 확인
git check-ignore -v file.txt

# 출력 예시:
# .gitignore:3:*.txt    file.txt
# → .gitignore 파일의 3번째 줄 *.txt 규칙에 의해 무시됨

2. 라이선스 선택하기

2.1 라이선스란?

소프트웨어 사용, 수정, 배포에 대한 법적 권한을 명시한 문서입니다.

왜 중요한가?

1
2
3
4
5
라이선스 없음 = 모든 권리 보유 (타인 사용 불가)
     ↓
기본적으로 저작권법에 의해 보호
     ↓
명시적 허가 없으면 불법

라이선스의 효과:

  • 사용 허가: 다른 사람이 코드를 사용할 수 있음
  • 법적 보호: 책임 소재 명확화
  • 기여 유도: 명확한 규칙으로 협업 촉진
  • 신뢰 구축: 전문적인 프로젝트 운영

2.2 주요 오픈소스 라이선스

MIT License (가장 인기)

특징: 매우 자유로운 라이선스

1
2
3
4
5
6
7
8
9
10
11
12
✅ 허용:
- 상업적 이용
- 수정
- 배포
- 서브라이선스
- 개인 사용

⚠️ 조건:
- 라이선스 및 저작권 명시

❌ 제한:
- 책임 없음 (개발자 책임 면제)

사용 사례: React, jQuery, Node.js, Rails

언제 사용?

  • 최대한 많은 사람이 사용하길 원할 때
  • 상업적 이용도 허용하고 싶을 때
  • 복잡한 조건을 원하지 않을 때

Apache License 2.0

특징: MIT보다 조금 더 법적 보호

1
2
3
4
5
6
7
8
9
10
✅ 허용:
- MIT와 동일 + 특허권 명시적 부여

⚠️ 조건:
- 라이선스 및 저작권 명시
- 변경사항 명시
- NOTICE 파일 포함

❌ 제한:
- 상표권 사용 불가

사용 사례: Android, Kubernetes, Apache 프로젝트

언제 사용?

  • 특허 문제가 중요한 프로젝트
  • 법적 보호가 더 필요할 때

GPL (GNU General Public License)

특징: 강력한 카피레프트 (Copyleft)

1
2
3
4
5
6
7
8
9
10
11
12
✅ 허용:
- 상업적 이용
- 수정
- 배포

⚠️ 조건:
- 소스 코드 공개 의무 (동일 라이선스)
- 변경사항 명시
- 라이선스 및 저작권 명시

❌ 제한:
- 서브라이선스 불가 (GPL 유지 필수)

버전:

  • GPLv2: Linux 커널
  • GPLv3: 추가 보호 (특허, DRM)

사용 사례: Linux, Git, WordPress

언제 사용?

  • 파생 작품도 오픈소스로 유지하고 싶을 때
  • 상업적 이용 시에도 코드 공개 원할 때

BSD License

특징: MIT와 유사하지만 변형이 많음

1
2
3
4
5
6
7
8
9
✅ 허용:
- MIT와 거의 동일

⚠️ 조건:
- 라이선스 및 저작권 명시

특이사항:
- 2-Clause: 매우 간단
- 3-Clause: 개발자 이름 무단 사용 금지

사용 사례: FreeBSD, Django

Creative Commons (CC)

특징: 코드보다는 문서, 이미지, 미디어에 적합

1
2
3
4
5
종류:
- CC0: 퍼블릭 도메인 (모든 권리 포기)
- CC-BY: 저작자 표시
- CC-BY-SA: 저작자 표시 + 동일 조건 배포
- CC-BY-NC: 저작자 표시 + 비상업적 이용만

언제 사용?

  • README, 문서, 튜토리얼
  • 이미지, 동영상, 음악
  • 코드에는 MIT/Apache 권장

2.3 라이선스 선택 가이드

결정 트리

graph TD
    A[오픈소스로 공개?] -->|Yes| B[파생 작품도 오픈소스?]
    A -->|No| Z[라이선스 불필요]

    B -->|Yes 필수| C[GPL v3]
    B -->|No 선택| D[특허 보호 필요?]

    D -->|Yes| E[Apache 2.0]
    D -->|No| F[MIT License]

    style C fill:#f9f
    style E fill:#9cf
    style F fill:#9f9

비교표

라이선스 사용 자유도 파생물 공개 특허 보호 복잡도
MIT ⭐⭐⭐⭐⭐ ⭐ (간단)
Apache 2.0 ⭐⭐⭐⭐⭐ ⭐⭐
GPL v3 ⭐⭐⭐ ✅ 필수 ⭐⭐⭐⭐ (복잡)
BSD ⭐⭐⭐⭐⭐

프로젝트 유형별 추천

개인 프로젝트 / 포트폴리오MIT License (간단하고 자유로움)

기업에서 사용할 라이브러리Apache 2.0 (특허 보호)

오픈소스 운동 지지GPL v3 (파생물도 오픈소스 유지)

문서 / 튜토리얼CC-BY (Creative Commons)

2.4 라이선스 적용 방법

GitHub에서 라이선스 추가

방법 1: 저장소 생성 시

1
2
3
4
1. "Create a new repository" 페이지
2. "Add a license" 드롭다운
3. 라이선스 선택 (MIT, Apache, GPL 등)
4. 자동으로 LICENSE 파일 생성

방법 2: 기존 저장소에 추가

1
2
3
4
5
6
1. 저장소 메인 페이지
2. "Add file" → "Create new file"
3. 파일명: "LICENSE" 또는 "LICENSE.md"
4. "Choose a license template" 버튼 클릭
5. 라이선스 선택
6. Commit

수동으로 추가

1. LICENSE 파일 생성

1
2
# 저장소 루트에 생성
touch LICENSE

2. 라이선스 내용 복사

  • MIT: https://opensource.org/licenses/MIT
  • Apache: https://www.apache.org/licenses/LICENSE-2.0.txt
  • GPL v3: https://www.gnu.org/licenses/gpl-3.0.txt

3. 저작권자 정보 수정

1
2
3
4
5
MIT License

Copyright (c) 2025 Your Name

Permission is hereby granted...

4. README에 명시

1
2
3
## License

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.

소스 파일에 헤더 추가 (선택)

MIT 예시:

1
2
3
4
5
6
7
/**
 * Copyright (c) 2025 Your Name
 * Licensed under the MIT License
 * See LICENSE file in the project root
 */

// 코드 시작...

Apache 2.0 예시:

1
2
3
4
5
6
7
8
9
/*
 * Copyright 2025 Your Name
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 */

2.5 라이선스 사용 시 주의사항

DO ✅

  1. LICENSE 파일 포함: 저장소 루트에 필수
  2. README 명시: 라이선스 정보 기재
  3. 저작권 표시: Copyright (c) 2025 Your Name
  4. 일관성 유지: 하나의 프로젝트는 하나의 라이선스
  5. 의존성 확인: 사용하는 라이브러리의 라이선스 호환성 체크

DON’T ❌

  1. 라이선스 없이 배포: 법적 문제 발생 가능
  2. 라이선스 무단 변경: 기존 기여자 권리 침해
  3. 호환되지 않는 라이선스 혼용: GPL + MIT (주의 필요)
  4. 라이선스 조건 위반: 저작권 표시 누락, 소스 공개 의무 미이행

라이선스 호환성

1
2
3
4
MIT → Apache 2.0 (✅ 가능)
MIT → GPL (✅ 가능)
Apache 2.0 → GPL v3 (✅ 가능)
GPL → MIT (❌ 불가능, GPL이 더 제한적)

자주 묻는 질문 (FAQ)

Q1. .gitignore를 나중에 추가하면 이전 커밋도 적용되나요?

A: 아니요. .gitignore는 미래의 추적에만 영향을 줍니다. 이미 커밋된 파일은 다음 명령으로 제거해야 합니다:

1
2
3
git rm -r --cached .
git add .
git commit -m "Apply .gitignore"

Q2. 민감한 정보(API 키)를 이미 커밋했어요!

A: 즉시 조치 필요:

  1. 해당 API 키를 즉시 무효화/재발급
  2. .env를 .gitignore에 추가
  3. Git 히스토리에서 제거 (BFG Repo-Cleaner 또는 git filter-branch 사용)
  4. 재발급한 키로 교체

⚠️ 중요: Git 히스토리에 한 번 들어간 정보는 누구나 볼 수 있으므로 키는 즉시 무효화하세요!

Q3. 라이선스를 나중에 변경할 수 있나요?

A: 가능하지만 복잡합니다:

  • 개인 프로젝트: 자유롭게 변경 가능
  • 기여자가 있는 프로젝트: 모든 기여자의 동의 필요
  • 더 제한적인 라이선스로 변경 (MIT → GPL): 가능하지만 이전 버전은 MIT 유지
  • 더 자유로운 라이선스로 변경 (GPL → MIT): 기여자 동의 필수

Q4. 라이선스 없이 공개된 코드를 사용해도 되나요?

A: 안 됩니다. 라이선스가 없으면 저작권법에 의해 모든 권리가 보호됩니다. 개발자에게 허가를 요청하거나 라이선스 추가를 요청하세요.

실습 과제

과제 1: .gitignore 설정

  1. 새 프로젝트 생성 (Node.js 또는 Python)
  2. gitignore.io에서 적절한 .gitignore 생성
  3. 추가 규칙 작성:
    • 개인 메모 파일 (notes.txt)
    • 로컬 설정 파일 (config.local.json)
  4. git status로 무시 확인

과제 2: 이미 추적된 파일 제거

  1. node_modules/ 또는 __pycache__/ 생성
  2. 실수로 커밋
  3. .gitignore 추가
  4. Git 캐시에서 제거
  5. 다시 커밋하여 적용 확인

과제 3: 라이선스 선택 및 적용

  1. 개인 프로젝트에 적합한 라이선스 선택 (MIT 권장)
  2. LICENSE 파일 생성
  3. README에 라이선스 정보 추가
  4. (선택) 주요 소스 파일에 저작권 헤더 추가

마무리

축하합니다! .gitignore와 라이선스를 이해하고 적용할 수 있게 되었습니다.

핵심 요약:

  • .gitignore: 불필요한 파일 추적 방지 → 저장소 효율화
  • 라이선스: 법적 권한 명시 → 안전한 공유와 협업
  • 보안: 민감 정보 절대 커밋 금지
  • 전문성: 적절한 설정으로 프로젝트 신뢰도 향상

다음 편에서는 첫 커밋을 만들고 관리하는 방법을 배워보겠습니다!

📚 GitHub 마스터하기 시리즈

🌱 기초편 (입문자)

  1. GitHub 소개와 계정 만들기
  2. 프로필 꾸미기와 포트폴리오
  3. 보안 설정과 인증
  4. Repository 이해하기
  5. README 작성법
  6. .gitignore와 라이선스 👉 현재 글
  7. 첫 커밋과 관리
  8. git add와 commit
  9. git push와 pull
  10. 실전 워크플로우
  11. Branch 기본
  12. Merge와 Rebase
  13. 브랜치 전략
  14. Fork와 Clone
  15. Pull Request

💼 실전편 (중급자)

  1. Issues 활용법
  2. Projects와 칸반보드
  3. 코드 리뷰 실전
  4. Discussions 활용
  5. 팀 협업 전략
  6. GitHub Pages 블로그

🚀 고급편 (전문가)

  1. GitHub Actions 입문
  2. Actions 고급 활용
  3. Webhooks와 API
  4. GitHub Apps 개발
  5. 보안 기능 활용
  6. Packages 레지스트리
  7. Codespaces 클라우드 개발
  8. GitHub CLI 마스터
  9. Insights와 Analytics

🏆 심화편 (전문가+)

  1. Submodules와 Subtree
  2. Git Internals 이해
  3. 브랜칭과 릴리스 전략
  4. GraphQL API 활용
  5. GitHub Copilot 마스터
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.