반복되어 사용되는 코드는 모듈로 분리하여 관리한다. 그 이유는 코드의 단편화를 막고 유지보수 측면에서 이득을 취하기 위함이다.
개발자가 맞이하는 대부분의 문제는 대부분 유지보수 단계에서 발생하며, 개발자가 코드를 제어하지 못하는 심각한 경우에 이를 수 있기 때문에 문제들을 미연에 방지해야 한다. 개발자는 아키텍쳐 패턴을 통해 관심사를 최대한 분리하고, 코드 재사용성에 신경써야 한다.
Git Submodule은 모듈화가 가능토록 해준다. 생산성이 높아지고, 관리가 용이해진다.
실제로 2년전 쯤 프로젝트를 수행하다가 Git Submodule 을 써본적이 있다. 웹, 앱 클라이언트 언어가 같아 로직을 공유할 수 있는 환경이었다. 적용하지 않을 이유가 없었고, 적용하여 많은 이득을 보았다.
이번에도 진행중인 프로젝트에서 사용할 기회가되어 이참에 정리해보고자 한다.
- A 프로젝트: 순수 코어 모듈
- B 프로젝트: 특정 프레임워크에 의존 및 특화된 라이브러리, A를 서브모듈로 사용 할 예정
핵심 로직은 A 프로젝트로 관리하고, 여러 프레임워크에 특화한 B1, B2, ...BN 프로젝트들에서 사용할 생각이다.
주의할 점
- 모듈의 형태를 띄기 때문에 버전 관리가 잘 되어야 한다.
- 하위 호환성을 최대한 깨면 안된다.
시작하기
서브모듈이 필요한 프로젝트 경로에서, 아래 명령어를 수행한다.
// example: git submodule add https://github.com/chaconinc/DbConnector
git submodule add {repo-url}
이때 git status 명령을 실행하면 아래와 같이 모듈이 프로젝트에 추가된 것을 볼 수 있다.
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: .gitmodules
new file: DbConnector
- .gitmodules: 서브디렉토리와 하위 프로젝트 URL의 매핑 정보를 담은 설정파일, 한번 열어보길 바란다.
- DbConnector: 추가한 Submodule
이제 커밋으로 서브 모듈 추가를 완료한다
$ git commit -am 'Add DbConnector module'
이로써 깃 서브 모듈 추가를 완료했다. 2주가 지난 지금 2개 프로젝트에서 사용해보았는데 역시 많은 도움이 되고 있다!
--------
아래는 수정 중임
웹, 안드로이드 클라이언트를 개발한다고 가정해보자. 클라이언트의 공통 기능은 4가지이며, 각각의 깃 레포지토리를 갖게 될 것이다.
보다시피 두 앱이 사용자에게 제공하려는 기능은 절대적으로 같다. 만약 모듈화를 시키지 않으면 어떻게 될까?
일단 최초 구현까지 문제가 없다. 모듈화를 여부와 상관없이 기능은 잘 동작한다.
하지만 앞서 말한 것처럼 소프트웨어에서 문제는 대부분 항상 유지보수 단계에서 발생하며 기능이 복잡해질수록 점차 꼬이기 시작한다.
- 기능 구현 - 테스트 - 리뷰
또 로직이 잘 구현됐는지 리뷰하는 과정과 테스트 하는 과정이 필요하다.
만약에 새로운 기능이 추가되거나 이슈가 생기면 어떻게 해야할까?
댓글