레이블이 subversion인 게시물을 표시합니다. 모든 게시물 표시
레이블이 subversion인 게시물을 표시합니다. 모든 게시물 표시

2010년 5월 29일 토요일

SVN vs CVS

아는지 모르겠지만, SVN을 얻기 전에 우리 회사는 아주 오랫동안 CVS로 작업을 해왔다. 우리는 사용자나 개발자의 시점으로 CVS을 알고있다. 대략 같은 기준으로 우리는 SVN을 알게 되었다. 그리고 의심없이 다른분도 가졌을만한 의문을 공유하게 되었다. "어떤 것이 더 좋을까?"

 

의문을 가져도 좋은 것이, 이것이 SVN을 위한 IDE 플러그인 제작을 의뢰하는 수많은 사용자 요청으로부터 시작되었기 때문이다. 어쨌든 우리 의지는 SVN으로 작업을 시작하도록 무게를 두게 했다. 때문에 결과물은 SVN이 CVS가 가진 단점을 없앤 대체물 모양이 되었다. 불행히도, 우리가 보기에는 SVN은 CVS의 대체물이 아니고, CVS의 단점을 제거한 것도 아니었다. 더군다나, CVS에게 밀린다. 따져보면, CVS와 SVN의 C++과 자바로 비교될 수 있다. 분명히, CVS나 SVN은 소스세이프(SourceSafe)보다 강력하다. C++과 자바가 베이직(Basic)보다 강력한 것처럼. CVS는 소스 제어 시스템의 거의 모든 기능을 보여준다. 그렇다고 항상 편리하거나 기능적이지는 않다. SVN은 CVS의 일부 기능을 수정하고 확장했다. 간단히 중요한 몇몇 기능은 제외했다. 예를 들어 태그나 브랜치 중 무엇을 만드냐 정하는 건 쉽지 않은 문제이다. 그리고 당신이 편집하는 다른 파일과 구별하는데도 도움이 되지 않는다. 이 점은 자바 개발자가 해낸 점과 닮았다. 여러분이 포인터를 필요로 하지 않을 때 자바 개발자들이 나선다. 거기에는 연산자 오버로딩도 필요없다. 그리고 등등.

 

그러므로, 지금까지 보면 SVN은 CVS를 대신할 수 없다. SVN은 CVS와 닮은 다른 시스템이 다. 고유한 기능이 있고, 목적에 부합하는 기능을 제공한다. 이런 기능들은 특정 개발 환경에 더 적합하게 한다. 이를테면 파워빌더가 있다. 아래에서 이들 시스템의 장점과 단점을 비교한 걸 볼 수 있다. 다루지 않은 것은 두 시스템이 서로 유사하다고 판단된 것들이다. 녹색 배경은 장점이고, 핑크는 단점을 뜻한다. 선택의 갈림길에 처한다면, 둘다 써보면서 아래 설명들에 주의를 기울여보기를 권한다. 여러분은 Subversion 개발자와 Pushok 구성원간의 토론도 볼 수 있다.

 

주) 이 비교는 최종적인 것으로 볼 수 없다. 두 시스템은 여전히 개발중이기 때문이다. 마지막 갱신은 2005년 6월 19일에 CVS NT 2.5.01, SVN 1.2로 이뤄졌다.

 

 

# 비교 사항 CVS SVN
1 보관 형태

CVS는 RCS라는 버전 관리 파일 형태에 기초한다. CVS에 연결된 각 파일은 일부 추가 정보를 포함한다. 분명한 점은 이들 파일의 트리 구조는 로컬 디렉토리의 트리와 동일하다. 그러므로 CVS을 사용하여 데이터 손실에 집착할 필요가 없는 동시에, 필요하다면 RCS 파일을 직접 고칠 수 있다.

SVN 시초는 관계 데이터베이스(BerkleyDB) 혹은 이진 파일(FS_FS)의 집합이다. 그런 점에서, 여러 문제가 있고(이를테면 공유 파일 간의 동시 접근), 새로운 기능도 가능하게 한다(일례로 작업 수행을 위한 트랜잭션). 달리 보면 데이터 저장은 투명하지 않고, 결국 사용자에게 접근적이지 않다. 이 점은 회복 및 복구 기능이 제공되는 이유이기도 하다.

