버전시스템

프로그래밍을 작성을 한다는 것은 컴퓨터 언어로 오랫동안 글을 작성하는 창작의 활동입니다. 또한 프로그래밍 코딩을 하는 과정에는 수많은 코드들을 테스트하고 정확한 동작 코드만을 필터링 하게 됩니다.

이러한 개발 작업등은 코드들의 지속적인 변화를 가지는 불안정한 상태와 안정한 상태를 반복하게 됩니다. 따라서, 안정된 상태의 코드와 불완전한 코드의 상태를 구별하여 관리하는 기술들은 소프트웨어 엔지니어에게 필수적인 소스관리 능력입니다.

버전이란?

버전이란 무엇일까요? 컴퓨터 응용 프로그램을 사용하면서 버전(version)이라는 단어는 많이 들어 보았을 것입니다. 아마도, 소프트웨어를 개발을 하지 않았거나, 버전관리 시스템을 모르는 사람의 경우 버전이라는 단어는 생소할 수도 있습니다.

윈도우 10, 한글 9.7 등 프로그램 이름 뒤에 붙어있는 숫자를 버전이라고 알고 있는 사람들이 대부분일 것입니다. 사전적인 의미로는 “이전의 것과 다른, 또는 약간 비슷한 것들” 이라고 설명하고 있습니다. 약간씩 변화되는 내용들을 구분하기 위해서 편리하게 구분하기 위해서 숫자를 많이 이용하는 것입니다. 버전은 숫자만 사용하지는 않습니다. 2016에디션, 2017에디션, 윈도우 XP, 맥OS 엘케피탄 처럼 년도나 다른 기호를 사용하기도 합니다.

프로그램 뒤에 있는 숫자나 기호는 버전이 맞습니다. 하지만 이러한 버전은 우리가 일반적인 사람들에게 알려지는 공식적인 버전 번호 입니다. 버전과 버전 사이에는 수많은 코드 변경들에 대한 서브 버전들이 있습니다. 1.0 버전과 2.0 버전 사이에는 1.01 , 1.02 , 1.03 과 같이 수많은 버전들이 있을 수 있습니다. 이러한 버전 외에도 중간의 버전을 빌드 번호 라고도 표현하기도 합니다.

버전의 숫자나 기호는 아무렇거나 붙이지 않습니다. 프로그램 소스코드의 어느정도 구별할 수 있는 의미 있는 변화가 있어야 합니다. 개발도중 바빠서 임시로 작업하다 중단 저장한 것을 버전이라고 말하지는 않습니다.

즉, 버전이란 코드의 의미 있는 변화들을 구별하기 위하여 명징한 것입니다.

버전기록

우리가 어릴 적 학습을 하면서 많이 듣는 말이 “공부에 왕도는 없다” 라는 이야기가 있습니다. 프로그램 코드 또한 한번에 모두 완성이 되는 것이 아닙니다. 한 단계씩 살을 붙여가면서 기능들은 추가되어 갑니다. 이러한 각각의 변화와 작업들이 시간이 진행 되면서 하나의 프로그램이 만들어 지게 됩니다.

프로그램을 개발을 하는 중에는 수많은 의미 있는 변화 또는 기능들이 추가됩니다. 또한 이러한 변화와 기능을 추가 하기 위해서는 개발자는 상당량의 테스트 코드를 추가 합니다. 코드들은 잠시 불안정한 상태가 됩니다. 정상적인 코드들이 동작을 확인하게 되면 코드들을 정리하여 안정된 코드를 생산하게 됩니다.

개발을 하는 과정에 이렇게 안정된 코드들을 기록하고 관리하는 것은 중요합니다. 만일 테스트하는 과정에 코드들이 불완전 하여 동작이 불가능 할 때, 이전의 상태로 돌아가 다시 시작할 수 있는 복원(포인트) 지점이 필요하기 때문입니다.

우리가 게임을 할 때도 끝까지 완주하기 위해서 각각의 스테이지를 클리어 할 때마다 저장을 해가면서 게임을 즐겼던 기억이 있었을 것입니다. 만일, 저장을 하지 않으면 처음부터 다시 시작을 해야 하기 때문이지요.

어떤 일을 하던 작업의 진행사항과 중간 점검이라는 기록을 하는 것은 매우 중요합니다. 프로그래밍의 경우 작성한 코드가 상당히 많기 때문에 아무리 뛰어난 사람이라도 이를 기록하지 않고는 알 수 없습니다.

