버전 관리(Version Control)
버전이란?
버전이란 사전적 의미로 "어떤 프로그램을 수정, 개선하여 완성한 것. 새로워질 때마다 번호를 늘려 나감"으로 정의되어 있다.
버전은 흔히 애플리케이션을 설치 또는 업데이트할 때 새로운 기능과 함께 버전이 같이 명시되어 있는 것을 쉽게 볼 수 있다.(ex. 10.0.0)
버전 관리의 필요성
버전 관리의 필요성은 보고서를 작성하는 것으로 예를 들 수 있다.
보고서는 작성 후 끝나는 것이 아닌 컨펌을 통해 수많은 수정을 거치고 최종 완성본이 만들어진다.
수 많은 수정 중 이전 파일로 다시 되돌리거나 이전이 아닌 수많은 수정 후 처음 작성했던 파일로 되돌려야 하는 경우가 발생할 수 있다. 여기서 만약 파일을 복사하지 않고 원본 파일에 수정을 하였다면 어떤 상황이 발생할까?
이러한 점이 버전 관리의 필요성이다. 많은 사람들은 위와 같은 문제를 방지하기 위해 수정을 할 때에는 거의 대부분 파일을 복사하여 수정을 할 것이다. 여기서 복사를 한다는 것 자체가 버전을 나눈다는 것과 동일하다. 하지만 복사하는 방식으로 버전을 나누게 된다면 위의 그림과 같은 문제가 발생할 것이다.
프로그램을 개발할 때에도 보고서 작성과 동일하게 많은 기능(내용)이 추가되고, 수많은 코드가 변경된다. 이 과정에서 언제든지 이전 상태(안정된 상태)로 돌아갈 수 있는 코드의 복귀(포인트) 지점이 필요한데 보고서 파일처럼 하나 하나씩 복사하여 코드들을 관리하기에는 어려움이 많다. 이때 필요한 것이 버전 관리 시스템이다.
버전 관리 시스템 (VCS, Version Control System)이란?
코드의 변화를 관리하고 추적하는 소프트웨어를 버전 관리 시스템이라 한다.
최초의 버전 관리 시스템은 SCCS로 1970년대 마크 로치킨드(Marc J. Rochkind)에 의해 개발되었으며, 유닉스 환경에서 사용 가능하다.
현재 사용하는 버전 관리 시스템은 크게 집중형과 분산형으로 구분할 수 있다.
집중형 버전 관리 시스템
하나의 메인 중앙 서버의 저장소에서 모든 소스 코드를 통합적으로 관리하며, 클라이언트-서버 모델이라고도 한다.
한 곳의 저장소에서 통합적으로 관리하기 때문에 운영하기 수월하다는 장점을 가지고 있지만, 서버에 문제가 생길 경우 모든 개발자가 접근할 수 없다는 치명적인 단점을 가지고 있다.
또한 동시에 여러 클라이언트가 접근하여 수정을 하려고 하면 충돌이 발생한다. 이러한 점은 잠금 모델을 적용하여 누군가 수정을 하고 있다면 다른 사용자는 수정을 못하도록 막을 수 있지만 이 또한 여러 명의 클라이언트가 수정하려면 차례대로 순서를 기다려야 한다는 단점이 있다.
대표적인 집중형 버전 관리 시스템으로는 SCCS, RCS, CVS, 서브버전 등이 있다.
분산형 버전 관리 시스템
집중형 버전 관리 시스템처럼 한 곳의 저장소가 아닌 여러 개의 저장소를 두어 저장소에는 각 버전별 소스를 개별 보관한다.
분산 저장소는 P2P(Peer to Peer) 방식으로 공유하며, 각 클라이언트에게 공유 가능한 저장소 사본을 제공하며 서버는 각 저장소 자료를 동기화하고 중개하는 역할만 한다.
즉, 모든 클라이언트는 저장소를 가지고 있고, 한 번 저장소를 받아온 이후에는 서버를 통해 개발작업을 하는 것이 아닌 자신의 로컬 환경에서 진행할 수 있게 된다.
대표적인 분산형 버전 관리 시스템으로는 Git, 머큐리얼, 비트키퍼 등이 있다.
깃(git)
git이란?
git은 리눅스의 개발자인 리누스 베네딕트 토르발스(Linus Benedict Torvalds)에 의해 개발된 대표적인 분산형 버전 관리 시스템이다.
git 특징
백업
깃은 자신의 로컬 컴퓨터에서 독리적으로 소스의 버전 관리를 할 수 있다. 여기서 독립적이라는 것은 로컬 컴퓨터에서 자체적으로 버전을 기록하고 관리할 수 있는 시스템을 의미한다.
또한 깃을 사용하면 로컬 컴퓨터의 저장소를 동기화하여 원격 저장소에 백업할 수 있다. 따라서 로컬 컴퓨터에 문제가 생겼을 경우 또는 다른 공간에서 작업을 해야 할 경우 수월하게 대처할 수 있다.
협업
깃은 집중형 버전 관리 시스템과는 달리 각자의 로컬 환경에서 작업이 이루어진다.
만약 코드 공유가 필요한 상황이라면 네트워크를 통해 코드 공유를 보다 쉽게 할 수 있으며, 변경된 모든 이력(수정자, 수정내용 등)이 모두 저장되기 때문에 협업에 도움이 된다.
또한 깃은 하나의 소스 코드를 여러 가지 브랜치(독립된 작업 공간)로 분기하여 독립된 기능을 구현할 수 있으며, 기능 구현이 완료된 경우 각 브랜치를 하나로 병합할 수 있다. 이때 깃에서는 다양한 병합 알고리즘을 제공하기 때문에 소스 코드의 충돌을 최소화하고 최종 코드를 쉽게 유지할 수 있다.
📚Reference