VCS의 저장 방식과 버전 관리 방식

VCS의 저장 방식과 버전 관리 방식

VCS(Version Control System)란?

VCS(Version Control System)는 버전 관리 시스템을 말합니다. 대표적으로는 깃(Git)이 있습니다. VCS는 소프트웨어 개발에서 변경 이력을 관리하고, 여러 버전을 저장하며, 협업과 소스 코드의 안정성을 유지하기 위해 사용됩니다.

VCS의 저장 방식

VCS의 버전 관리 시스템의 저장 방식은 대표적으로 델타 방식과 스냅샷 방식이 있습니다.

스냅샷 방식
  • 스냅샷 방식은 파일 시스템의 스냅샷처럼 특정 시점의 프로젝트 전체를 그대로 저장합니다.
  • 각각의 커밋은 전체 프로젝트 디렉토리 구조와 파일의 스냅샷을 저장합니다.
  • 변경된 파일만을 저장하는 것이 아니라, 전체 상태를 스냅샷으로 저장하여 버전 간의 비교가 용이합니다.
  • 장점: 이해하기 쉬우며, 변경된 내용의 추적과 롤백이 간편합니다. 파일 손상이나 손실로부터 복구하기도 쉽습니다.
  • 단점: 대용량 프로젝트의 경우 스냅샷을 저장하고 관리하는 데 디스크 공간이 많이 필요할 수 있습니다. 하지만 압축 및 차이점 저장 기술을 통해 이러한 문제를 완화할 수 있습니다.
델타 방식
  • 델타 방식은 파일의 변경 내용을 이전 버전과의 차이점으로 저장하는 방식입니다.
  • 이전 버전과의 차이를 델타(Delta)라고 하며, 변경된 내용만을 저장하여 디스크 공간을 절약합니다.
델타 방식의 한계
  • 대부분의 경우 파일의 변경 내용은 작은 부분만 변경되기 때문에 델타 방식이 유용할 수 있습니다. 하지만 파일이 크게 수정되거나 큰 파일을 다루는 경우에는 델타 계산이 복잡해지고 비효율적일 수 있습니다.
  • 파일 간의 의존성이 높은 경우에는 델타 계산이 복잡해지며, 이로 인해 저장 및 복원 시간이 길어질 수 있습니다.
Git이 스냅샷 방식을 선택한 이유

VCS의 대표적인 깃은 스냅샷 방식을 선택했습니다.
선택한 이유는 아래와 같습니다.

  • 변경 내용을 스냅샷으로 저장함으로써 버전 간 비교가 간편하며, 프로젝트의 전체 상태를 보존할 수 있습니다.
  • 현대적인 디스크 공간이 저렴하게 사용 가능하므로 전체 프로젝트의 스냅샷 저장에 큰 문제가 없습니다.
  • Git은 압축 및 차이점을 효율적으로 저장하여 스냅샷 방식의 장점을 최대한 활용하고 불필요한 디스크 사용을 최소화합니다.

VCS의 버전 관리 방식

VCS의 버전 관리 방식은 크게 중앙집중식 버전 관리 시스템과 분산 버전 관리 시스템이 있습니다. 이 두 방식은 프로젝트의 협업과 버전 관리를 어떻게 다루는지에 대한 접근 방식에서 차이가 있습니다.
깃은 분산 버전 관리 시스템을 활용해 설계되었습니다.

중앙집중식 버전 관리 (Centralized Version Control)

중앙집중식 버전 관리 시스템은 하나의 중앙 서버에 프로젝트의 모든 버전 정보가 저장되며, 개발자들은 이 중앙 서버에서 코드를 가져오고 변경 사항을 커밋합니다.

특징

  • 중앙 서버에는 전체 프로젝트의 버전 정보가 저장되어 있어, 개발자들은 중앙 서버로부터 코드를 체크아웃하고 커밋합니다.
  • 개발자들은 중앙 서버에 의존하므로 오프라인 작업이 어려울 수 있습니다.
  • 협업 시에는 중앙 서버를 통한 코드 공유와 충돌 해결이 필요합니다.
분산 버전 관리 (Distributed Version Control)

분산 버전 관리 시스템은 모든 개발자들이 각자의 로컬 저장소를 가지고 있으며, 중앙 서버와의 동기화를 통해 협업하고 버전을 관리합니다. Git은 분산 버전 관리 시스템의 대표적인 예입니다.

특징

  • 각 개발자는 자신의 로컬 저장소에서 작업을 진행하며, 중앙 서버에 접근하지 않아도 작업이 가능합니다.
  • 로컬 저장소에서 커밋하고 변경 내용을 추적할 수 있으며, 중앙 서버와 동기화할 때 변경 내용을 업데이트합니다.
  • 협업 시에도 각자의 로컬 저장소에서 작업하고 변경 내용을 공유하므로 중앙 서버에 의존하지 않고도 독립적으로 작업할 수 있습니다.
  • 충돌이 발생했을 때 중앙 서버에 의존하지 않고 로컬에서 충돌을 해결하고 업데이트할 수 있습니다.