git vs SVN, SVN vs git 어떤걸 사용해야 할까?

S/W 개발을 할때는 필수적인 유틸리티가 있습니다.  버전 관리 툴(Version control sysytem) 입니다.

새로 코드를 작성하든 기존에 만들어진 소스를 수정하든 간에 프로그래머는 소스의 과거 이력을 파악하거나 개발을 할때 현재까지 작업했던 내역의 보존을 필요로 합니다. 이때 사용하는 툴이 바로 버전 관리 툴입니다. 버전 관리 툴은 소프트웨어 산업이 시작되면서 존재해왔고 현재까지 많은 프로그래머들이 필수로 사용하는 개발 도구라고 볼 수 있습니다.

버전 관리툴은 현재 크게 두가지가 존재합니다. 제가 얼마전까지 사용했던 버전 관리 도구인 “SVN(Subversion)” 이 있고, 최근에 가장 많이 사용하고 대중화 된 버전 관리 도구인 “git” 이 있습니다. 

이들 버전 관리 도구들은 별도의 비용이 필요하지 않는 오픈소스 툴입니다. 누구나 무료로 사용할 수 있고 대다수의 프로그래머들이 이들 두개중 한개를 사용한다고 보면 됩니다. git의 경우에는 오픈소스의 아버지라고 불리는 “리누스 토발즈”가 직접 창시한 버전 관리 도구입니다. 그래서일까요? git은 github(깃허브) 와 gitlab(깃랩) 등의 웹 버전 관리 시스템을 가능하게 하고 많은 이들이 애용하는 중입니다.

그런데 여기서 선택의 고민이 생깁니다. 둘다 무료이고 누구나 사용 가능한 버전 관리 툴인데 어떤게 좀더 효율적이고 사용하기 편리할까요? 이 문제는 저같은 경우 2년전까지만 해도 판단하기가 꽤 어려웠으나 현재는 결론을 내려놓은 상태입니다. 

거기에 대한 결론은 잠시 뒤로 미루고, 이 둘중 어떤 버전 관리 도구를 사용하는게 괜찮을지 한번 비교해 보겠습니다.

SVN(Subversion) 은?

버전 관리 도구는 예전에도 존재했었습니다. 대표적인 관리도구가 CVS 가 있는데요, CVS 또한 오픈 소스 라이선스인 GNU와 GPL 기반으로 개발되고 배표된 버전 관리 도구입니다.

1990년 출시된 이후로 CVS의 한계가 두드러지게 되었습니다. 그래서 CVS의 한계를 보완하기 위해 SVN(Subversion) 이라는 버전 관리 툴이  2000년대 초반에 발표되었습니다.

SVN 로고

아파치 라이선스를 보유하고 있으며 오픈소스인 SVN은 출시 이후에 가장 대중적인 버전 관리 도구로 자리잡게 되었습니다. 소스의 저장소를 서버로 두고 작업하는 PC를 클라이언트로 연결하여 소프트웨어 개발시 소스의 수정과 변경사항을 관리할 수 있는 도구입니다. 작업 내역 커밋시 소스 변경 사항과 히스토리가 즉시 서버로 전송되고 저장이 되다 보니 관리가 용이하며 과거의 수정 내역과 히스토리 파악이 매우 용이해 집니다.

저도 5년전까지만 해도 SVN으로 버전 관리를 하였고 회사와 집에서도 SVN 클라이언트를 설치하는게  필수였던거 같습니다. SVN 클라이언트는 Windows에서는 TortoiseSVN 이라는 클라이언트를 설치하여 사용하였고, 리눅스에서는 svn client를 설치하여 사용하면 됩니다. 

리눅스의 경우에는 svn 클라이언트는 거의 디폴트로 설치가 되어 있습니다. 우분투 배포판을 설치하고 나서 svn  명령어만 입력하면 svn 클라이언트가 실행되는 것을 알 수 있습니다.

