'Git'이라는 '버전 관리 도구'를 언급하면 바로 따라오는 말이 있다.

- 리누스 투르발스 (Linus Benedict Torvalds, 위키피디아 기준 발음)
- 리눅스 커널 (Linux Kernel)
- 안드로이드 (Android)
- 분산 버전 관리 시스템 (Distributed Version Control System, DVCS)



다른 것들은 다음에 기회가 있으면 이야기하도록 하고,
여기에서는 '분산 버전 관리 시스템'에 대해서만 이야기를 해보고자 한다.



소프트웨어 형상관리의 흐름을 살펴보면,

로컬에서 파일시스템 기반으로 형상관리를 하다가,
네트워크 기반의 중앙집중식으로 관리를 하고,
최근에는 분산형 관리가 유행이다.



도구로 따지면,
'버전 관리 도구'의 고전작품인 'CVS'
'버전 관리 도구'의 대중화를 이끈 'Subversion'

이들과 'Git'이 차별점을 보여주는 부분이 바로 '분산 (Distribute)'이다.





컴퓨터 세상은 우리가 살아가는 사람들의 세상과 밀접하다.

C++을 통해서 우리에게 알려진 객체지향(Object-Oriented)이라는 것도
컴퓨터 언어에만 있는 것이 아니라
세상을 바라보는 관점에 대한 철학의 산물인 것처럼

분산 처리라는 것도 신경망 모델 중 하나로 개념화되어
일반적으로 부하가 걸리는 것을 해결하기 위한 방안으로
나누어 처리하는 것을 의미하는 아주 대중화된 방법이다.

말단 처리 장치의 능력이 좋아지고
네트워크가 잘 이루어진 상황에서는
당연한 수순으로 집중처리에서 분산처리로 변화하게 되는 것이다.





'CVS'와 'Subversion'과 같은 기존의 '중앙 집중식 버전 관리 도구'
'서버-클라이언트 (Server-Client)' 구조를 따른다.

'서버'를 구축해 놓고 사용자는 '클라이언트'로 붙어서 작업을 하는 방식이다.

이러한 구조에서 발생하는 문제 중에서 가장 큰 것은
'서버'가 없으면 '클라이언트'는 작업을 할 수 없다는 점이다.

다른 문제로는 '중앙 집중식 버전 관리 도구'의 장점이자 단점인데,
시스템을 구성하는데 단순하고 쉽게 할 수 있는 반면에
다양한 '워크 플로우(Work Flow)'를 구현하는데에 한계가 있을 수 밖에 없다.

실제 현업에서 이러한 '중앙 집중식 버전 관리 시스템'을 사용할 때
피부에 와닿는 문제는 협업을 할 때에 있었다.
특히 해외 연구소들... 더욱 더 특히 인도와 같이 느린 네트웍...




'중앙 집중식 버전 관리 시스템'의 경우를 예를 들어보자,
서버를 구축하는 것도 쉽고 시스템을 구성하는 것도 쉽고
한 곳에 모여서 열심히 작업을 할 때에는 아무런 문제도 없다.

그러던 중 해외의 연구소와 협업을 하게 되면서 문제가 발생한다.

그냥 기존과 같이 새로 계정 발급해주고 국내 서버에 붙어서
협업을 하게 하는데 해외쪽의 네트웍 속도가 느려서
제대로 check-out/in이 되지 않는 경우가 발생하는 것이다.

즉, 소스를 다운 받는데 네트웍이 느리다보니 종종 실패를 하게 되고,
더 큰 문제는 작업한 내용을 서버로 올릴 때 실패를 하는 경우이다.

실패를 하는 것은 그나마 나은 경우이고,
에러가 없었는데 파일 일부를 누락하게 되면 정말 괴롭게 된다.

이 모든 원인은 느린 네트웍 속도.

특히 관리하는 소스 코드의 용량이 클 경우에는
추가적인 더더욱 심각한 문제가 발생하게 된다.


이를 극복하기 위한 흔한 방법은
'프록시 서버(Proxy Server)'를 원격지 가까운 곳에 두는 것이다.

그리고는 메인 서버와 '동기화(Synchronization)'를 하도록 하면 된다.

보통은 이와 같은 방법으로 이와 같은 상황을 해결하지만,
동기화 과정에서 많은 문제가 발생하는 것을 완전히 피할 수는 없다.



이러한 것을 극복하기 위한 것이 바로
"분산 버전 관리"이다!

서버에서 check-out을 하게 되면
서버와 똑같은 내용을 전부 클라이언트가 갖게 된다.
즉, 클라이언트가 서버가 될 수 있는 것이다.

'로컬(local)'에 서버 복사본을 구축해버리면,
서버와 연결되지 않아도 혼자서 commit을 할 수 있다.

필요할 때에 필요한 내용만 서버로 보낼 수가 있다.

'프록시 서버'와 유사하면서도 또 다른 구성이다.

"Git"과 같은 "분산 버전 관리 도구"에서
기본적으로 손쉽게 '복사본(clone)'을 구축할 수 있게 함으로써
정말 다양한 '워크 플로우'를 구축할 수 있게 되었다.

정말 유연한 시스템을 구축할 수 있도록 도와주는 것인데,
이러한 유연성이 부담스러울 경우에는
기존 방식과 같은 타이트한 워크 플로우를 구성할 수도 있다.

비록 "Git"이 지향하는 '분산 버전 관리'의 모습은
'병렬 분산 처리 (Parallel Distributed Processing, PDP)'이지만,
사용자가 원하는 워크 플로우를 구성할 수 있다는 점이 중요하다.




'Git'의 명령어들을 공부하는 것도 중요하지만,
더욱 중요한 것은 'Git'을 이용하여 어떻게 작업을 할 것인지에 대해서이다.

'C언어'를 공부하는 것과 마찬가지인 것이다.
문법을 모두 공부했다고 해서 끝나는 것이 아니고
어떻게 프로그램을 만들 것인지에 대해서 공부해야하는 것처럼 말이다.


실제로 'Git'으로 이를 어떻게 사용할 수 있는지는
앞으로 차차 살펴보도록 하자.



[ 참조 ]
리누스 투르발스 - http://ko.wikipedia.org/wiki/%EB%A6%AC%EB%88%84%EC%8A%A4_%ED%86%A0%EB%B0%9C%EC%A6%88
분산 버전 관리 - http://ko.wikipedia.org/wiki/%EB%B6%84%EC%82%B0_%EB%B2%84%EC%A0%84_%EA%B4%80%EB%A6%AC_%EC%8B%9C%EC%8A%A4%ED%85%9C
인지과학 - http://terms.naver.com/entry.nhn?docId=8403
분산 버전 제어 시스템 소개 - http://www.ibm.com/developerworks/kr/library/au-dist_ver_control/
Reversion Control System - http://en.wikipedia.org/wiki/Revision_control_software
반응형

+ Recent posts