2 속도 CVS가 더 느리다.

전체적으로 몇몇 구조적인 솔루션으로 인해, SVN은 CVS보다 꽤 빠르다. 네트워크를 통해 더 적은 정보를 전송하고 오프라인 상태에서 더 많은 작업을 지원한다. 동전의 양면과 같다. 속도 향상은 당신의 컴퓨터에 모든 작업 파일의 백업을 저장해 얻어진다.

3 태그와 브랜치(중요!) 우리 판단에, 적절하게 구현되었다.

SVN 개발자는 태그와 브랜치로 작업하는 세 가지 사항을 소신있게 제거했다. 실제로 이것은 복사한 파일을 다룰 수 있다거나 변경 기록을 저장한 보관소의 디렉토리라는 두 개념을 대체한다는 걸 의미한다. 태그나 브랜치를 만드는 건 보관소에 복사하는 것으로 대체될 수 있다. SVN 개발자 시각에서, 이것은 훌륭한 결정이며, 작업을 간단하게 해주었다. 그러나, 우리는 동의하지 않는다. 브랜치만 보면, 그렇게 나쁜 건 아니다. 이제 브랜치는 없어지고 대신 보관소에는 폴더들이 나뉘어 있다. 그것들은 서로 연결 관계가 있다. 태그를 보면, 더 나쁘다. 당신은 코드를 나눌 수 없다. 이 기능은 없어졌다. 확실히, 몇몇 확장 사항은 SVN의 파일 전체에 고유한 숫자를 매겨서 얻어진다. 그래서 모든 보관소가 버전 번호를 가지나, 각 파일들은 그렇지 않다. 어쨌든 우리는 당신이 의미있는 태그 대신 4자리 숫자로 저장되는 게 그리 편하지는 않다는 걸 무시하지 않을거라 생각한다.

4 메타 데이터

CVS는 단지 파일만 저장한다.

SVN은 파일에 이름지어진 속성을 몇 개든 관계없이 덧붙이는 걸 지원한다.매우 뛰어난 기능이지만, 정말 필요한 기능인지는 판단하기 힘들다.

5 파일 형식

CVS는 원래 문자 형식의 자료 보관을 위해 만들어졌다. 그리하여 서버나 클라이언트를 변경할 때 다른 파일(이진 파일, 유니코드) 저장이 구분되지 않고, 특별한 정보를 필요로 한다.

SVN은 모든 파일 형태를 조정하며, 당신의 명령을 요구하지 않는다.

6 롤백

CVS는 시간이 좀 걸리더라도 보관소에 있는 어떠한 커밋도 롤백한다(각각의 파일은 독립적으로 처리된다)

SVN은 커밋에 대한 롤백을 지원하지 않는다. 우리 제안은 최근의 올바른 보관소 상태를 잘못된 커밋을 덮어 쓰기 위해 복사해두라는 것이다. 어쨌거나 잘못된 커밋은 보관소에 남아있다.

7 트랜잭션

CVS에서 "전부 아니면 전무"라는 원칙 하의 트랜잭션 지원은 완벽하게도 없다. 예를 들어, 몇몇 파일을 체크인했을 때(서버로 파일이 전송된다), 이들 중 일부만 완료할 수 있다면, 나머지는 그렇지 않을 수도 있다(충돌 등의 이유로 인해). 규칙에 따르면, 이런 상황을 복구하고 남은 파일을 위한 작업이 반복(모든 파일이 아닌)되는 것으로 충분하다. 그래서 파일들은 두 단계로 확인되어야 한다. 이 기능의 부재로 인한 보관소가 손상된 사례는 관찰되지 않았다.

SVN은 "전부 아니면 전무"라는 원칙 하에 트랜잭션을 지원한다. 이건 장점이 될 것 같다.

8 유용성

현재 CVS는 당신이 필요한 어디든지 지원된다.

SVN은 아직 널리 쓰이지 않으며, 그 결과 지원되지 않는 곳도 있다.
9 내부 구조 및 코드

