본문 바로가기

Date Enginnering/Git & GitHub

[Git] VCS? CVCS? DVCS?

개발이나 데이터 관련 공부를 하는 사람들이나 직군에 있는 사람들이라면 너무나도 자주 사용하는 소프트웨어가 있습니다. 바로 Git!

Git은 우리가 자주 사용하는 대표적인 버전 관리 시스템(Version Control System)입니다. Git과 같은 소프트웨어들을 VCS라고 하는데 VCS 종류에는 어떤 것들이 있는지 어떤 역할을 하는지 다뤄보고자 합니다. (또는 소프트웨어 형상 관리(SCM, Software Configuation Management)라고도 불리기도 합니다.)


VCS(Version Control System)이란?

먼저, Git의 공식 문서에서는 VCS를 '파일 변화를 시간에 따라 기록했다가 나중에 특정 시점의 버전을 다시 꺼내올 수 있는 시스템'이라고 정의하고 있습니다. 이렇게 이야기하면 '그래서 그게 뭔데?'라고 생각이 드는 사람도 있을 것입니다. 예시를 통해서 VCS가 고안된 이유를 생각해보도록 합시다.

 

우선, 파일들의 버전을 관리하는 가장 간단한 방법은 아래의 이미지처럼 각각의 버전들의 복사본을 하나의 디렉터리에 보관하는 것입니다.

그림 1. 복사본을 이용한 버전 관리....?

우리에게 익숙한 방법이고 많은 사람들이 파일의 복사본을 이용한 방법으로 파일들을 관리하는 경우가 많습니다.

하지만 이런 방법을 사용하면 발생하는 여러 가지 문제점들이 있습니다.

  • 파일의 버전이 어디서 파생되었는지 알기가 쉽지 않다.
  • 실수로 파일을 삭제할 수도 있고 다른 파일에 덮어 씌우는 경우도 발생할 수 있다.
  • 어떤 파일이 진짜 최종 파일인지 판단하기 힘들다.
  • 파일이 많아지면 용량을 많이 차지한다.

등등.... 혼자서 Toy Project를 한다면 모를까..... 협업이나 회사에서 업무를 보는 경우에 위의 방법대로 파일들을 관리한다면 그곳이 바로 헬게이트가 될 것입니다.

 

이러한 문제점들을 보완하기 위해서 나온 것이 로컬 버전 관리 시스템(Local VCS, Local Version Control System)입니다.

로컬 버전 관리 시스템(Local VCS, Local Version Control System)이란?

그림 2. 로컬 버전 관리 시스템, Local VCS

로컬 버전 관리 시스템은 로컬 컴퓨터 안에 간단한 데이터베이스를 사용해서 파일의 버전을 관리하는 시스템입니다.

유명한 로컬 버전 관리 시스템 중에서는 RCS(Revision Control System)가 있습니다. RCS는 기본적으로 Patch Set(파일에서 변경되는 부분)을 관리하는데 Patch Set은 특별한 형식으로 저장됩니다. 그리고 일련의 Patch Set을 적용해서 모든 파일을 특정 시점으로 되돌릴 수 있습니다. 예를 들어 위의 이미지에서 현재 Version 3에 있는 File을 Version 5로 바꿔야 한다면 다음과 같은 연산을 수행하게 됩니다.

Version 3 -> Version 2 -> Version 1 -> Version 4 -> Version 5 

이름에서 알 수 있듯이 로컬 버전 관리 시스템은 로컬에서만 작동합니다. 다른 개발자와 협업을 할 때에는 버전 관리가 쉽지 않다는 단점이 있습니다. 그래서 고안된 방법이 중앙 집중식 버전 관리 시스템(CVCS, Centralized Version Control System)입니다.

중앙 집중식 버전 관리 시스템(CVCS, Centralized Version Control System)이란?

그림 3. 중앙 집중식 버전 관리 시스템, CVCS

CVCS는 그림에 나와있는 것처럼 중앙 서버에 데이터베이스가 존재하고, 클라이언트들은 작업을 진행할 때 서버에서 파일을 받은 뒤 수정하여 다시 서버에 올리는 방식입니다. 이 과정에서 클라이언트들은 특정 버전의 파일들을 가져올 수 있다는 장점도 있습니다.

 

이처럼 파일이 한 곳에 존재하기 때문에 관리자도 서버의 파일만 관리하면 되기 때문에 관리하기 용이합니다.

하지만 이것은 장점과 동시에 단점이기도 합니다.

 

CVCS는 중앙 서버라는 하나의 서버에서 모든 파일들을 관리하기 때문에 네트워크에 문제가 생길 경우 클라이언트들은 파일을 받지도 올리지도 못하는 상황에 놓이게 됩니다. 또한, 서버에 문제가 생겨서 파일들이 모두 삭제되는 불상사가 일어난다면 복구할 수 없습니다. 그리고 클라이언트 한 명이 파일을 잘 못 수정해서 서버에 올라가게 된다면 다른 클라이언트들에게도 안 좋은 영향을 줄 수 있습니다.

 

이러한 단점들을 해결하기 위해서 고안된 것이 분산형 버전 관리 시스템(DVCS, Distributed Version Control System)입니다.

분산형 버전 관리 시스템(DVCS, Distributed Version Control System)이란?

그림 4. 분산형 버전 관리 시스템, DVCS

DVCS는 Git이 사용하고 있는 방식으로 파일들이 원격 저장소(서버, e.g. GitHub)와 클라이언트들의 각 로컬 컴퓨터에 분산되어 저장됩니다.

 

우선, 클라이언트들의 로컬 컴퓨터에서 파일들을 1차적으로 저장하고, Github과 같은 원격 저장소에도 저장할 수 있습니다. 그림처럼 모든 파일들이 분산되어 저장되기 때문에 파일들이 삭제되는 일이 발생하더라도 다른 쪽(원격 저장소나 다른 클라이언트)에서 가져올 수 있기 때문에 쉽게 복구가 가능합니다.

그리고 각각의 클라이언트들마다 전체 파일들을 가지고 있으니 다양한 방법으로 협업을 시도할 수 있습니다.

 

그림 4를 좀 더 자세히 살펴보면 아래와 같습니다.

그림 5. 분산형 버전 관리 시스템, DVCS

분산형 버전 관리 시스템은 서버가 죽거나 오프라인 상태에서도 버전 관리를 할 수 있고, 대부분의 버전 관리가 로컬에서 이루어지므로 속도도 빠릅니다.

그리고 파일을 수정하는 과정에서 실수를 하더라도 원격 저장소에 올리기 전이라면 다른 클라이언트들에게는 영향을 주지 않습니다.(Git은 버전을 돌릴 수 있는 기능이 존재하기에 원격 저장소에 실수로 올리더라도 복구할 수 있습니다.) 다만, 조금 복잡하고 동기화 관련 이슈가 있다는 단점도 존재합니다.

이러한 분산형 버전 관리 시스템으로는 대표적으로 Git이 존재하고, Mecurial, Bazaar 등이 있습니다.

'Date Enginnering > Git & GitHub' 카테고리의 다른 글

GitHub Actions로 AWS Lambda Deploy (2)  (0) 2023.08.24
GitHub Actions로 AWS Lambda Deploy (1)  (0) 2023.08.18