Sorry Architecture

Version Control System

Quill. 2019. 3. 28. 00:40

버전 관리(Version Control)[각주:1]는 문서, 프로그램, 웹 페이지 등 어떠한 형태의 정보 집합이든지 그 변화를 기록하고 관리하는 것을 뜻한다. 이렇게 변화의 내용을 관리하면, 결과물의 편집본과 최종본을 쉽게 관리할 수 있으며, 여러 사람이 함께 공동으로 작업할 수 있게 해준다.
 
아마도 대부분의 사람들이 파일(File)의 이름을 바꿔가면서 이력관리 해본 경험이 있을 것이다. 이 방법이 가장 직관적이며 쉽게 떠올 릴 수 있는 방법이기 때문이다. 그러나 회사에서 여러 사람들과 공동의 작업을 진행하는 경우에도 같은 방법을 사용하게 되면 많은 불편함을 겪게 된다. 누가 작업하고 있는 것이 최종인지 확인이 어렵기 때문이다. 취합본이라는 메일을 받아 본 기억을 떠올려 보자. 현재 자신이 작업 중인 문서와 메일로 받은 문서를 눈빠지게 비교해서 최종본을 만들어야 한다. 그리고 다른 동료들에게 취합결과를 다시 공유해 주어야 한다. 생각만해도 답답하고 불편하다. 그래서 File 이름을 바꿔가면서 문서(또는 code)를 관리하는 것은 헷갈리기 쉽고, 누가 변경했는지 추적하기 어렵다. 정리하자면, 버전 관리 체계란, 쉽게 말해서, "20160423_Project_워크샵_발표용_편집최종_최종본_진짜최종_끝.pdf" 같은 일이 발생하지 않도록 하는 것이며 이 과정을 쉽고 효율적으로 처리하도록 만들어주는 것이다.
다음은 버전 관리의 장점을 정리한 내용이다.

  • 품질의 일관성을 제공할 수 있다 (trunk, main)
  • 작업내용의 변화를 추적할 수 있다 (diff)
  • 작업진행 중 특정 상태의 결과물을 추출하여 최종본으로 제공할 수 있다 (tag)
  • 여러 작업자가 동시에 같은 과제에서 작업을 할 수 있다 (check out, branch, merge, commit)

Version Control Graph (https://www.atlassian.com/git/tutorials/comparing-workflows)

 

버전 관리 도구를 사용하면 작업결과물의 품질을 높일 수 있고, 협업이 쉽게 가능하며, 문제가 생겼을 때 이력을 추적하여 빠르게 수정할 수 있는 장점이 있다. 하지만 반대로, 사용자가 버전 관리의 목적을 제대로 이해하지 못하면 trunk freezing, tag commit 과 같은 웃지못할 현상이 발생하기도 한다. Trunk freezing을 처음 들은 것은 어느날 갑자기 소집한 회의에서였다. 개발자들이 검증 완료 전까지 main branch 또는 trunk를 건드리지 못하도록 정책적으로 막아야한다고 주장하면서 trunk freezing이라는 말을 썼다. 태그(Tag) 또는 라벨(Label) 기능을 쓰면 되는데,  굳이 모든 개발자들이 검증 기간 동안 아무 일도 못하게 해야하는 정책이 필요한지 의문이 들었다. 그러나 더욱 당황스러웠던 것은 주장에 대한 근거와 이유였다. Trunk freezing을 강력하게 주장하던 당시 책임자가 제시한 근거는 검증기간 중에 추가한 코드가 예측불가능한 부작용(Side effect)을 만들어 낼 수도 있으니 굳이 검증 기간에는 긁어부스럼 만들지 않는 것이 현명하다는 것이었다. 자신이 제시한 정책에 대해 매우 뿌듯해하고 당당해 했다. 그 분의 주장은 이해하겠으나 엉뚱한 방향으로 해법을 찾은 것이 안타까웠다. 그 분의 방법과 달리 태그나 라벨 혹은 배포용 브랜치(Release Branch)를 활용했다면 모든 개발자가 일을 멈추고 기다리지 않아도 됐을 것이다. 게다가 테스트 케이스(Test Case)를 습관처럼 잘 누적시켜왔다면 대부분의 문제들은 이미 단위검증 과정에서 걸러졌을 것이므로 부작용이 발생할 가능성이 줄어들었을 것이다. 또한 문제가 발생해도 진단과 수정이 쉽고 빨라졌을 것이다. 안타깝게도 그 과제 책임자는 버전 관리의 필요와 목적에 대해서 잘 몰랐던 것 같다. Tag commit이라는 단어를 들은 경험담은 너무 황당해서 그냥 생략하겠다.
 
다음은 주요 버전 관리 도구들의 특징을 간략하게 설명한 목록이다.
 
Git

  • Linux, Android 에서 사용중이며 대표적인 ditributed version control system (DVCS) 이다. [각주:2] [각주:3]
  • Snapshot 기반으로 동작하기 때문에, branch를 만들고 합치는 속도가 빠르다.

Perforce (p4)

  • 상용 distributed version control system 이다.
  • Version control의 많은 개념들을 잘 구현하였지만, 사용방법이 쉽지 않다.

Subversion (svn)

  • 무료이면서 기능이 뛰어나서 매우 많이 사용하였다.
  • Git이 보편화 된 후에는 사용량이 많이 줄어들었다.
  • 대표적인 centralized version control system (CVSC) 이다.

Concurrent Versions System (cvs)

  • 꽤 오래 되었다.
  • 이름이 csv랑 헷갈린다.

  1. a.k.a. Revision control or Source control [본문으로]
  2. Git [본문으로]
  3. GitHub Workflow [본문으로]