[이제와서 시작하는 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 # ❌ 추적 불필요 (시스템 파일)
추적하지 말아야 할 파일:
- 빌드 결과물:
dist/,build/,*.o,*.exe - 의존성:
node_modules/,vendor/,.venv/ - 환경 설정:
.env,config.local.js - 민감 정보: 비밀번호, API 키, 인증서
- 시스템 파일:
.DS_Store,Thumbs.db,*.swp - IDE 설정:
.vscode/,.idea/,*.iml - 로그 파일:
*.log,logs/ - 캐시:
.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 ✅
- LICENSE 파일 포함: 저장소 루트에 필수
- README 명시: 라이선스 정보 기재
- 저작권 표시: Copyright (c) 2025 Your Name
- 일관성 유지: 하나의 프로젝트는 하나의 라이선스
- 의존성 확인: 사용하는 라이브러리의 라이선스 호환성 체크
DON’T ❌
- 라이선스 없이 배포: 법적 문제 발생 가능
- 라이선스 무단 변경: 기존 기여자 권리 침해
- 호환되지 않는 라이선스 혼용: GPL + MIT (주의 필요)
- 라이선스 조건 위반: 저작권 표시 누락, 소스 공개 의무 미이행
라이선스 호환성
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: 즉시 조치 필요:
- 해당 API 키를 즉시 무효화/재발급
.env를 .gitignore에 추가- Git 히스토리에서 제거 (BFG Repo-Cleaner 또는 git filter-branch 사용)
- 재발급한 키로 교체
⚠️ 중요: Git 히스토리에 한 번 들어간 정보는 누구나 볼 수 있으므로 키는 즉시 무효화하세요!
Q3. 라이선스를 나중에 변경할 수 있나요?
A: 가능하지만 복잡합니다:
- 개인 프로젝트: 자유롭게 변경 가능
- 기여자가 있는 프로젝트: 모든 기여자의 동의 필요
- 더 제한적인 라이선스로 변경 (MIT → GPL): 가능하지만 이전 버전은 MIT 유지
- 더 자유로운 라이선스로 변경 (GPL → MIT): 기여자 동의 필수
Q4. 라이선스 없이 공개된 코드를 사용해도 되나요?
A: 안 됩니다. 라이선스가 없으면 저작권법에 의해 모든 권리가 보호됩니다. 개발자에게 허가를 요청하거나 라이선스 추가를 요청하세요.
실습 과제
과제 1: .gitignore 설정
- 새 프로젝트 생성 (Node.js 또는 Python)
- gitignore.io에서 적절한 .gitignore 생성
- 추가 규칙 작성:
- 개인 메모 파일 (
notes.txt) - 로컬 설정 파일 (
config.local.json)
- 개인 메모 파일 (
git status로 무시 확인
과제 2: 이미 추적된 파일 제거
node_modules/또는__pycache__/생성- 실수로 커밋
- .gitignore 추가
- Git 캐시에서 제거
- 다시 커밋하여 적용 확인
과제 3: 라이선스 선택 및 적용
- 개인 프로젝트에 적합한 라이선스 선택 (MIT 권장)
- LICENSE 파일 생성
- README에 라이선스 정보 추가
- (선택) 주요 소스 파일에 저작권 헤더 추가
마무리
축하합니다! .gitignore와 라이선스를 이해하고 적용할 수 있게 되었습니다.
핵심 요약:
- ✅ .gitignore: 불필요한 파일 추적 방지 → 저장소 효율화
- ✅ 라이선스: 법적 권한 명시 → 안전한 공유와 협업
- ✅ 보안: 민감 정보 절대 커밋 금지
- ✅ 전문성: 적절한 설정으로 프로젝트 신뢰도 향상
다음 편에서는 첫 커밋을 만들고 관리하는 방법을 배워보겠습니다!
📚 GitHub 마스터하기 시리즈
🌱 기초편 (입문자)
- GitHub 소개와 계정 만들기
- 프로필 꾸미기와 포트폴리오
- 보안 설정과 인증
- Repository 이해하기
- README 작성법
- .gitignore와 라이선스 👉 현재 글
- 첫 커밋과 관리
- git add와 commit
- git push와 pull
- 실전 워크플로우
- Branch 기본
- Merge와 Rebase
- 브랜치 전략
- Fork와 Clone
- Pull Request
💼 실전편 (중급자)
🚀 고급편 (전문가)
- GitHub Actions 입문
- Actions 고급 활용
- Webhooks와 API
- GitHub Apps 개발
- 보안 기능 활용
- Packages 레지스트리
- Codespaces 클라우드 개발
- GitHub CLI 마스터
- Insights와 Analytics
