1.2 버전 관리 시스템 📦
📖 개요
버전 관리 시스템(VCS)은 코드의 변경 이력을 추적하고, 언제든 특정 시점으로 되돌릴 수 있으며, 여러 명의 개발자가 동시에 협업할 수 있게 해주는 필수 도구이다. 현재 업계 표준은 Git이다.
🔧 1. 버전 관리란?
1.1 버전 관리의 필요성
코드의 변경 이력 추적
- 누가, 언제, 무엇을, 왜 변경했는지 모든 기록을 남긴다
- 문제가 생기면 이전 버전으로 되돌릴 수 있다
협업 지원
- 여러 명의 개발자가 동시에 작업할 수 있다
- 코드 충돌을 관리하고 해결할 수 있다
백업 및 복구
- 코드를 안전하게 보관한다
- 실수로 삭제한 파일도 복구할 수 있다
1.2 Git의 특징
분산 버전 관리
- 중앙 서버뿐만 아니라 각 개발자의 컴퓨터에도 전체 이력이 저장된다
- 네트워크가 없어도 대부분의 작업을 수행할 수 있다
빠른 성능
- 대부분의 작업이 로컬에서 이루어져 매우 빠르다
- 브랜치 생성과 병합이 가볍고 빠르다
강력한 브랜치 시스템
- 실험적인 작업을 안전하게 진행할 수 있다
- 여러 기능을 동시에 개발할 수 있다
🌐 2. 주요 플랫폼
2.1 GitHub
특징
- 전 세계 개발자들이 가장 많이 사용하는 플랫폼
- 오픈 소스 프로젝트와 커뮤니티 형성이 잘 되어 있다
- 무료 플랜으로도 충분한 기능 제공
주요 기능
- Pull Request를 통한 코드 리뷰
- GitHub Actions를 통한 CI/CD
- Issues를 통한 프로젝트 관리
- GitHub Pages를 통한 정적 사이트 호스팅
적합한 용도
- 오픈 소스 프로젝트
- 개인 포트폴리오
- 소규모 팀 프로젝트
2.2 GitLab
특징
- 강력한 CI/CD 기능이 내장되어 있다
- 기업이 사내 서버에 직접 설치해 사용하기에 적합하다
- 무료 플랜에서도 프라이빗 저장소 무제한
주요 기능
- 내장된 CI/CD 파이프라인
- 자체 호스팅 가능 (GitLab CE)
- 강력한 보안 기능
- 이슈 보드와 프로젝트 관리 도구
적합한 용도
- 기업 내부 프로젝트
- DevOps 자동화가 중요한 프로젝트
- 보안이 중요한 프로젝트
2.3 Bitbucket
특징
- Jira, Confluence 등 Atlassian 제품군과의 연동성이 뛰어나다
- 프로젝트 관리가 용이하다
- 소규모 팀에게 무료 플랜 제공
주요 기능
- Jira와의 완벽한 통합
- Pull Request 기능
- 파이프라인을 통한 CI/CD
- 브랜치 권한 관리
적합한 용도
- Atlassian 생태계를 사용하는 팀
- 프로젝트 관리와 개발을 통합하고 싶은 경우
- 소규모 팀 협업
💻 3. Git 기초 명령어
3.1 저장소 초기화
새로운 저장소 생성
git init
- 현재 디렉토리를 Git 저장소로 초기화한다
.git폴더가 생성된다
기존 저장소 복제
git clone [저장소 URL]
- 원격 저장소의 전체 내용을 복사한다
3.2 기본 워크플로우
1. 상태 확인
git status
- 변경된 파일을 확인한다
- 스테이징 영역의 상태를 확인한다
2. 스테이징 (Staging)
git add . # 모든 변경사항 추가
git add [파일명] # 특정 파일만 추가
- 커밋할 파일을 선택한다
- 스테이징 영역에 파일을 추가한다
3. 커밋 (Commit)
git commit -m "커밋 메시지"
- 스테이징된 변경사항을 기록한다
- 의미 있는 커밋 메시지를 작성한다
4. 원격 저장소 연결
git remote add origin [저장소 URL]
- 로컬 저장소와 원격 저장소를 연결한다
5. 푸시 (Push)
git push origin main
- 로컬 커밋을 원격 저장소로 전송한다
6. 풀 (Pull)
git pull origin main
- 원격 저장소의 최신 변경사항을 가져온다
- 자동으로 병합을 시도한다
3.3 이력 확인
커밋 이력 보기
git log # 상세한 이력
git log --oneline # 간략한 이력
git log --graph # 그래프 형태로 보기
변경사항 확인
git diff # 작업 디렉토리의 변경사항
git diff --staged # 스테이징된 변경사항
🌿 4. 브랜치 전략
4.1 Git Flow
개요
- 5가지 브랜치를 엄격하게 관리하는 대규모 프로젝트용 전략
- 명확한 역할 분담과 릴리즈 관리가 가능하다
브랜치 종류
1. Main (Master)
- 배포 가능한 상태만 유지
- 언제든 프로덕션에 배포할 수 있는 코드
2. Develop
- 다음 릴리즈를 위한 개발 브랜치
- Feature 브랜치들이 병합되는 곳
3. Feature
- 새로운 기능 개발용 브랜치
feature/기능명형태로 명명- 개발 완료 후 Develop에 병합
4. Release
- 배포 준비를 위한 브랜치
release/버전형태로 명명- 버그 수정만 가능
5. Hotfix
- 긴급 버그 수정용 브랜치
- Main에서 분기하여 수정 후 Main과 Develop 모두에 병합
장점
- 체계적인 릴리즈 관리
- 명확한 브랜치 역할 구분
- 대규모 프로젝트에 적합
단점
- 복잡한 구조
- 작은 프로젝트에는 과도할 수 있음
4.2 GitHub Flow
개요
- Main 브랜치를 항상 배포 가능한 상태로 유지
- 기능 개발 시 Feature 브랜치를 만들어 작업 후 바로 병합하는 단순한 전략
워크플로우
- Main 브랜치에서 Feature 브랜치 생성
- Feature 브랜치에서 개발 진행
- 커밋을 자주 하고 원격 저장소에 푸시
- Pull Request 생성
- 코드 리뷰 및 토론
- Main 브랜치에 병합
- 즉시 배포
장점
- 단순하고 이해하기 쉬움
- 빠른 배포 주기에 적합
- 지속적 배포(Continuous Deployment)에 적합
단점
- 릴리즈 관리가 명확하지 않음
- 여러 버전을 동시에 관리하기 어려움
4.3 브랜치 기본 명령어
브랜치 생성
git branch [브랜치명] # 브랜치 생성
git checkout -b [브랜치명] # 생성과 동시에 전환
git switch -c [브랜치명] # 최신 명령어
브랜치 전환
git checkout [브랜치명]
git switch [브랜치명] # 최신 명령어
브랜치 확인
git branch # 로컬 브랜치 목록
git branch -r # 원격 브랜치 목록
git branch -a # 모든 브랜치 목록
브랜치 병합
git merge [브랜치명] # 현재 브랜치에 병합
브랜치 삭제
git branch -d [브랜치명] # 로컬 브랜치 삭제
git push origin --delete [브랜치명] # 원격 브랜치 삭제
👥 5. 협업 워크플로우
5.1 Pull Request (PR) 프로세스
1. 브랜치 생성
git checkout -b feature/new-feature
- 기능별로 브랜치를 생성한다
- 명확한 이름을 사용한다
2. 개발 및 커밋
git add .
git commit -m "feat: 새로운 기능 추가"
- 의미 있는 단위로 커밋한다
- 명확한 커밋 메시지를 작성한다
3. 원격 저장소에 푸시
git push origin feature/new-feature
4. Pull Request 생성
- GitHub/GitLab/Bitbucket에서 PR 생성
- 변경 사항을 명확하게 설명
- 관련 이슈가 있다면 연결
5. 코드 리뷰
- 동료 개발자들이 코드를 검토
- 피드백을 주고받는다
- 필요시 수정 후 추가 커밋
6. 승인 및 병합
- 승인(Approve)을 받은 후 병합
- 병합 후 브랜치 삭제 고려
5.2 커밋 메시지 컨벤션
기본 형식
타입: 제목
본문 (선택사항)
푸터 (선택사항)
주요 타입
feat: 새로운 기능 추가fix: 버그 수정docs: 문서 수정style: 코드 포맷팅, 세미콜론 누락 등refactor: 코드 리팩토링test: 테스트 코드 추가chore: 빌드 업무, 패키지 매니저 수정 등
예시
git commit -m "feat: 사용자 로그인 기능 추가"
git commit -m "fix: 회원가입 시 이메일 유효성 검증 오류 수정"
git commit -m "docs: README에 설치 방법 추가"
5.3 충돌 해결
충돌이 발생하는 경우
- 같은 파일의 같은 부분을 서로 다르게 수정했을 때
- Pull이나 Merge 시 발생
충돌 해결 방법
- 충돌이 발생한 파일을 확인
git status - 파일을 열어 충돌 부분 확인
<<<<<<< HEAD 현재 브랜치의 내용 ======= 병합하려는 브랜치의 내용 >>>>>>> feature/new-feature 충돌을 해결하고 마커 제거
- 수정된 파일을 스테이징
git add [파일명] - 병합 완료
git commit
⚙️ 6. Git 설정 및 최적화
6.1 전역 설정
사용자 정보 설정
git config --global user.name "이름"
git config --global user.email "이메일"
기본 에디터 설정
git config --global core.editor "code" # VS Code
git config --global core.editor "vim" # Vim
줄바꿈 설정
# Windows
git config --global core.autocrlf true
# Mac/Linux
git config --global core.autocrlf input
6.2 .gitignore
개념
- Git이 추적하지 않을 파일과 디렉토리를 지정한다
- 민감한 정보나 빌드 산출물을 제외한다
Java 프로젝트 예시
# 컴파일된 클래스 파일
*.class
*.jar
*.war
*.ear
# 빌드 디렉토리
/build/
/out/
/target/
# IDE 설정 파일
.idea/
.vscode/
*.iml
# 민감한 설정 파일
application-prod.properties
application-secret.yml
# 로그 파일
*.log
# OS 파일
.DS_Store
Thumbs.db
중요 주의사항
- 민감한 정보(API 키, 비밀번호 등)는 절대 커밋하지 않는다
- 이미 커밋된 파일은
.gitignore에 추가해도 계속 추적된다 - 이미 커밋된 파일을 제거하려면:
git rm --cached [파일명] git commit -m "Remove sensitive file"
🎯 7. 핵심 정리
7.1 버전 관리 시스템 요약
핵심 개념
- 코드 변경 이력 추적 및 관리
- 협업을 위한 필수 도구
- Git이 업계 표준
주요 플랫폼
- GitHub: 오픈소스와 커뮤니티
- GitLab: CI/CD와 기업용
- Bitbucket: Atlassian 생태계 통합
기본 워크플로우
초기화 → 작업 → 스테이징 → 커밋 → 푸시 → 풀
브랜치 전략
- Git Flow: 대규모 프로젝트용
- GitHub Flow: 단순하고 빠른 배포
협업 방식
- Feature 브랜치 생성
- Pull Request를 통한 코드 리뷰
- 승인 후 병합
7.2 실무 팁
좋은 커밋 습관
- 의미 있는 단위로 자주 커밋
- 명확한 커밋 메시지 작성
- 한 커밋에는 한 가지 변경사항만
안전한 협업
- 작업 전 항상 최신 코드 pull
- Feature 브랜치에서 작업
- 정기적으로 원격 저장소에 push
보안 주의사항
- .gitignore 적극 활용
- 민감한 정보는 환경변수로 관리
- 실수로 커밋한 민감 정보는 즉시 제거
7.3 다음 단계
버전 관리 시스템을 익힌 후에는:
- 실제 프로젝트에 적용하며 연습
- 오픈 소스 프로젝트에 기여
- 팀 프로젝트에서 협업 경험
- CI/CD 파이프라인 구축 학습