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 브랜치를 만들어 작업 후 바로 병합하는 단순한 전략

워크플로우

  1. Main 브랜치에서 Feature 브랜치 생성
  2. Feature 브랜치에서 개발 진행
  3. 커밋을 자주 하고 원격 저장소에 푸시
  4. Pull Request 생성
  5. 코드 리뷰 및 토론
  6. Main 브랜치에 병합
  7. 즉시 배포

장점

  • 단순하고 이해하기 쉬움
  • 빠른 배포 주기에 적합
  • 지속적 배포(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 시 발생

충돌 해결 방법

  1. 충돌이 발생한 파일을 확인
    git status
    
  2. 파일을 열어 충돌 부분 확인
    <<<<<<< HEAD
    현재 브랜치의 내용
    =======
    병합하려는 브랜치의 내용
    >>>>>>> feature/new-feature
    
  3. 충돌을 해결하고 마커 제거

  4. 수정된 파일을 스테이징
    git add [파일명]
    
  5. 병합 완료
    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 파이프라인 구축 학습