[정보처리기사 필기] 제품 소프트웨어 패키징 - 042. 소프트웨어 버전 관리 도구

1. 공유 폴더 방식

  • 버전 관리 자료가 로컬 컴퓨터의 공유 폴더에 저장되어 관리되는 방식
  • 공유 폴더 방식의 특징
    • 개발자들은 개발이 완료된 파일을 약속된 공유 폴더에 매일 복사
    • 담당자는 공유 폴더의 파일을 자기 PC로 복사한 후 컴파일 하여 이상 유무를 확인
    • 이상 유무 확인 과정에서 파일의 오류가 확인되면, 해당 파일을 등록한 개발자에게 수정을 의뢰
    • 파일에 이상이 없다면 다음날 각 개발자들이 동작 여부를 다시 확인
    • 파일을 잘못 복사하거나 다른 위치로 복사하는 것에 대비하기 위해 파일의 변경사항을 데이터베이스에 기록하여 관리
  • 공유 폴더 방식의 종류 : SCCS, RCS, PVCS, QVCS 등
    • RCS : 여러 개발자가 프로젝트를 수행할 때 시간에 따른 파일 변화 과정을 관리하는 소프트웨어 버전 관리 도구, 소스 파일을 동시에 수정하는 것을 방지, 다른 방향으로 진행된 개발 결과를 합치거나 변경 내용을 추적할 수 있음

2. 클라이언트/서버 방식

  • 버전 관리 자료가 중앙 시스템(서버)에 저장되어 관리되는 방식
  • 클라이언트/서버 방식의 특징
    • 서버의 자료를 개발자별로 자신의 PC(클라이언트)로 복사하여 작업한 후 변경된 내용을 서버에 반영
    • 모든 버전 관리는 서버에서 수행
    • 하나의 파일을 서로 다른 개발자가 작업할 경우 경고 메시지를 출력
    • 서버에 문제가 생기면, 서버가 복구되기 전까지 다른 개발자와의 협업 및 버전 관리 작업은 중단
  • 클라이언트/서버 방식의 종류 : CVS, SVN, CVSNT, Clear Case, CMVC, Perforce 등
    • CVS : 공동 개발을 편리하게 작업할 수 있도록 각종 소스와 버전 관리를 도와주는 시스템

3. 분산 저장소 방식

  • 버전 관리 자료가 하나의 원격 저장소와 분산된 개발자 PC의 로컬 저장소에 함께 저장되어 관리되는 방식
  • 분산 저장소 방식의 특징
    • 개발자별로 원격 저장소의 자료를 자신의 로컬 저장소로 복사하여 작업한 후 변경된 내용을 로컬 저장소에서 우선 반영(버전 관리)한 다음 이를 원격 저장소에 반영
    • 로컬 저장소에서 버전 관리가 가능하므로 원격 저장소에 문제가 생겨도 로컬 저장소의 자료를 이용하여 작업할 수 있음
  • 분산 저장소 방식의 종류 : Git, GNU arch, DCVS, Bazaar, Morcurial, ToamWare, Bitkeeper, Plastic SCM 등

