소프트웨어 개발을 하면서 소스코드를 관리하는 일은 매우 중요하다. 다수의 개발자들이 하나의 소스코드에 기능추가를 하며, 기존 소스코드를 유지보수하는 환경은 이제 일반적이다. 이러한 환경에서 소스코드 관리할 수 있도록 도와주는 소프트웨어의 역할은 매우 중요하다.
버전관리시스템(VCS; Version Control System), 소스코드관리(SCM; Source Code Management) 소프트웨어는 이런 소스코드의 효율적인 관리를 도와주는 소프트웨어다. CVS, Subversion(SVN), Git, Mercurial 같은 소프트웨어가 버전관리시스템 소프트웨어의 대표적인 예다.
버전관리의 필요성
소프트웨어를 개발을 통해 수익을 발생시키는 회사의 핵심 자산은 소프트웨어의 소스코드다. 따라서 소스코드를 잘 관리할 수 있는 도구가 필요하다. 잘 관리한다는 것은 적절한 백업으로 PC나 서버, 디스크 등의 고장에도 소스코드가 유실되지 않도록 하는 것뿐만아니라 버그 수정을 위한 히스토리를 관리하는 것도 포함한다.
버전관리 시스템의 주요 기능은 다음과 같다.
1. 코드 공유
2. 변경 기록
3. 버전 관리
4. 접근 제한
5. Branch
1. 코드 공유
소프트웨어의 규모가 일정 수준 이상으로 커지면 여러 개발자들이 협업을 하며 개발을 진행하게 된다. 이 때, 다수의 개발자들은 소프트웨어의 서로 다른 모듈을 개발하게 될 것이다. 각각 독립적으로 개발을 진행하고, 구현이 완료되면 팀원들의 개발 PC에 완료된 코드 수정 사항을 반영해야한다. 이런 동작을 자동화하여 여러 개발자들이 같은 코드 베이스에서 일을 할 수 있도록 도와주는 일을 버전관리시스템이 도와준다.
2. 수정이력관리
소스코드에 수정이 발생했을 때, 수정사항이 어떤 작업을 위함이었는지를 기록하는 일은 매우 중요하다. 소스코드를 보다가 의문스러운 부분이 있을 때, 수정 이력(History)을 읽어보면 납득이 가는 경우가 많이 있다. 이런 수정이력을 유지하지 않거나 이력을 쉽게 볼 수 없다면, 소스코드는 의문 투성이가 될 것이다. 누가 소스코드에 어떤 부분을 고쳤는지 관리해주는 기능이 제공된다.
3. 버전 관리
2번의 수정이력관리와 연결되는 사항이다. 소스코드에 이뤄진 수정사항을 리비전 같은 번호로 추적을 하고, 특정 리비전 상태로 소스코드를 돌아갈 수 있어야 한다. 일련의 기능개발을 하거나 버그 수정을 하다가 초기 분석이 잘 못 되었을 경우 그 동안 했던 작업을 돌려야 할 때가 있다. 이 경우 개발자의 기억에 의존하다가는 소스코드의 일부가 수정이 안되어 버그가 발생할 가능성이 있다.
따라서 연관된 수정 사항을 하나의 커밋(Commit)이라는 단위로 묶어서 리비전이나 태그로 관리를 하고, 특정 리비전 혹은 태그로 소스코드를 빠르고 안전하게 돌릴 수 있어야 한다.
4. 접근제한
소프트웨어를 개발하는 개발자들이 소스코드에 대해서 모두 같은 수준의 권한을 갖지는 않는다. 일부 개발자는 자신이 담당하는 모듈에 대한 접근 권한만 가지고 있다던가, 다른 모듈에 대해서는 읽기 권한만 부여받고 있어서 수정을 할 수 없다던가 이런 제약 조건을 줄 수 있다.
5. Branch
Branch 기능을 이용하여 기존 프로젝트에 영향을 최소화하면서 새로운 부분을 개발할 수 있는 기능이 제공되어야 한다. 소프트웨어의 베이스 코드(Base Code)에서 기능 개발을 위한 Branch를 만들고, Branch에 작업한 내용을 다시 Base Code로 쉽게 병합(merge) 시킬수 있어야 한다.
또 한, 제품의 릴리즈 버전마다 다른 브랜치(Branch)를 두어서 코드를 관리할 수도 있으며, 릴리즈 버전에 따른 패치를 만들고 관리하기 쉽게 만들어주기도 한다.
소프트웨어 개발에 있어서 버전관리 시스템은 반드시 필요한 소프트웨어는 아니다. 버전관리 시스템이 없어도 드랍박스나 구글 클라우드에 하루 한번씩 소스코드를 업로드하는 원시적인 방법으로도 소스코드 관리가 가능할 수도 있다. (특히 소규모 프로젝트의 경우)
하지만 오픈소스로 전세계 개발자가 협업을 하며, 팀 단위로 개발하는 일이 일반적이게 된 요즘 버전관리 소프트웨어를 알아두면 분명 도움이 될 것이며, 잘 쓰면 생산성을 매우 향상 시킬수 있다.