본문 바로가기
Development Tools/Git

git 시작하기 (1) - 버전 관리란?

by jjerryhan 2017. 11. 17.
반응형


앞으로 git에 대해 상세히 설명하고자 합니다.

 

git과 연관 개념에 대한 설명, git을 설치하고 환경을 구성하는 법, 각 도구에서 git을 사용하는 법, 버전 관리를 넘어 (Continues Integration), CD (Continues Delivery) 자동화 까지를 모두 다루도록 하겠습니다. 

git서버로는 설치형 git서버인 GitLab을 이용할 예정인데, GitLab은 윈도, 리눅스, 맥 장비에 손쉽게 설치하여 누구라도 git서버를 구성할 수 있고 소프트웨어 개발에 필요한 정적 검증, 이슈추적, 일정관리, 동료검토, 변경 승인, 빌드 배포 자동화등 다양한 연관 작업을 모두 지원하기 때문에 이를 사용할 예정입니다.

(GitHub과 달리 GitLab은 개인 비공개 레파지토리가 무제한 공짜라는 건 비밀!)

GitLab의 설치와 환경설정, 그리고 각 기능의 상세 사용법에 대한 내용은 앞으로 차근차근 다뤄 보도록 하겠습니다.





우선 버전이란 무엇이며, 이를 관리하는 VCS(Version Control System)에는 어떤 것들이 있는지 알아보도록 하겠습니다.


버전 관리란? 


버전이란 어떤 것(물건이던 동물이던, 무엇이던)을 그 이전과 구분 짓기 위해 임의로 부여한 어떤 것으로 일련의 번호가 될 수도 있고, 다른 이름이 될 수도 있고, 특정 연도나 날짜가 될 수도 있습니다. (거시기에 거시기를 한 것이 버전)

< 폴더명과 파일명을 통한 버전 관리 예시 >


이러한 버전을 부여하는 이유는 각각의 것들 간에 서로 일치하지 않는 부분이 있어서 변화되는 상태를 서로 구분 짓고 나중에 특정 시점에서의 특정 상태(특정 버전의 물건)를 다시 재활용 또는 참조하기 위함입니다.


버전 관리란 일정한 규칙의 버전을 부여하고, 부여된 각 버전을 등록 및 조회하고, 서로 비교하는 등의 일련의 활동을 의미합니다. 

<보통 이보다 몇 배는 더 복잡함. 특히 git 은 더욱 더 복잡하지만, 단순하게는 이렇게 버전을 관리하는 것을 의미.>


요즘처럼 무슨 일이든 혼자서 작업할 수 없고 여러 사람이 협업하여 업무를 처리해야 하는 환경에서는 이 버전 관리가 특히 중요합니다.

특히나 소프트웨어나 디자인처럼 매일매일 여러 사람에 의해 연속적으로 상태가 변화하는 경우, 버전 관리를 하지 않는다는 것은 것은 마치 썰물인 모래 사장에 이름을 써놓고 내일 다시 와서 어제 적어놓은 이름을 찾는 것처럼 어리석은 짓이라 할 수 있겠습니다. (다 날라간단 야기)

버전 관리를 사용하면 전체 프로젝트, 또는 특정 파일을 이전 상태로 되돌릴 수 있으며, 이전 상태에 비해 변경된 내용만을 추출하여 비교할 수 있으며, 누가 수정하였는지도 알 수 있으며, 언제 수정되었는지도 모두 알 수 있습니다. 

무엇보다도 현재 버전에서 문제가 발생한 경우, 이전 상태를 복구하여 즉시 문제를 해결할 수도 있고, 문제를 발생시킨 원인을 추적해서 빠른 문제 해결이 가능하게 하는 것이 바로 버전 관리의 가장 큰 장점이라 하겠습니다.




버전 관리는 대상 파일의 버전 정보를 어디에서 관리하느냐에 따라 크게 로컬 버전 관리(PC 폴더 또는 로컬 DB 이용), 중앙집중식 버전 관리(CVS, Sub Version 등), 분산 버전 관리(git 등)의 세 가지로 구분할 수 있습니다.


로컬 버전 관리


가장 기초적인 형태로 내 PC의 특정 경로에 버전 구분이 가능하도록 파일을 관리하는 방법입니다. 

폴더명에 일련번호를 붙이거나, 파일명에 날짜를 붙이는 등 누구나 쉽게 할 수 있고 하고 있는 방법입니다. 

<흔히 볼 수 있는 개발자의 작업 폴더. #엉망진창 #그나마양호 #치킨집계약>


하지만 내가 작업하던 폴더를 지워버리거나 파일명을 변경하는 걸 깜박한다면? 내 PC가 바이러스나 랜섬웨어라도 걸려버린다면 단 한 번에 모든 것을 잃게 될 수도 있고, 내가 정리하던 폴더를 누군가에게 전송해서 다른 사람이 작업을 이어간다면 내가 만든 규칙이 그대로 유지된다는 보장이 없어서 쉽게 버전 관리 체계가 깨져 버리게 되는 등 수많은 단점이 존재합니다. 

따라서 혼자 작업하는 경우가 아니라면 적용이 불가능한 방식이라 할 수 있습니다. 


대신 워드프로세서, 엑셀 같은 오피스 프로그램이나 대부분의 IDE (Integrated Development Environemnt) 도구들에서는 이 로컬 버전 관리 시스템을 통해 작업자의 실수를 예방해주는 편의를 제공하고 있기도 합니다. 