4. Subversion (서브버전, SVN)

  • CVS를 개선한 것, 아파치 소프트웨어 재단에서 2000년에 발표
  • 클라이언트/서버 구조
  • 서버에는 최신 버전의 파일들과 변경 내역이 관리
  • 서버의 자료를 클라이언트로 복사해와 작업한 후 변경 내용을 서버에 반영
  • 모든 개발 작업은 trunk 디렉터리에서 수행, 추가 작업은 branches 디렉터리 안에서 별도의 디렉터리를 만들어 작업을 완료한 후 trunk 디렉터리와 병합
    • trunk : 개발 과정에서 가장 중심이 되는 디렉터리
    • branches : 메인 개발 과정과는 별도로 새로운 기능의 테스트와 같이 추가적인 작업을 수행하기 위한 디렉터리
  • 커밋할 때마다 리버전이 1씩 증가
  • 클라이언트는 대부분의 운영체제에서 사용되지만, 서버는 주로 유닉스를 사용
  • 소스가 오픈되어 있어 무료로 사용
  • CVS의 단점 개선 : 파일이나 디렉터리의 이름 변경, 이동 등이 가능
  • Subversion의 주요 명령어
    • add : 새로운 파일이나 디렉터리를 버전 관리 대상으로 등록, add로 등록되지 않은 대상은 commit이 적용되지 않음
    • commit : 버전 관리 대상으로 등록된 클라이언트의 소스 파일을 서버의 소스 파일에 적용
    • update : 서버의 최신 commit 이력을 클라이언트의 소스 파일에 적용, commit 전에는 매번 update를 수행하여 클라이언트에 적용되지 않은 서버의 변동 내역을 클라이언트에 적용
    • checkout : 버전 관리 정보와 소스 파일을 서버에서 클라이언트로 받아옴
    • lock/unlock : 서버의 소스 파일이나 디렉터리를 잠그거나 해제
    • import : 아무것도 없는 서버의 저장소에 맨 처음 소스 파일을 저장하는 명령, 한 번 사용하면 다시 사용하지 않음
    • export : 버전 관리에 대한 정보를 제외한 순수한 소스 파일만을 서버에서 받아옴
    • info : 지정한 파일에 대한 위치나 마지막 수정 일자 등에 대한 정보 표시
    • diff : 지정된 파일이나 경로에 대해 이전 리비전과의 차이를 표시
      • 리비전 : 커밋의 버전, 처음 저장소를 만들 때 : 0, 커밋이 수행될 때마다 리비전이 1씩 증가
    • merge : 다른 디렉터리에서 작업된 버전 관리 내역을 기본 개발 작업과 병합

Subvcersion을 이용한 버전 관리

5. Git (깃)

  • 리누스 토발즈가 2005년 리눅스 커널 개발에 사용할 관리 도구로 개발한 이후 주니오 하마노에 의해 유지 보수
  • 분산 버전 관리 시스템
  • 2개의 저장소 : 지역(로컬) 저장소, 원격 저장소
    • 지역 저장소 : 개발자들이 실제 개발을 진행하는 장소, 버전 관리 수행
    • 원격 저장소 : 여러 사람들이 협업을 위해 버전을 공동 관리하는 곳, 자신의 버전 관리 내역을 반영하거나 다른 개발자의 변경 내용을 가져올 때 사용
  • 버전 관리가 지역 저장소에서 진행되므로 버전 관리가 신속하게 처리되고, 원격 저장소나 네트워크에 문제가 있어도 작업이 가능
  • 브랜치를 이용하면 기본 버전 관리 틀에 영향을 주지 않으면서 다양한 형태의 기능 테스팅이 가능
  • 파일의 변화를 스냅샷으로 저장, 이전 스냅샷의 포인터를 가지므로 버전의 흐름을 파악할 수 있음
  • Git의 주요 명령어
    • add
      • 작업 내역을 지역 저장소에 저장하기 위해 스테이징 영역에 추가
      • '--all' 옵션으로 작업 디렉터리의 모든 파일을 스테이징 영역에 추가할 수 있음
    •  commit : 작업 내역을 지역 저장소에 저장
    • branch
      • 새로운 브랜치 생성
      • 최초로 commit을 하면 마스터(master) 브랜치가 생성
      • commit 할 때마다 해당 브랜치는 가장 최근의 commit한 내용을 가리키게 됨
      • '-d' 옵션으로 브랜치를 삭제할 수 있음
    • checkout
      • 지정한 브랜치로 이동
      • 현재 작업 중인 브랜치는 HEAD 포인터가 가리키는데, checkout 명령을 통해 HEAD 포인터를 지정한 브랜치로 이동
    • merge : 지정한 브랜치의 변경 내역을 현재 HEAD 포인터가 가리키는 브랜치에 반영함으로써 두 브랜치를 병합
    • init : 지역 저장소를 생성
    • remote add : 원격 저장소에 연결
    • push : 로컬 저장소의 변경 내역을 원격 저장소에 반영
    • fetch : 원격 저장소의 변경 이력만을 지역 저장소로 가져와 반영

Git을 이용한 버전 관리