CVS는 매우 오래된 시스템이다. 내부적으로 CVS는 RCS를 실행하는 스크립트 모음이다. 나중에 이것은 하나의 실행 파일로 모아졌다. 허나 코드의 내부 구조는 빈약하고 역사적으로 많은 수정을 거쳐왔다. 지금까지 처음부터 CVS를 다시 작성하려는 시도가 몇번 있었으나, 성공 사례는 알려지지 않았다. 우리는 개인적으로 클라이언트 코드를 풀어서 플러그인과 CVS간에 더 높은 결합도를 얻어보려 했으나 성공하지 못했다. 이제 우리는 CVS의 기능이 앞으로 더 향상되리라 생각하지 않는다.

서브버전 제작자는 내부 SVN 설계에 많은 시간을 들였다. 아직 그들이 내린 결정이 얼마나 좋을지는 모른다. 그러나 분명한 건 코드가 매우 확장성있고, 더 나은 향상이 오고 있다는 점이다.


총점

4

5

 

 

위키피디아의 CVS, SVN 번역 예정...

이 글은 스프링노트에서 작성되었습니다.

Subversion

아래는 서브버전 서비스를 등록하고 서비스를 해제하는 명령이다.

  • 서비스 등록 : sc create svn binpath= "C:\Program Files\Subversion\bin\svnserve.exe --service -r D:\repository" displayname= "Subversion Server" depend= Tcpip start= auto

 

  • 서비스 해제 : sc delete svn displayname= "Subversion Server"

 별다른 문제가 없다면 성공적으로 등록했다는 메시지가 출력될 것이다.

이 글은 스프링노트에서 작성되었습니다.

2010년 5월 12일 수요일

2) 서버버전 전문용어

서버버전 버전 관리 시스템에서 사용하는 전문용어를 정리하여 이후 혼동을 피하도록 할 필요성이 있다.

1. 저장소 (repository)
   : 버전관리시스템에서 작업한 모든 것을 저장하는 공간

버전관리시스템 마다 저장소로 사용하는 것이 다른다. 데이터베이스를 저장소로 사용하기도 하고 일반적인 파일들을 사용하거나, 데이터베이스와 파일을 혼용해서 사용하기도 한다.

2. 작업 복사 (working copy)
    :  저장소에서 가져온 파일을 로컬의 특정장소에 저장

다른 용어로 working directory or workspace 라고도 한다.

3. checking out
    : 작업을 위해 저장소에서 최초로 working copy를 하는 행위

4. export files
    : 저장소에서 단순히 export 시점에서의 파일들은 가져오는 행위

5. committing
    : 저장소에 working copy에 작업한 내용을 반영하는 행위

6. update
    : 저장소에서 반영된 변경된 내용을 working copy 반영하는 행위

때때로 update 용어와 check out 용어를 같이 사용하기도 한다.

7. externals
    : 프로젝트의 디렉토리 내에 또 다른 서브버전 저장소 위치를 포함시킴

8. file-specific numbering 과 repository-wide numbering
    - file-specific numbering : 변경된 파일 단위로 버전관리
    - repository-wide numbering : 논리적 변경 단위로 버전관리

서브버전은 repository-wide numbering 방식을 사용한다

9. tags
    : 특정 시점에 이름을 부여하여 기억하기 쉽게 함

10. trunk
    : 개발하는 코드의 중요 몸체이자 주요 라인을 의미하는 코드

11. lazy copies
    : branch를 만들기 위해 trunk에서 간단히 특정위치로 복사하는 행위

서브버전은 내부적으로 lazy copies을 구현하기 위해 원본에서 간단히 링크만을 저장한다.

12. strict locking
    : 동시 작업시 충돌을 피하기 위해 작업 중인 파일에는 읽기 권한만 파일에 부여하고 작업이 끝나면
      쓰기 권한을 부여하는 방식

13. optimistic locking
    : 동시 작업시 모든 작업자에게 쓰기 권한을 부여하지만 저장소 저장시 가장 최근에 변경사항을 업
       데이트 할 지에 대해 물어봐서 처리

서버버전은 optimistic locking 방식을 사용한다.




1) 서버버전 사용하기