SVN 서버의 경우에도 설치와 구성이 그리 어렵지 않습니다. “svnserve”라는 SVN 서버를 설치하면 되는데요, 우분투의 경우에는 apt-get install 로 간단히 설치가 가능합니다. 그만큼 프로그래머들에게 필수적인 툴이기 때문에 리눅스 배포판에도 기본적으로 들어가 있는 편입니다. Windows에서도 물론 사용하기 간편하게 되어 있습니다.

SVN은 2010년대 초까지만 해도 “버전 관리 도구”의 정석이라 할 정도로 대중화 되어 있던 버전 관리 툴입니다. 저도 최근까지 SVN을 사용하였고 현재도 SVN 저장소를 직접 운영하고 있습니다. 그러나.. 시대의 변화는 어쩔수 없는 걸까요? 2010년대 초반 안드로이드의 출현 이후에 “버전 관리 도구”의 트랜드가 급속하게 바뀌게 됩니다.

혜성처럼 등장한 git(깃)

git(깃)은 사실 생각보다 세상이 나온지 꽤 오래 되었습니다. 2005년 리눅스 커널 개발자들과 리눅스의 창시자인 리누스 토발즈가 처음 출시를 했는데요, 다소 난해한 사용법 때문일까요? SVN의 아성을 쉽게 넘지 못하다가 2010년대 초반 안드로이드 대중화 이후에 본격적으로 프로그래머들의 이목을 끌기 시작했습니다.

그러나 git은 현재 전 세계 수많은 프로그래머들이 가장 많이 애용하는 버전 관리 도구로 자리를 잡는데 성공했습니다. SVN에 비해 기능이 워낙 다양하고 어렵다는 느낌이 들지만 강력한 분산 기능과 확장성은 프로그래머들이 git을 사용하게 만드는 결정적 요인이 됩니다. SVN이 가지고 있던 기본 틀인 클라이언트와 서버 간 버전 관리의 문제점을 git은 제대로 보완을 한 셈이지요. 

SVN은 반드시 리모트 서버를 두어야 하지만 git은 로컬, 클라이언트, 리모트 간의 종속성을 과감히 깨는 구조를 보여줍니다. 작업을 진행하는 로컬 자체가 서버가 될수 있고 클라이언트가 될 수 있으며 브렌치와 태그를 프로그래머 마음대로 로컬에서 커밋과 관리가 가능해졌습니다. 로컬도 서버가 될 수 있으며 서버도 로컬이 될 수 있습니다. 잠시 이해가 되지 않더라도 git을 사용해봤다면 충분히 무슨 의미인지 아실 겁니다.

이런 git의 특성은 SVN의 단점을 꽤 보완한 셈이 되었는데요, 그래서 일까요? git은 github(깃허브)와 gitlab(깃랩) 같은 대형 버전 관리 시스템의 탄생을 이끌어 냈습니다. 특히 github의 경우는 전세계의 수많은 프로그래머들의 단골 접속 사이트가 되고 있습니다.

git은 Windows, 리눅스, Mac 등 OS를 막론하고 어디에서든지 사용이 가능합니다. 오픈 소스 라이선스이며 누구나 무료로 사용할 수 있습니다. SVN과 마찬가지로 git은 대부분의 리눅스 배포판에 기본적으로 탑재가 되어 있다고 보면 됩니다.

현재는 SVN보다 git이 훨씬 인기있고 많이 사용하는 버전 관리 도구가 되었습니다. 물론 프로그래머의 성향에 따라서 git은 SVN에 비해 단점도 있을 수 있습니다.

 SVN vs git. 어떤것을 쓰는게 좋을까?

불과 5년전. 저는 SVN으로 버전 관리를 하고 있었습니다. 당시만 해도 회사에서도 SVN으로 버전 관리를 하고 있었고 SVN 외에는 다른 버전 관리 도구를 사용하지 않았지요. 

그러다 회사 동료의 제안으로 git 으로 버전 관리를 하게 되었는데요, 이때 저같은 경우는 상당히 거부감이 들었던거 같습니다. git의 명령어 자체가 SVN에 비해 복잡하고 불필요한 기능이 많다고 생각했기 때문이었습니다.