고전적인 관리방법

여기서 특별히 변화와 기록을 하는 습관은 누구나 말을 하지 않아도 가지고 있습니다. 컴퓨터 워드작업은 대부분의 사람들이 한번은 접해본 컴퓨터 작업입니다. 업무보고서, 학교 리포트 등을 작성할 때 컴퓨터가 갑자기 꺼져서 작업한 내용이 날아간 적이 한번씩은 경험이 있을 것입니다. 이런 경험이 있는 사람들은 어느덧 자신도 모르게 작업 상태를 저장(Save)하는 습관이 있습니다.

작업의 상태들을 저장하는 것 또한 변화들을 기록하는 방법입니다. 한 개의 파일로 계속 덮어쓰게 저장이 되는 것입니다. 단지 변화를 지정하는 버전을 표시하지 않아 이전 중간 상태로는 돌아가지 못하는 점이 차이 일 것입니다.

문서 작업의 변화되는 상태를 구분하기 위해서는 파일의 이름을 이용하여 문서1.txt , 문서2.txt, 문서3.txt 형태로 작명을 하여 저장관리 하였을 것입니다. 이러한 “다른 이름 저장하기” 방식의 문서 버전은 각각의 파일들의 중복된 내용이 방해를 하기도 하고 수많은 파일의 이름으로 나중에는 쉽게 알아 보기 힘듭니다.

또한 문서들의 변화를 정리하기 위해서 목차 다음에 “history revision” 이라는 페이지도 가끔씩 보았을 것입니다. 이것 또한 문서의 작성자와 변경 내용 등을 체계적으로 관리하기 위한 고전적인 방법 중에 하나 일 것입니다.

우리는 이미 컴퓨터를 활용을 하면서 다양한 방법으로 버전을 기록하고 있습니다.

버전관리시스템

버전관리의 필요성과 고전적인 파일명 형태의 관리 시스템은 복잡하고 수많은 파일등으로 헷갈릴 수 있습니다. 그리고 프로그래밍 코드를 작성할 때는 일반 문서보다는 생각하지 못할 만큼의 복잡성이 있습니다.

이러한 각각의 변화들의 코드와 상태들을 파일명으로 관리하기에는 한계가 있습니다. 전문적으로 버전을 관리해 주는 전용 소프트웨어가 필요합니다.

이러한 전문 소프트웨어를 버전 컨트롤 시스템(version control system)이라고 말합니다. 또는 다른 명칭으로 버전관리, 형상관리, 소스관리로 불리기도 합니다.

컴퓨터 프로그래밍 개발환경에서는 이러한 버전 컨트롤 시스템(VCS)은 익숙합니다. 이미 오래전부터 다양한 종류의 전용 소프트웨어가 있으며, 많은 개발자들이 이러한 소프트웨어의 도움을 받아 프로젝트의 소스들을 관리하고 있습니다.

종류

현재 출시된 버전 컨트롤 시스템(VCS)을 정리해보면 크게 두개의 종류로 구분해 볼 수 있습니다.

  • 집중형
  • 분산형

버전 컨트롤 시스템(VCS)에서는 버전 파일들을 관리 저장하는 공간을 리포지토리(Repository)라고 표현 합니다.

집중형

집중형 시스템은 말 그대로 모든 소스가 한곳에 집중되어 있는 형태 입니다. 하나의 메인 중앙 서버를 두고 개발 구성원의 소스들을 관리 하는 것을 말합니다. 다른 말로는 클라이언트-서버 모델이라고도 합니다.

집중형 시스템은 한 개의 저장 리포지토리만 존재합니다. 집중형은 하나의 저장소를 중심으로 관리되기 때문에 시스템 운영적인 측면에서는 간단합니다. 단점으로는 중앙 저장공간인 서버에 문제가 발생하게 되는 경우 입니다. 서버 문제시 모든 개발자 및 소스들은 메인 저장소에 접근을 할 수 없기 때문에 심각한 문제에 봉착할 수 있습니다.

대표적으로 집중형 관리시스템은 다음과 같은 것들이 있습니다.

  • CVS (1986년)
  • 서브버전 (2000년)

위의 버전관리 소프트웨어는 무료버전으로 제공됩니다. 무료 버전 외에서도 다수의 상용 버전도 존재합니다.

