황희정 개발자의 SVN에서 Git으로

『지속적 통합배포 구축은 처음이라』는 ‘[Beyond the book] 『자바 프로젝트 필수 유틸리티』 편’ 참여자의 글을 모아 한 권의 책으로 엮은 무료 전자책입니다.

[Beyond the book]은 책, 그다음 이야기를 전하는 독자참여 프로젝트입니다. 책을 읽고 현업에 적용한 이야기, 책에 소개된 내용 이외의 더 나은 대안은 없는지 등 다양한 주제의 독자 여러분의 기고를 기다리고 있습니다.  



황희정

SK엔카닷컴에서 근무하였으며, 현재는 게임을 개발하고 있습니다. 자바카페 커뮤니티 운영진이며 개발자들과 소통하는 것을 즐깁니다. 자바 기반의 웹개발을 담당해왔습니다. 현재는 검색엔진 엘라스틱서치에 관심이 많습니다.



백엔드 개발자로, 20명 규모의 팀에서 일하고 있습니다. 기존 개발 환경은 빌드에 메이븐Maven, 단위 테스트에 제이유닛JUnit, 배포에 도커, 지속적 통합에 젠킨스Jenkins를 사용하고 있습니다. 『자바 프로젝트 필수 유틸리티』에서 언급한 기술을 다 사용하고 있습니다. 다만, Git을 사용하고 있지 않은 독자를 위해 SVN에서 Git으로 변경한 제 경험을 공유하고자 합니다.


몇 년 전 만해도, 저뿐 아니라 많은 분들이 소스 버전 관리에 SVNApache Subversion을 많이 사용하였습니다. 제가 SVN 대신 Git을 사용하게 된 이유는 이직한 회사에서 Git을 사용하기 있기 때문입니다. SVN과 Git을 둘 다 사용하며 겪은 경험을 짧게 소개하면 다음과 같습니다.


SVN과 Git 개발 환경의 차이

Image result for svn  git


SVN은 클라이언트-서버 모델로 소스의 버전을 관리합니다. 중앙 리포지토리Repository의 소스를 로컬로 복사한 후 복사본에서 개발을 하고 변경한 사본을 커밋Commit합니다. 앞의 그림에서 보다시피, SVN은 로컬에서 변경한 내용을 커밋 하면 중앙의 서버에 바로 반영됩니다. 그래서 변경사항을 임시로 로컬에 저장을 할 수는 없습니다. 만약 중앙 서버에 장애가 발생하면 커밋을 할 수 없습니다.


SVN과 Git의 작업 방식

Image result for svn git


반면 Git은 분산형 리포지토리 모델입니다. 로컬의 본인 저장소에 커밋한 후 서버에 푸시push하는 식이라 본인이 작업하던 소스를 서버에 변경 없이 안전하게 보관할 수 있습니다. 또한, 중앙 서버에 네트워크가 연결되지 않더라도 로컬 리포지토리에서 소스 변경사항을 커밋할 수 있습니다.


Git과 Gitflow

Git을 사용하면서 깃플로우Gitflow도 사용하게 되었습니다. 깃플로우는 대규모 프로젝트에서 소스를 관리하는 방법입니다. 상황에 따라 각 실무에 맞게 적용하면 되는데 일반적인 방법은 다음과 같습니다.


Image result for gitflow

현재 운영 중은 소스는 Master 브랜치branch에서 관리하고 있습니다. 그리고 운영 중인 소스에서 당장 해결해야만 하는 오류가 있을 수도 있습니다. 이 경우 Master 브랜치로부터 핫픽스Hotfix로 소스를 가져와서 해당 오류를 처리하고 Master로 병합합니다. 

또한, 릴리즈Release의 경우 애플리케이션의 출시 직전의 소스를 관리하고, 개발 서버에서 테스트 중인 소스는 Develop 브랜치에서 관리합니다. 기능 개발에 대한 것은 Feature에서 개발을 하죠. 이처럼 깃플로우로 소스를 관리하면 용도에 맞게 안전하게 소스를 관리할 수 있습니다.


Git이 가져다 준 변화

이렇게 Git을 사용하면 여러 가지 장점이 있습니다. 특히 대규모 프로젝트의 경우 브랜치 단위로 소스를 관리하면 기능 단위로 테스트를 쉽게 할 수 있고 문제가 생기더라도 해당 브랜치의 추적하여 버그의 수정이 훨씬 용이했습니다. 애자일Agile 방법론은 소프트웨어 개발의 예측 불가능성에 민첩하게 대응할 수 있도록 도와주는데, Git은 소스 버전 제어 시스템에 있어 애자일 개발의 사실상의 표준이기도 합니다.



자바 프로젝트 필수 유틸리티
쇼다 츠야노 , 전민수