SVN은 원격 저장소로부터 클라이언트에서 checkout(체크아웃) 을 하고 체크아웃을 한 공간에서 열심히 코딩 혹은 수정을 한 이후에 검증이 완료되었다면 commit(커밋)만 하면 쉽게 SVN 저장소에 작업 내역이 저장되기 때문에 매우 편리했습니다. 당시만 해도 이 패턴에 매우 익숙해져 있던 상태였었죠. 

반면에 git은 원격 저장소에서 clone(클론) 하고 나서 작업이 끝난 후에 커밋만 하면 원격 저장소에 저장이 되는 구조가 아니었습니다. 커밋은 작업을 하던 로컬에서만 저장이 되는 거고 원격은 아무 변화가 없었던 것이었죠. 별도의 push 를 해야 원격 저장소에 저장이 되기 때문에 불필요한 작업이 추가된다고 생각되었습니다. 개발의 효율성도 떨어지고 번거롭다고 느끼기도 했습니다. git의 매력을 느끼기 전까지 말이지요 ㅎㅎ

위 그림은 SVN의 워크플로우를 도식화 한 그림입니다. SVN은 중앙 집중식으로 소스가 관리가 된다고 보시면 됩니다. 위의 그림에서 shated repository는 SVN 서버이고 여러명의 프로그래머들이 1개의 저장소에 접속하여 개발 작업을 수행합니다. 반면에 git은 이와는 약간 다릅니다.

git의 워크플로우를 도식화한 그림인데요, SVN과는 약간 다르죠? SVN이 1개의 저장소로 관리가 되고 있는 반면에 git은 저장소를 여러개 두는게 가능합니다. 메인 저장소를 따로 두고 소스만 공유하는 저장소를 두면서 프로그래머가 clone을 한 다음에 작업을 진행하고 나서 저장소 관리를 하는 매니저에게 수정 요청을 하는 구조로 개발이 진행되는 것이지요. 그런데 이렇게만 보면 git의 장점이 저장소를 분산하는 거 외에는 다른 장점이 딱히 보이지 않습니다.

저장소를 1개만 두는 것의 단점은 만약 저장소가 불의의 사고로 데이터가 소실되었을때 복구가 어렵다는 점입니다. 반면에 저장소를 여러개 두면 다른 저장소가 소실되어도 또 다른 저장소가 있기 때문에 데이터 복구에 매우 유리해 집니다. 그러나 이것만으로 git의 장점은 딱히 드러나지 않습니다. 

SVN과 git은 어떤 차이가 있을까요?

SVN 과 git의 비교

그렇다면 SVN과 git은 어떤 차이가 있는지 한번 살펴보겠습니다. 아래 표를 한번 볼까요?

  SVN git
사용법  간편하고 어렵지 않다.

다소 복잡하고 초보자가 이해하기 어렵다

기능  버전관리에 최적화된 간편한 기능  다양한 기능이 존재. 이런 기능이 있어?라고 할정도로 버전 관리에 필요한 모든 기능이 존재함.
프로세스 중앙 집중식 

분산 관리식

소스 충돌 위험 매우 높음 권한 설정을 통해 충돌 위험 감소
저장소 백업 여부 저장소 백업이 용이 하지 못함. git 저장소만 있으면 리모트 복구 언제든지 가능. 매우 용이
다수 작업 관리 관리에 한계가 존재 수백~수천의 프로그래머의 분산 작업에 매우 용이
작업 내용 복구  다소 불편함. 예전 리비전으로 복구가 매우 편리
브렌치 생성  다소 불편함. 로컬에서 브렌치 생성 및 태그 생성이 매우 편리하다. 

제가 생각하는 SVN과 git의 차이점입니다. git을 접하기 전 사용법이 간편하고 익숙한 SVN을 사용하던 저로선 git의 다소 복잡하고 난해한 커맨드와 옵션에 당황했었는데요, git은 사용법에 약간 복잡한 만큼 장점이 SVN에 비해 꽤 많다고 보시면 됩니다.

사실 SVN은 프로그래머 입장에서는 사용법이 간편하고 효율적인 것은 분명합니다. SVN 저장소에서 체크아웃만 한 다음에 수정 작업 후 커밋만 찍으면 자동적으로 저장소에 업데이트가 되기 때문이지요. 그렇지만 위의 표에서 언급한 것처럼 단점이 꽤 많습니다.