<로컬버전 관리 시스템은 보통 일주일이나 길어야 한달 정도만 유지, 포맷하거나 폴더 옮기면 없어지기도.>


이런 도구에서 제공하는 로컬 버전 관리 방식은 단순히 폴더를 통한 관리가 아니라 도구 내부에 Version Database를 생성하여 관리하고, 해당 Database 에 각 버전을 차곡차곡 저장하는 방식으로 지원하는 형태입니다.




중앙 집중식 버전 관리(CVCS - Centralized Version Control System)


중앙 집중식 버전 관리 시스템은 로컬 버전 관리 시스템이 갖는 단점, 즉 관리가 어렵고 협업을 위한 공유가 불가한 문제를 해결하기 위해 고안되었습니다. 


중앙 집중식 버전 관리 시스템은 버전을 관리하는 서버를 별도로 구성하고 각 사용자는 중앙 서버에 접속하여 버전을 가져(Checkout) 오고, 로컬에서 변경한 버전을 다시 중앙 서버에 저장(Commit)하는 방식으로 협업이 가능하도록 구성한 버전 관리 시스템입니다. 

<중앙에 저장소를 두고 모든 사용자는 중앙 저장소를 통해 작업 동기화를 수행>


위 그림에서 update는 중앙 서버와 로컬 장비상의 버전 불일치 (대부분 중앙 서버가 더 최신 파일, 즉 다른 개발자가 수정해서 commit 한 파일을 가지게 됨)를 해결하기 위해 중앙 서버에 있는 최신 파일을 내 로컬 PC로 다운로드해서 나의 로컬 버전 정보를 서버의 버전정보에 맞춰 update 하는 것을 의미 합니다.

중앙 집중식 버전 관리는 로컬 방식에 비해 여러 사람이 공동으로 작업할 경우에 적합하며, 중앙 서버상에서 현재 누가 어떤 작업을 하고 있는지 확인이 가능해지고, 특정 폴더에 대한 접근 제한 등 중앙 통제도 가능합니다. 또한 각 개발자의 PC 가 아닌 중앙의 데이터베이스만을 관리하면 되기 때문에 시스템을 유지하고 보수하는 측면에서도 많은 장점이 있습니다.

하지만 이런 장점에도 불구하고 중앙 집중식 버전 관리 시스템은 심각한 단점을 가지고 있는데, 바로 중앙 서버에 문제가 발생하는 경우입니다. 

중앙 서버에 문제가 발생하면 모든 데이터를 잃을 위험뿐만 아니라 이에 연결해서 작업해야 하는 모든 개발자들 접속한 중앙서버가 먹통이기 때문에 어떤 작업도 할 수 없는 상태가 되는 매우 심각한 문제를 가지고 있습니다.

이런 중앙 집중식 버전 관리 시스템으로는 CVS, SubVersion 등이 대표적 입니다.



분산 버전 관리 시스템(DVCS - Distributed Version Control System)


분산 버전 관리 시스템은 단순하게는 중앙 서버가 없이 중앙 서버 역할을 하는 동일한 서버가 여러 곳에 분산되어 있는 형태로 이해할 수 있습니다.


즉 중앙 서버가 한대가 아니고, 여러 곳에 동일한 서버의 사본 (엄밀한 의미에서는 사본이 아니지만) 을 유지 및 관리하여 중앙 집중식 버전 관리 시스템이 갖는 단점을 보완하는 시스템을 의미합니다.

< 중앙저장소를 그대로 복사한 Local 저장소를 여러곳에 두고 사용자는 각자 Local 저장소를 통해 버전관리를 수행 >


하지만 분산 버전 관리 시스템의 장점은 단순히 서버의 사본을 중복 저장해서 데이터 손실을 방지한다는 데에만 있지 않습니다.

무엇보다 분산되어 있는 저장소(Local Repository) 들은 원격 저장소(Remote Repository)의 가장 최근 버전 정보만을 보유하는 것이 아니라 모든 버전 이력을 보유한 하나의 완벽한 서버 역할을 수행할 수 있도록 구성됩니다. 각 분산 저장소는 모든 버전 이력 정보를 포함하고 있기 때문에 특정 장비, 특히 원격 저장소에 문제가 생기더라도 전혀 영향을 받지 않으며, 필요할 경우 복수의 원격 저장소와 상호 버전 정보를 전달(Push) 하거나 참조(Pull) 할 수 있도록 지원됩니다. 

이런 독립적이면서도 상호 보완적인 분산 정보 관리 기능으로 인해 전세계 곳곳의 수 많은 개발자와 팀들이 동시에 협업하고 공유하는 오픈 소스 생태계에 적합한 다양한 협업 작업 방식을 지원 할 수 있게 합니다. 

분산 버전 관리 시스템이 갖는 진정한 장점인 이 열린 작업 방식에 대해서는 직접 git과 원격 저장소 GitLab을 사용해 보면서 체득해 보도록 하겠습니다. 


:: 다음에 계속됩니다. 

'Development Tools > Git' 카테고리의 다른 글

git 시작하기 (4) - git cli 설치  (0) 2017.11.19
git 시작하기 (3) - git 기초  (0) 2017.11.18
git 시작하기 (2) - git의 역사  (0) 2017.11.18