과 목::담당교수::학 과::학 번::이 름::목차□ 버전 컨트롤이란 무엇인가?□ 버전 컨트롤의 주요 기능□ Subversion 리눅스에 설치하기■ Subversion의 설치■ Subversion의 실질적 사용□ 마치며□ 출처□ 버전 컨트롤(버전 관리: Version Control)이란 무엇인가?버전 컨트롤을 이해하기 위해서는 소프트웨어 공학에서 이야기하는 형상관리를 먼저 이해해야 한다.형상관리란 하나의 프로젝트 내에서 벌어지는 변경과 제어를 관리하는 것을 일컫는데, 이것은 개발하는 소프트웨어의 품질, 유지보수의 편의성, 프로젝트의 진척도를 결정하는 데에 큰 부분을 차지하게 된다. 하지만 프로젝트가 점점 대규모화되고, 많은 수의 개발 인원이 참가하게 되면서 한 프로젝트의 변경과 제어가 곤란하게 되었다. 버전 컨트롤이란, 이러한 형상관리를 도와주는 도구로서, 수행 중인 프로젝트의 개발 소스의 변경과 제어를 파악하기 쉽고 참조하기 쉽도록 해준다.이는 다시 말하면, 형상관리 툴(버전 컨트롤)을 통하여 프로젝트 소스의 변경과 보호, 그리고 변경의 원인을 파악하고 적절히 변경하는 것을 쉽게 할 수 있다는 것을 뜻한다.이에 관해 국내 페가수스 출판사를 통해 시중에 나와있는 ‘소프트웨어 개발의 모든 것(전규현 저)’의 저자의 블로그에서는 프로그래머를 하수, 중수, 고수로 나누는 어떠한 기준이 있다면 그것은 하나의 소스를 계속 수정하며 프로그램을 작성하는 프로그래머는 하수, 소스를 백업하여, 원본 소스와 구분 지어 비교하며 작성하는 프로그래머는 중수, 그리고 버전 컨트롤(형상 관리 툴)을 활용하여 자신이 개발하는 프로그램의 소스코드를 관리하는 프로그래머는 고수라고 단정지을 수 있다고 제시해두었다.이렇듯 형상관리 툴(버전 컨트롤)을 사용한다는 것은 해당 프로젝트의 변경과 제어를 손쉽게 파악하고 잘못된 개발결과에 대한 원인파악과 수정이 쉽다는 것을 뜻한다.버전 컨트롤 툴의 종류와 특징이름특징CVS(Concurrent Versions System)서버와 클라이언트로 구성되어 다수령어를 순차적으로 입력하여, 디렉토리를 만들어 저장소로 설정하자.$su # home 디렉토리에 새로운 디렉토리를 생성하려면 슈퍼유저 권한이 필요하다.#mkdir /home/svn #슈퍼 유저 권한을 획득한 후, home에 svn이라는 디렉토리를 만든다.#chmod 777 /home/svn #svn디렉토리에 읽기 쓰기 접근 등 권한을 설정한다.#cd /home/svn #새로 만든 디렉토리에 접근한다.#svnadmin create –fs-type fsfs sample해당 명령어를 입력하면 sample이라는 디렉토리가 home/svn 디렉토리의 하위 디렉토리로새롭게 생성이 된다. 위의 명령어를 자세히 보자면, svnadmin create 명령어의 원형은 아래와 같다.#svnamin create [저장소로 지정할 경로] [파일 시스템]즉, 이전에 입력한 명령어는 저장소 경로를 지정하지 않고 해당 경로에 직접 접근해서 만들은 만큼 현재 경로에 svn 저장소를 만든다고 지정한 것이고, 뒤의 –fs-type fsfs는 –fs-type(파일시스템 지정 옵션)에서 fsfs라는 파일 시스템으로 지정한 것이다. 이외에 bdb(버클리 db)라는 파일 시스템이 있으나 많은 문제를 야기하는 것으로 알려져 있어 현재는 사용되지 않는다.Svn 1.2버전의 이후 버전부터는 위의 명령어를 간소화하여 svn create [저장소로 지정할 경로]로 간단하게 설정이 가능하다. (이때에는 기본 fsfs 파일 시스템으로 생성된다.)정상적으로 생성이 되었다면 새롭게 생성 된 sample 디렉토리 내부를 살펴보자.sample 디렉토리 내부에는 svn의 버전 정보와 설정 파일 등이 생성되어 있는 것을 알 수 있다.새롭게 생성된 sample 프로젝트의 접근 권한 설정을 수정해준다.#cd /home/svn/sample/conf #conf디렉토리내에는 프로젝트의 설정에 관한 정보들이 들어있다.#vi svnserve.confvi 편집기로 svnserve.conf 파일을 연다.이곳에는 계정의 유무에 따른 접근 권한 데에 있어 SVN 관리자가 꼭 서버에서 작업하리라는 보장이 없기 때문이다.즉, 서버를 타 회사나 집단에서 대여한 상태에서 SVN 서버를 자신의 집이나 회사에서 구성하는 상황 또한 배제할 수 없다는 이야기이다. 그래서 우리는 각 디렉토리의 의미와 더불어 로컬과 SVN을 활용한 네트워크 구성법 둘 모두를 알아야 한다.- 디렉토리의 구성trunk실질적으로 개발이 이루어지는 부분으로, 개발 소스와 디렉토리가 분포되어 있다. Svn 디렉토리 구조에서 가장 중심적인 역할을 하는 디렉토리이다.branches나무줄기의 뻗어나온 가지의 뜻을 지닌 이 디렉토리는 한 프로젝트 내에서 별도의 소규모 모듈 따위를 제작하는 프로젝트 내의 소규모 프로젝트 운영시 사용되는 디렉토리이다.tags0.10, 0.20 등 해당 소스의 변경과 제어에 따라 분류된 개발결과물을 발표한 뒤 버전별로 관리할 필요가 있을 때 해당 디렉토리를 사용한다.디렉토리 구성의 전체적인 형상을 보면, branches, trunk, tags라는 세개의 디렉토리로 구성된다는 것을 알 수 있다.■ 서버 로컬에서의 작업서버 로컬에서 디렉토리를 만드는 것은 일반 리눅스 호스트에서 mkdir을 활용해서 디렉토리를 구축하는 것과 같다.#mkdir /home/svn/sample/truck#mkdir /home/svn/sample/branches#mkdir /home/svn/sample/tags■ 외부에서 네트워크를 활용해 작업당연한 이야기이겠지만, 이 작업을 시작함에 있어 svn서버는 가동중이어야 한다.가동중인 svn서버에 외부 호스트에서 디렉토리를 만드는 명령은 다음과 같다.#svn mkdir svn://[서버의 ip주소]/svn/sample/trunk위의 명령어를 실행하면, 위에서 지정해놓은 svn편집기가 열리며 다음과 같은 편집 내용이 나타난다.---이 줄 이하는 자동으로 제거됩니다---Asvn://127.0.0.1/svn/sample/trunkSvn:// 뒤에 위치하는 127.0.0.1은 처음 명령어에서 적은 서버의 ip주. 이 소스를 import 하려면 다음과 같은 명령어를 Hello 디렉토리가 존재하는 부모 디렉토리에서 사용한다.#svn import Hello/ svn://127.0.0.1/sample/trunk이전에 svn내에서 소스파일을 직접 다루는 공간은 trunk라고 언급한 바있다.해당 명령어는 호스트의 현재 디렉토리에 위치하고 있는 Hello라는 디렉토리가 가지고 있는 소스파일을 svn의 trunk 디렉토리에 모두 업로드한다는 의미가 된다.하면 다시한번 로그를 편집하는 편집기가 열리게 되는 이번에는 해당 라인에 “NewProject”라고 로그를 기록해보자.그림과 같이 되었다면 정상적으로 업로드가 된 것이다.Trunk 내부를 확인해보면 다음과 같이 hello.c가 정상적으로 업로드 됐음을 확신 할 수 있다.Checkout체크 아웃은 말 그대로 서버에 업로드 되어 있는 소스 코드를 다운 받는 것이다.#svn checkout svn://[서버 ip 및 경로] [다운받을 호스트 경로]다음은 실행한 결과이다.눈 여겨 볼 것은 이미 동일한 이름의 파일이 존재하는 경우 해당하는 파일을 다운로드 받지 않는다는 것이다. 즉, 체크아웃은 호스트에 동일한 이름의 파일이 존재할 경우 해당 파일을 덮어씌우지 않고 그 외 존재하지 않는 파일만 다운로드 한다. 이런 기능은 타인이 작성한 소스만 자신이 현재 작성중이 소스코드와 연동시켜볼 때 상당히 편리한 기능을 제공할 것이다. 하지만, 만약 타인의 소스를 이미 받은 상태에서 또 다시 새롭게 갱신된 소스로 변경할 필요가 있을 경우에는 어떻게 해야할까? 그럴 때에 사용하기 위해서 업데이트라는 기능이 있다.UPDATE#svn update매우 간단한 명령어로 자신의 소스 파일과 업로드 된 파일을 검사하여 최신 파일로 덮어쓰기를 해준다.저 간단한 명령어는 svn up으로 다시 한번 간략화 될 수 있다.Commit이제는 자신이 새롭게 갱신한 파일을 업로드 할 차례다.hello.c 의 내용에 수정을 가해서 호스트의 소스파일을 서버의 그것보다 최신화 하여 직관적으로 알 수 있다. 여기서 명령어 부분을 지정하는데 주의할 점은 –r 옵션 뒤에 주는 정수는 자신의 값과 다음의 값을 비교한다는 것이다. 즉, -r 4는 4번째 수정된 소스와 5번째 수정된 소스의 내용을 비교한다.Dump소스의 내용은 시시각각 변하고 한곳에서 보관된다(서버) 그러나 만약 이 서버에 문제가 있거나, 혹은 누군가의 실수로 내부 내용이 크나큰 손상을 입었을 때 프로젝트는 더 이상 진행이 쉽지 않을 것이다. 때문에 프로젝트를 진행함에 있어서 백업의 중요성은 몇번이라도 부족함이 없다.Dump는 이 백업을 간단한 명령어로 수행할 수 있게 해준다.#Svnadmin dump sample > sample.dump반대로 백업한 데이터를 현재의 데이터에 덮어씌워 복구를 수행하는 명령어는#svnadmin load sample < sample.dumpBlame다수의 프로젝트 인원이 존재할 때, 해당 소스 파일을 수정한 사람이 누구인지 파악하기 위한 명령어 이다.#svn blame hello.c리비전 번호와 함께 우측에 계정 사용자가 나타남을 알 수 있다.소스별로 출력이 되는데 예제에서는 본인만 수정을 햇으므로 한명의 이름만 연달아 출력되어 있다.소스의 라인의 별로 사용자의 이름이 나타나있다는 것에 주목하자.약간의 응용 (버전 되돌리기)위의 보면 printf(“수정되었음요 ㅋn”);라고 추가된 소스 라인의 부분이 있다. 하지만 저 라인이 문제가 되어서 프로젝트가 통과되지 않는다면? 혹시 또 새롭게 추가한 부분에서 문제가 있어서 이전 버전으로 회귀할 이유가 있다면? 이럴 때에는 자신의 소스의 버전을 회귀해야 한다. 위를 살펴보면 대부분의 소스가 리비전 4의 버전을 가지고 있으나 문제가 되는 printf 함수의 경우만 리비전 5의 번호대를 가지고 있음을 알 수 있다. 그렇다! 리비전 4로 버전을 회귀하면 이러함 문제는 자동으로 해결이 될 것이다. 이에 다음과 같은 명령어를 한번 생각해보자.#svn update –r4 hello.c아주 훌륭하게 버전 컨트롤이 되었음6