저장소가 1개이기 때문에 만약 저장소가 불의의 사고로 데이터가 소실되기라도 한다면 복구가 불가능합니다. 저장소 관리자가 주기적으로 SVN 저장소를 백업해줘야 하는 번거로움이 존재하지요. 반면에 git은 저장소건 로컬이건 간에 clone 만 하면 그 자체가 저장소 복구가 가능해집니다. 이 점은 git의 엄청난 장점중에 하나라고 볼 수 있습니다.

자신의 PC에서 git으로 작업한 파일들이 존재한다면 리모트의 git 저장소가 날라간다고 해도 이미 git 저장소의 소스들을 clone 한 다른 많은 사용자들이 있기 때문에 걱정하지 않아도 됩니다. 나 뿐만 아니라 개발을 공유하는 다른 사용자들이 git 브렌치를 이미 보유하고 있기 때문이지요. 리모트를 다시 만들고 나서 git 브렌치를 보유한 누군가가 push만 해주면 바로 복구가 완료됩니다. 

저는 사실 이 점 하나만으로도 git을 사용하는데에  매우 만족하고 있습니다. 내 PC에서 clone 한 git 브렌치 상에서 열심히 작업 후에 리모트에 올려놓기만 하면 됩니다. 물론 PC에서 작업한 내역을 굳이 리모트에 push 하지 않아도 됩니다. 제 PC인 로컬에서 무수히 커밋만 찍어도 상관없습니다. 열심히 작업해서 안정화 된 소프트웨어 소스라고 판단된 후에 한꺼번에 push를 하고 싶다면 그때 하면 되니깐요 ㅎㅎ

github와 gitlab은 이런 이유로 인해 급속도로 프로그래머들에 인기 버전 관리 솔루션이 되었습니다.  gitlab은 현재 국내의 IT 회사에서도 사내에서 많이 애용되는 분산 관리 시스템인데요, 히스토리 파악 뿐만 아니라 체계적인 개발 프로세스를 구축하는데에도 많은 도움이 되고 있습니다. 웹상에서 히스토리와 소스를 직접 볼 수 있는 것도 꽤나 매력적이지요.

현재 저같은 경우에는 gitlab을 개인 서버에 올려서 사용중에 있습니다. 그동안에 묵혀두었던 소스 파일들과 SVN 저장소들을 gitlab에 전환해서 올려놓고 관리중입니다. git은 그만큼 버전 관리에 많은 장점을 보유하고 있는 버전 관리 시스템이라고 보시면 됩니다. 

SVN의 한계와 단점을 보완한 git은 처음 접했을때와는 다른게 현재는 회사에서나 개인 프로젝트에도 애용중입니다. 이렇게 180도 생각이 변할줄은 몰랐지만 git을 사용하면 사용할 수록 버전관리에 매우 충실한 도구라고 판단이 되고 있습니다.

이 글의 서두에서 제가 SVN vs git 에 대한 결론을 이미 내려놓고 있다고 했었지요? 거기에 대한 답이 된듯 합니다. 그래서 기존에 관리하고 있던 SVN 저장소도 git 으로 변환하여 현재 사용중입니다.

SVN과 git중에서 어떤 버전 관리 도구를 사용할지 제게 질문을 한다면 전 당연히 git의 손을 들어주고 싶습니다. 리모트건 로컬이건 git 브렌치만 있으면 바로 버전 관리가 가능한 git을 쓰는게  훨씬 효율적일지도 모릅니다. 물론 git을 접하지 않았다면 다소 복잡하고 난해한 개념과 커맨드로 인해 머리가 아플수는 있습니다. 

이글을 보시는 여러분은 어떤 버전관리 툴을 선호하시나요? 전 git을 과감히 추천드립니다. 일단 써보면 그 매력을 금새 느낄 것입니다.

'코드도사(codedosa.com)'에는 쿠팡파트너스 등의 제휴링크가 포함되어 있으며 수수료를 제공받을 수 있습니다.