우리는 프로젝트 진행하면서 생산되는 많은 코드를 관리하기 위해 의무적으로 버전관리 툴을 사용한다. 그렇지만 이에 대한 전반적인 학습부재로 제한적인 기능만을 사용하고 있기도 하지만 이 보다 더 심각한 문제는 필요성에 대한 자기 고찰이 없어 수동적인 사용만을 강요당하고 있다는 것이다.

이에 버전관리(version control) 또는 소스코드관리(source code control)에 대한 고민을 풀어 보고자 한다.

먼저 누구나 공감(?)할 수 있는 장점을 나열해 보자

1. 과거로의 여행의 자유 (불행하게도 미래는 안된다.. -,.-;;)
    - 자신의 작성한 코드의 한시간 전, 하루 전, 또는 한 달전으로 언제든지 롤백이 가능하다.

2. 코드의 보호
    - 팀단위로 작업시 한번씩 스팀팩 받아 본 경험이 있겠지만 열심히 만든 코드를 누군가 덮어쓰기를
      할 수 있는 여지를 만들지 않는다.

3. 코드의 발자국
    - 코드가 만들어진 역사를 편하게 볼 수 있다. ( 역사를 이해하면  미래를 예측할 수 있다나....)

4. 코드 작성과 동시에 제품 탄생
    - 약간에 과장이 있기는 하지만 하루하루 또는 일정한 단위로 자동 빌드 및 릴리즈가 가능한 시스템        에서는 반드시 필요하기는 하다.

5. 프로젝트 이력
    - 버전관리를 이용하면 프로젝트가 특정한 날짜에 어떻게 진행되고 있었는지를 알 수 있다. (개발자
       가 오늘은 몇라인을 코딩했을까? .. ^^!)

지금까지 글에서 버전관리를 위한 특정 프로그램을 언급하지 않았다. 이제 서브저번에 대해서 이야기 해보자. 왜 버전관리 툴롴써 서버버전을 사용하는 것일까?

서버버전 프로젝트는 CVS에 엄청난 경험이 있는 개발자들이 시작했다. 이들은 CVS 결점을 잘 알고 있었고 높은 성능과 현시대에 부응하는 버전 관리시스템을 설계했다.

서버버전의 특징적인 기능은 다음과 같다.

1. 서버버전은 파일들 뿐만 아니라 디렉토리와 메타데이터 까지 버전관리하는 객체로 본다.
   : 여기서 메타데이터는 파일과 디렉토리와 관련 있는 서버버전 프로퍼티 정의 파일이다. 따라서 이
     메타데이터가 관리됨으로써 서버버전이 어떻게 파일을 다루는지, 키워드 확장등을 광범위하게 제
     어 할 수 있다.

2. 서버버전은 atomic commit을 지원한다.
   : 서버버전은 사용자가 커밋을 하면 전체변화가 성공적으로 반영되든지, 아니면 취소되거나 롤백된
     다. 어중간한 상태는 없다. 이것의 이점은 모든 개발자가 저장소의 동일한 뷰를 바라볼수 있다는 것
     이다.  atomic commit 과정의 일부로써 서버버전은 모든 변경된 내용을 revision (= changeset) 이
     라는 불리는 것으로 그룹핑한다. 그리고 revision number로 할당한다. 이 그룹핑에 의해 많은 변경
     파일들이 하나의 논리적 단위로 관리될 수 있다.

3. 서버버전은 똑똑한 네트워킹을 지원한다.
    : SSH 지원, Apache Web Server 연동 지원등의 다양한 옵션과 효과적인 네트워크 프로토콜을 사
      용한다.

4. 부하가 적은 branching, tagging, Merging을 지원한다.
    : CVS의 경우 branching과 labeling은 서버에 접근해서 저장소의 모든 파일들을수정해야하는 부담
       스러운 작업이다. 이런작업을 효울적인 데이터베이스 모델을 이용하여 적은 비용으로 작업이 가
      능하다.

5. 서버버전은 다양한 플랫폼에서 운영가능하다.
    : 특히 윈도우 환경에서도 잘 운영되며, 다른 머신으로 이전 또한 한번에 가능하다.
      ( 진입장벽을 깨버린 중요한 요소이다. )