Programming/Java

(JAVA, Gitlab) Git Submodule을 사용하여 멀티프로젝트를 진행해보자

armyost 2022. 1. 21. 17:09
728x90

Submodule을 가지는 프로젝트 구조의 장점

시스템 개발의 단위(형상)를 분리하여 빌드 및 배포가 용이하고, 모듈별로 레포지토리가 생겨 프로젝트별로 추적이 용이하다는 장점이 있다.

 

Submodule 구조를 위한 Gitlab Repository 생성 및 Client 작업

  1. Main, Sub 레파지토리 만들기
    Main Project Repo https://myrepo.gitlab.com/mainproject.git 부모프로젝트로써 Domain의 시작. 전체 모듈의 구조 정의
    Common Project Repo https://myrepo.gitlab.com/commonproject.git Sub Project 중 하나로 대부분 모듈에서 사용되는 것들의 집합. 얇은 의존성을 위해 프로젝트 내 기타모듈 참조 없음
    Sub Project Repo https://myrepo.gitlab.com/subproject.git Sub Project 중 하나로 서비스 비즈니스를 완성
  2. WorkSpace 이동 후 Main Repository Clone
    $ git clone https://myrepo.gitlab.com/mainproject.git
    $ cd mainproject
  3. Submodule을 경로와 함께 등록해준다
    $ git submodule add -b master ~~/commonproject1.git commonproject
    $ git submodule add -b master ~~/subproject.git subproject
     
  4.  위작업을 하고 나면 Submodule에 대한 정보가 담겨있는 .gitmodules 파일이 생성됨

  5. 위내용도 Main 프로젝트의 변경사항이기 때문에 commit을 수행한다. 
    $ git commit -m "submodue added"​
  6. Maver을 위한 pom.xml 수정
    Main 프로젝트 pom.xml
    <modules>
      <module>common</module>
      <module>sub</module>
    </modules>
      

생성된 프로젝트 개발자 연동(JAVA 기준)

 

Main/Sub Project Eclipse Clone
1. 이클립스의 [Git]-[Clone a Git Repository] 이동
2. URL : 레파지토리 정보입력 후 [Next] 클릭
3. 브랜치 선택 후 [Next] 클릭
4. 상세정보 입력
- Directory를 적절한 WorkSpace로 지정
- Initial Branch : main
- Clone submodules 체크
- Import all existing Eclipse.. 체크
5. [Finish]

 

Git bash Clone And Eclipse Import
1. Clone할 WorkSpace 위치 이동


2. Recursive를 통해 Submodule의 최신 변경사항까지 적용

$ git clone --recurse-submodules https://myrepo.gitlab.com/mainproject.git


3. Submodule까지 Master로 체크아웃

$ git submodule foreach git checkout master


※ submodule update 이후 각 sub project의 git repo는 detached HEAD 상태이므로 코드를 수정하기 전에 이를 작업 branch로 checkout해주어야 한다. 

 

주의사항

※ Main 프로젝트에서 Submodule 사용시 작업 순서
- clone, pull, update : 先 main project → 後 sub project
- push : 先 sub project → 後 main project

※ submodule update 이후 각 sub project의 git repo는 detached HEAD 상태이므로 코드를 수정하기 전에 이를 작업 branch로 checkout해주어야 한다. 

※ Main 레파지토리 경로에서 작업한 Git 명령어는 Main 레파지토리에 동작하고, Submodule 경로에서 실행한 명령어는 단지 Sub 레파지토리에서만 동작한다. 

 

Main Project 속에서 Sub Project 수정방법

 

1. Edit and push Sub Project
각 sub project는 하나의 독립적인 git repo이기 때문에 일반적인 방식으로 수정과 commit, push를 하면 된다. 단, git submodule update 이후에는 sub project의 git repo가 Detached HEAD 상태이기 때문에 코드를 수정하기 전에 다음과 같이 branch를 설정해 주어야 한다.

$ git checkout master
$ git pull


2. Commit Main Project
sub project가 수정되면, main project 입장에서 보면, 자기에게 연결된 sub project의 commit이 변경되게 된 것이다. main project와 sub project의 연결 상태가 갱신되었기 때문에 이를 commit 할 필요가 있다. 이 역시 일반적인 방법으로 commit 한다.

3. Push Main Project
다만 push를 할 때에는 sub project의 코드가 모두 push 되었는지 확인할 필요가 있다. 이를 확인하지 않고 push를 수행하면 어떻게 될까. remote repo에 입장에서 보면 main project에 새로운 sub project의 커밋과 연결이 갱신되었다는 정보만 존재하지만 정작 sub project에는 그러한 커밋이 존재하지 않는 결과가 생길 수 있다.
이 때문에 main project를 push 하기 전에는 sub project의 변경 사항을 모두 remote repo로 push 해 두어야 한다. 이 역시 先 sub 後 main의 법칙을 따른 것이다.
sub project가 많은 경우에 이를 일일이 확인하기 어려우므로 다음과 같이 main project를 push할 때 옵션을 주어 확인할 수 있다.

 

 

주의사항
첫째, main project에서 Commit을 할 때, sub project의 변경사항이 있는 경우 main project 및 sub project 각각 두 번의 Commit을 해 주어야 한다. 이 때, Commit은 반드시 ⓐsub project 먼저, ⓑmain project 나중의 순서로 이루어져야 한다. main project를 먼저 commit 하게 되면 main project는 새로운 sub project의 commit을 참조하지 않게 되기 때문이다.

둘째, sub project의 branch를 확인해야 한다. submodule update를 수행하면 sub project의 repo가 Detached HEAD 상태가 되는 경우가 있다. 이는 어떤 branch에도 속하지 않는 상태를 의미한다. 이런 경우에는 예상치 못한 에러가 발생할 수 있다. 따라서 git checkout master등을 수행하여 원하는 branch로 checkout 해 준 뒤에 코드를 수정해야 한다.