원문: About Version Control
번역자: 박성국

형상 관리(Version Control)란 무엇인가

형상 관리(version control)이란 무엇이며 이것을 왜 신경 써야 하는가? 형상 관리는 파일이나 파일의 집합의 변경 내역을 기록하여 나중에 특정 버전을 불러올(recall) 수 있도록 하는 시스템이다. 이 책(『Pro Git』)을 예로 들자면, 독자는 소프트웨어의 소스 코드를 일종의 파일로서 형상 관리할 것이다. 실제로는, 컴퓨터 상의 어떤 파일이라도 형상 관리할 수 있다.

만약 당신이 그래픽이나 웹 디자이너라고 한다면 어떤 이미지나 레이아웃의 모든 버전(version)을 보관하길 원할 것이다. 형상 관리 시스템(Version Control System, 이하 VCS)은 이 목적에 걸맞는 도구이다. VCS는 특정 파일을 이전 상태로 되돌릴 수 있게 해주고, 전체 프로젝트를 이전 상태로 되돌릴 수 있게 해주며, 시간에 따른 변경 내역을 비교할 수 있게 해주고, 문제가 된 부분을 누가 마지막으로 변경했는지 확인하게 해주며, 누가 특정 이슈를 발생시켰는지 등의 기능을 모두 지원한다. VCS를 사용한다는 것은 일반적으로 당신이 뭔가를 망치거나 파일을 잃어버렸을 때에도 이를 쉽게 복구할 수 있다는 것을 의미한다. 게다가, 당신은 이 모든 것을 별다른 오버헤드(overhead) 없이 할 수 있다.

지역 형상 관리 시스템 (Local Version Control Systems)

일반인들의 형상 관리 방법은 그저 파일을 특정 디렉토리로 옮겨놓는 것이다. 조금 더 똑똑한 사람들이라면 시간별로 명명된 디렉토리에 파일들을 옮겨놓을 것이다. 이러한 형상 관리 방법은 아주 단순하지만 추후 문제를 발생시킬 소지가 크다(error prone). 어떤 디렉토리에 어떤 파일을 보관했는지 잊기 쉬우며, 파일을 옮기는 과정에서 의도치 않게 특정 파일에 덮어씌울 수도 있다.

이러한 이슈를 해결하기 위해, 프로그래머들은 예전부터 지역 VCS를 개발했다. 이는 간단한 데이터베이스의 형태로서 파일들의 모든 수정 내역을 보관하는 VCS이다.

Local
그림 1. 지역 형상 관리.

꽤 알려진 VCS 도구는 RCS라는 VCS이다. RCS는 현재에도 많은 컴퓨터들에 보급되어 있다. RCS는 파일들의 차이(differences)에 해당하는 패치 셋(pach sets)을 디스크에서 특별한 포맷으로 보관하는 방식으로 동작한다. RCS에서는 어떤 파일이든, 어떤 상태에서나 패치 셋을 추가하는 식으로 복구될 수 있다.

중앙 형상 관리 시스템 (Centralized Version Control Systems)

사람들이 겪는 또 다른 문제는 그들이 다른 시스템을 사용하는 개발자들과 함께 개발을 해야 한다는 점에 있다. 이 문제를 해결하기 위해, 중앙 형상 관리 시스템(Centralized Version Control Systems, 이하 CVCS)가 개발되었다. CVS, Subversion, Perfoce 등의 CVCS는 단일 서버를 갖고 해당 서버는 모든 버전의 파일들을 포함하며, 복수의 클라이언트들이 이 중앙 서버에서 파일의 유효성을 점검받게 된다. 여러 해 동안, CVCS는 형상 관리의 표준으로서의 지위를 지켜왔다.

Centralized
그림 2. 중앙 형상 관리.

CVCS는 지역 VCS에 비해 많은 장점들을 가지고 있다. 예컨대, 모든 사람이 다른 사람이 무엇을 하는지에 대해 알게 된다. 관리자는 누가 무엇을 할 수 있는지에 대해 세세히 관리할 수 있으며, 이 관리는 지역 VCS에 비해 훨씬 쉽다.

그러나, 이 구조는 단점 또한 가지고 있다. 가장 큰 단점은 중앙화된 서버에 있다. 만약 서버가 한 시간 동안 다운된다고 가정할 때, 어느 누구도 협업 자체를 할 수가 없거나 버전으로 관리되어야 하는 변경을 저장할 수가 없다. 만약 중앙 데이터베이스의 하드 디스크가 손상되고 누구도 이에 대한 백업을 가지고 있지 않으면, 사용자는 말 그대로 모든 데이터를 잃어버리게 된다. 이는 곧 프로젝트의 기록 전체를 잃어버리는 것을 뜻하며, 남는 것은 각 로컬 머신에 포함된 단일한 스냅샷(snapshot)들일 뿐이다. 지역 VCS 역시 같은 문제를 공유하며, 한 지점에서 모든 프로젝트의 기록을 잃어버리면 역시 모든 데이터를 잃어버릴 위험이 있다.

분산 형상 관리 시스템 (Distributed Version Control Systems)

분산 형상 관리 시스템(DVCS)는 바로 이 지점에서 등장했다. Git, Mercurial, Bazaar, 또는 Darcs와 같은 DVCS에서 클라이언트는 파일들의 최신 스냅샷에 체크 아웃(check out)하는 것이 아니다. DVCS에서는 대신, 프로젝트의 모든 기록을 포함한 저장소 전체를 거울처럼 전달받는다. 이에 따라, 만약 모든 시스템들과 서버를 통해 협업하는 상태에서 서버가 죽더라도, 각 클라이언트 저장소는 서버의 복제본(clone)으로서 이를 복구할 수 있다. 모든 복제본들은 말 그대로 모든 데이터를 백업해두는 것이다.

Distributed
그림 3. 분산 형상 관리.

게다가, 이러한 DVCS 방식의 시스템들은 복수의 원격 저장소들을 관리하는데 강점을 가지고 있기 때문에 각기 다른 집단의 개발자들과 동시에 개발하는 것도 가능하다. 이는 CVCS에서는 불가능했던 워크플로우(workflow), 예컨대 계층적 모델(hierarchical model) 형태의 워크플로우를 가능하게 한다.

<끝>