CVS는 “concurrent Version System”의 약자입니다. 1986년 딕 그룬(Dick Grune)에 의해서 개발되었습니다.

[CVS 홈페이지]

CVS는 버전관리 시스템 중에서도 가장 오래된 제품입니다. http://www.nongnu.org/cvs/ 에 접속을 하면 보다 자세한 정보를 얻을 수 있습니다.

두번째로 대표적인 집중형 버전관리 시스템 서브버전은 2000년도에 콜렙넷 에서 개발된 소프트웨어 입니다. 하지만, 현재는 아파치 프로젝트로 개발이 유지되고 있습니다.

서브버전은 기존의 CVS의 단점들을 개선한 집중형 버전관리 시스템입니다. CVS와 호환성을 유지하면서 좀더 개선된 브렌치 작업을 수행할 수 있습니다.

[서브버전 홈페이지]

보다 자세한 것은 http://subversion.apache.org/ 에서 확인을 할 수 있습니다.

분산형

분산형 시스템은 집중형 시스템과 달리 저장소가 여러 개가 존재합니다. 여러 저장소에 각각의 버전소스들을 개별적으로 보관을 할 수 있습니다. 또한 서버는 각각의 저장소의 자료들을 동기화 하고 중개하기 위한 역할 만 수행을 합니다.

분산형은 메인 서버의 문제가 발생하더라도 지속적으로 개발을 하는데 문제가 발생하지 않습니다. 심지어 인터넷이 연결이 되지 않더라도 자신의 컴퓨터에 있는 로컬 저장소에서 개발을 이어 갈 수 있습니다. 향후에, 인터넷이 정상적으로 연결이 되면 자신의 코드와 서버의 내용을 동기화 하면 됩니다.

분산형은 여러 저장소에 소스들이 복제되어 저장되어 있습니다. 최악의 경우 소스코드를 분실할 수 있는 상태를 미연에 방지할 수도 있습니다.

대표적으로 분산형 관리시스템은 다음과 같은 것들이 있습니다:

  • 깃(git)
  • 머큐리얼

상용 제품으로는 다음과 같은 것들이 있습니다:

  • BitKeeper (1998년)

깃(Git)과 머큐리얼(Mercurial)은 우연히도 2005년 같은 시기에 만들어 졌습니다. 깃(Git)은 2005년 리누스 토발즈에 이해서 개발된 분산 모델의 버전관리 시스템 입니다.

머큐리얼은 2005년 매트맥컬(Matt Mackall)에 의해 개발된 분산모델의 버전관리 시스템 입니다. 머큐리얼의 특징은 파이썬 언어로 개발이 되었습니다. 또한 접두어로는 수은을 의미하느 hg를 사용합니다.

머큐리얼에 대한 자세한 정보는 https://www.mercurial-scm.org/ 에서 확인이 가능합니다.

[머큐리얼 홈페이지]

요즘에는 분산형 버전관리 시스템으로 깃(Git)이 더 인기를 끌고 있습니다.

정리

많은 사람들이 버전관리 시스템이 직접적으로 와 닫지 않는다는 말을 하는 개발자들이 많습니다. 이러한 표현은 당연합니다.

버전관리 시스템을 잘 사용을 하기 위해서는 기능을 잘 숙지하는 것도 필요하지만 지속적으로 버전관리 시스템을 사용하면서 몸으로 익혀야 하기 때문입니다. 군대에서 간단한 특정 기술도 머리로 생각하는 것보다 반복 숙달로 몸으로 익히는 것과 동일 하다고 볼 수 있습니다.

따라서 이곳에서 설명하는 버전관리 시스템에 대한 내용을 숙지한다고 해서 바로 능숙하게 사용을 하는 것은 힘들 수도 있습니다. 본 책을 옆에 두고 자신의 프로젝트에 어떻게 버전관리 시스템을 접목을 하면서 사용을 할지를 지속적으로 생각해야 합니다. 또한 그 행동과 작업을 반복을 해 야지만 버전관리 시스템이 익숙해 질 것입니다.

깃교과서

버전 관리 시스템의 이해와 설치부터 커밋, 브랜치, 임시 처리, 병합, 복귀, 서브모듈, 태그까지
깃, 소스트리, 깃허브로 실습하며 기본기를 탄탄하게 다진다!