들어가기 전 머리글
중,소규모 서비스를 하는 회사의 경우, 형상 관리도구로는 SVN을 많이 접하였을 것으로 생각됩니다.
저도 svn을 사용하다가 문득 svn이 형상관리를 하는 윈리가 궁금해졌습니다.
아직은 신입이라 고연차의 사수 분께 여쭈어보고 구글링도 하며 알아보고 생각한 내용을 끄적여 보겠습니다!
SVN, GIT, .. 형상관리는 왜 필요한가?
SVN의 동작 구조는 구글링하면 좋은 내용의 글들이 많은데,
간단하게 요약하자면 기본적으로 "형상관리"를 하는 도구입니다.
형상이란 "사물의 생긴 모양이나 상태"를 말합니다.
다시 말해 내가 작성하고 있는 소스파일 이나 프로젝트의 모양이나 상태의 변화를 관리하는 것입니다.
그럼 형상관리가 왜 필요할까요?
그 이유는 바로 분업을 하기 때문에 발생하는 문제를 해결하기 위함입니다.
분업을 하였을 때 발생하는 문제는 무엇일까요?
첫번째 문제는 내용을 덮어쓰는 것 입니다.
예를 들어 김사원이 A시점의 소스코드/파일을 받아서 작업하고 공동 저장소에 저장하였는 데,
강대리도 그 A시점의 파일을 받아 작업해서 저장해 버리면,
공동 저장소에 김사원이 야근하며 작업한 코드/파일을 덮어써버려
김사원의 작업 내용이 날라가버리기 때문입니다.
두번째 문제는 복원입니다.
형상관리도구 없이 파일을 여러명이서 프로젝트를 진행하면 누군가 잘못된 코드나 내용을 넣어버리면
어느 파일에서 문제가 발생하고 있는 지 찾는 것도 문제지만, 문제가 발생하기 전 백업파일을 만들어 놓지 않으면
여러사람들이 작업한 것을 다시해야하고 누군가 작업해놓은 파일을 기준으로 다른사람이 덧붙여 작업한 코드이기에
여러게로 엉킨 코드랑 개발자들의 생각들이 스파게티 처럼 꼬이게 되고 결국 손쓸수 없는 상황이 올 수 도 있습니다.
SVN, 형상관리도구를 사용하면?
SVN과 같은 형상관리도구를 사용하게 되면,
여러 개발자들이 작업한 내용은 STACK구조로 하나하나 위에 쌓이며
( 작업 내용을 번호를 매겨 하나씩 증가시킴 auto increase )
여러 개발자가 작업하기 전에 해당 디렉토리를 update(최신 작업상태로 받아옴)시킴으로 저장소의 최신 상태의 코드/파일을 받아 작업함으로써 김사원 같이 덮어쓰여 작성한 코드가 날라가는 불상사를 막을 수 있습니다.
또한 잘못하여 update를 안시키고 commit(내 작업을 등록)하여도 형상관리도구에서 에러메시지를 보내 충돌을 알려줍니다.
프로젝트에 문제가 있을 시 따로 백업 파일을 만들지 않아도
특정 시점의 작업 내용 번호로 rollback(이전의 특정 시점으로 돌아감) 시켜 프로젝트를 복원합니다.
SVN 용어 branch , tag , trunk, revision , head , base ..
- trunk : 프로젝트 핵심 디렉토리로써 개발자들이 작업하고 commit하게 되면 해당 trunk로 작업물이 쌓인다.
- branch : 한국어로는 나뭇가지라는 의미인데 나무가 자라 가지를 뻗듯이 뿌리가 되는 프로젝트 파일(trunk)에서 따로 뻣어나와 개발하는 프로젝트 줄기라고 보면 된다.
- tag : 말그대로 태그인데 프로젝트의 버전 별로 관리하도록 tag디렉토리에 보관하는 이다. 대게 특정 버전을 따로 빼어 백업으로 만드는 것 스냅샷 개념
- revision : 위에서 말한 것과 같이 개발자들이 commit하게되면 stack 구조로 쌓인다고 했었다. 그러면서 작업이 추가될 때마다 작업내용의 번호를 증가신다고 했었는 데 revision이 작업 번호라고 보면된다.
- head : 저장소의 최신 작업 번호(revision)을 의미한다.
- base : checkout / update 을하여 개발자가 받은 revision을 말한다.
그 외에 명령어 및 내용은 아래 사이트를 참고 하면 된다. 이 글도 해당 블로그의 내용을 참고했다.
https://velog.io/@gillog/SVNSubversion-%EA%B8%B0%EB%B3%B8
SVN도 내부적인 DataBase를 가지고 있다?!
위의 사진은 글쓴이가 cafe24에서 구매한 가상호스트pc에서 svn server을 설치한 후 svn프로그램의 디렉토리이다.
보면 db라는 경로가 있는 것을 볼 수 있다. 그렇다면 여기서 이런 생각을 해본적이 있을 것이다.
여러 사람이 작업하고 commit하면 그 기록은 어디에 있을까?
svn은 작업내용이 추가 되어 commit될 때 마다 자체 DB에 튜플을 추가해 기록하고.
서버의 최신 db내용과 로컬의 db값을 비교해 차이를 확인하여 작업하는 것 같다..
(로컬에 svn을 이용해 파일을 받으면 .svn이라는 폴더가 생기는데 여기에 db정보가 있다.
(여기서 DB를 사용해 crud를 해보았다면
autoincrease를 설정한 컬럼값은 이전내용의 튜플들을 위에서부터 지워도
뒤의 튜플 값에서 +1된 값이 아닌 이전의 최신번호 증가된 값에서 +1이 된다는 것을 알것이다.
그래서 svn에서 rollback을 하여 과거 revision값으로 svn을 되돌리고 작업하여 commit해도
해당 과거 revision에서 순차적으로 증가한 값이 아닌 rollback하기전 reivsion번호의 값에서 +1된값이 등록된다.)