※ 본 카테고리의 내용은 부스트캠프 챌린지 기간동안 학습한 내용을 바탕으로 정리한 내용입니다.
목차
0. 형상관리도구
Git을 알기 위해서는 먼저 형상 관리 도구를 알아야겠죠?
형상 관리 도구는 소프트웨어 프로젝트에서 나오는 결과물을 관리하는 소프트웨어입니다.
소스를 버전별로 관리할 수 있기 때문에 개발할 때 실수로 소스를 삭제하거나 수정하기 이전으로 돌아가야 하는 경우 쉽게 되돌릴 수 있죠.
또한 팀 프로젝트에서 누가 무엇을 어떻게 수정했는 지 확인하고 코드를 병합하거나 수정된 소스를 추적하는 데에도 쓰입니다.
형상 관리 도구로 가장 유명한 것은 역시 Git이겠죠?
Git을 제외하고도 Subversion(SVN), CVS, Perforce, ClearCase, TFS, Mercurial, Bitkeeper, SVK, Darcs, RCS, SCCS등이 있습니다.
그 중에서도 특히 CVS - SVN - Git으로 이어지는 라인이 가장 중심이 되는데요,
CVS는 90년, SVN은 00년, Git는 05년에 만들어져서 조금씩 필요에 맞게 발전되어 왔습니다.
현 시점에서 우리가 가장 주목해야 하고 꼭 배워야 하는 툴은 바로 Git입니다.
1. Git
Git은 리누스 토르발스가 개발한 분산형 버전 관리 시스템입니다.
분산형 버전 관리 시스템이라는 이름이 붙은 이유는, 각 사람들이 분리된 상태에서 버전관리를 할 수 있기 때문입니다.
Git의 구조를 간단히 살펴보면, 기본적으로 Git의 작업 폴더는 전체 기록과 각 기록을 추적할 수 있는 정보를 포함하고 있습니다.
로컬 컴퓨터에 모든 파일을 다 받아서 작업을 한 후에 Git 원격 저장소로 보내게 되는데, 이 과정에서도 혹시 모를 상황에 대비해 메인 저장소가 아닌 따로 사용할 수 있는 저장소(Branch)를 만들어서 사용할 수 있게 되어있습니다.
또한 commit 기능을 이용해서 개발해서 소스를 올리는 중간중간 어떤 내용을 수정했는지, 어떤 부분을 고치거나 리팩토링했는지 알 수 있도록 메모를 남길 수 있게 되어있습니다.
이러한 Git의 장점으로는 아래와 같습니다.
- 오프라인 사용 - 서버가 맛이 가도 내 컴퓨터만 정상이면 문제 없이 개발을 진행할 수 있습니다.
- 빠른 속도 - 각자의 컴퓨터가 서버의 역할을 나누기 때문에 서버의 부하도 줄어듭니다.
- 유연한 분산처리 구조 - Git에서 제공하는 Branch 등 기본적인 요소를 사용하면 필요에 따라 따로 서버를 두거나 중간다리를 만들어서 사용할 수 있습니다.
- 보다 안전한 병합 - 로컬에서 병합하고 올리는 형태이기 때문에 문제를 로컬에서 미리 확인할 수 있습니다.
- 무료 - 가장 중요한 요소입니다. 모두에게 자유를 주었다는 것이 엄청나죠!!
물론 장점만 있는 것은 아닙니다. 단점도 존재합니다.
- 난이도 상승 - 기존 형상관리도구에 비해 덜 직관적이고 난이도가 높습니다.
- 전체를 받아야 함 - 원하는 파일 하나만 받을 수 없고 한번에 전체를 받아서 작업을 해야합니다.
- 병합 시간의 증가 - Branch가 증가할수록 당연히 가장 중요한 병합의 시간이 늦춰집니다. 또한 자주 리팩토링을 한다거나 파일을 바꾸는 경우 전달 속도가 느려지는 만큼 상대가 오래된 정보를 가지고 헤매고 있을 수도 있습니다.
2. 얕은 복사와 깊은 복사
실제로 CLI 프로그램을 제작하면 가장 애를 먹었던 부분 중 하나가 바로 얕은 복사 문제였습니다.
Staging 영역에 있는 중첩된 배열의 요소를 그대로 전해주고 싶은데, 자꾸 자료가 수정되서 원하는 대로 복사가 되지 않는 것이었습니다.
확인해보니 JS의 기본 데이터 타입이 아닌데 =로 전달하는 경우 가장 흔하게 얕은 복사가 진행되었습니다.
let temparr = [1,2,3,4]
let newarr = temparr;
temparr[0] = 100;
console.log(temparr[0]); // 100
console.log(newarr[0]); // 100
// 아니..? 얕은 복사다?
위 내용을 간단히 그림으로 그리면 아래와 같습니다.
newarr은 기본 데이터형이 아닌 배열이기 때문에, 주소값을 참조하게 됩니다.
이 상황에서 temparr[0]을 바꿔도 newarr은 주소값을 참조하기 때문에 같이 바뀌게 되는 것이죠.
(배열이 아닌 객체 역시 얕은 복사가 진행됩니다.)
이렇게 주소값을 참조하는 경우 원래 값이 바뀌어버리면 참조하도록 선언된 변수의 값 역시 동시에 바뀌게 되고, 이것을 바로 얕은 복사라고 합니다.
이런 얕은 복사를 막기 위해서는 직접 함수를 구현해서 기본 데이터형으로 전달할 수 있는 방법을 찾아내거나,
JSON의 stringify와 parse를 사용하거나, Object.assign을 통해 프로토타입과 프로퍼티를 사용하거나, lodash 모듈의 cloneDeep이라는 함수를 가져와서 보다 쉽게 깊은 복사를 사용할 수 있습니다.
// lodash
let copyObject = temp.cloneDeep(mainObject);
※ Git 동작에 대한 보다 자세한 설명, 얕은 복사와 깊은 복사 문제 해결책이 추가로 업로드 될 예정입니다!
최근댓글