개발일지

[Git] SubModule에 대해서

Tommy__Kim 2024. 4. 16. 15:36

들어가기 앞서

최근에 프로젝트에 투입되어 Github에 있는 code를 다운로드하여 확인하는 도중 특정 module 하위에 아무런 코드가 존재하지 않아

컴파일 에러가 나 당황했던 적이 있습니다. 동료에게 물어보고 도움을 받을 때 간단한 코드 두줄만에 해결이 되었습니다.

git submodule init 
git submodule update

 

그 당시 github에서 제공하는 submodule에 대해 몰랐었고, 이러한 부분들에 대해 정리를 해 보고자 합니다. 

 

SubModule이란 무엇인가?

git의 공식 홈페이지에는 다음과 같이 정의되어 있습니다. 

프로젝트를 수행하다 보면 다른 프로젝트를 함께 사용해야 하는 경우가 종종 있다. 함께 사용할 다른 프로젝트는 외부에서 개발한 라이브러리라던가 내부 여러 프로젝트에서 공통으로 사용할 라이브러리 일 수 있다. 이런 상황에서 자주 생기는 이슈는 두 프로젝트를 서로 별개로 다루면서도 그중 하나를 다른 하나 안에서 사용할 수 있어야 한다는 것이다. 
Git의 서브모듈은 이런 문제를 다루는 도구다. Git 저장소 안에 다른 Git 저장소를 디렉터리로 분리해 넣는 것이 서브 모듈이다. 다른 독립된 Git 저장소를 Clone 해서 내 Git 저장소 안에 포함할 수 있으며 각 저장소의 커밋은 독립적으로 관리한다.

 

쉽게 말하자면 다음과 같은 상황이 있다고 가정해보겠습니다. 

 

만약 Common 모듈이 각 모듈(Api, Admin, Member)에 속해 있다면, Common의 기능 중 일부분이 변경될 경우 총 세 번의 변경이 발생하게 됩니다. 그러나 Common 모듈도 독립적으로 관리할 수 있다면, 총 한 번의 변경만 발생하게 됩니다. 

즉, 하위 모듈의 형상관리를 직접 할 수 있도록 하는 방식이 SubModule 방식입니다.

 

SubModule의 장단점

장점

  1. 모듈화
    • 코드 베이스를 보다 관리를 효율적으로 할 수 있음
    • 각 서브모듈은 특정 기능이나 컴포넌트를 담당해 프로젝트의 모듈성을 향상함
  2. 의존성 관리
    • 외부 라이브러리나 프로젝트를 서브모듈로 포함함으로써 의존성 관리가 용이해짐
    • 프로젝트에서 복잡한 의존성 구성을 줄여줌
  3. 효율적인 협업
    • 다양한 팀 또는 조직이 독립적으로 작업하고 결과물을 통합할 수 있는 효율적인 방법을 제공

단점

  1. 관리 복잡성
    • 서브모듈은 초기 설정과 일상적인 사용이 복잡할 수 있으며, 적절한 관리가 필요
    • 예를 들어, 서브모듈의 변경사항을 추적하거나 업데이트하는 과정에서 추가적인 명령어 입력이 요구됨
  2. 학습 곡선
    • 서브모듈은 Git의 기본 기능보다 복잡하므로, 새로운 사용자에게 학습 곡선이 가파를 수 있음
  3. 동기화 문제
    • 서브모듈과 메인 프로젝트 간의 동기화를 제대로 관리하지 않으면, 예상치 못한 문제가 발생할 수 있음
    • 예를 들어, 서브모듈을 업데이트하지 않고 상위 모듈을 업데이트하면 의존성 문제가 발생할 수 있음

SubModule 실습

간단하게 README 파일로 실습을 해보고자 합니다. 

해당 실습에서는 총 세개의 폴더를 사용하며 mac을 기준으로 실습하고자 합니다.

  • api-module : 서브 모듈을 포함할 모듈
  • module1, module2 : 서브 모듈 

각 모듈은 github repository를 가지고 있습니다. 

 

상위 모듈 설정 

github에 임의의 repository를 한 개 만들어 주시고, 실습을 진행해 주시면 됩니다.

cd Desktop

mkdir api-module
cd api-module
git init
echo "# API Module" > README.md
git add README.md
git commit -m "Initial commit"

# api 모듈을 원격 저장소에 푸시 (GitHub 등)
git remote add origin <remote-url-for-api-module>
git push -u origin master

cd ..

 

하위 모듈 1, 2설정

github에 임의의 repository를 두 개 만들어 주시고, 실습을 진행해 주시면 됩니다. 

# 모듈 1 생성
mkdir module1
cd module1
git init
echo "# Module 1" > README.md
git add README.md
git commit -m "Initial commit for Module 1"
# 모듈 1을 원격 저장소에 푸시 (GitHub 등)
git remote add origin <remote-url-for-module1>
git push -u origin master

cd ..
# --------------------------------------------

# 모듈 2 생성
mkdir module2
cd module2
git init
echo "# Module 2" > README.md
git add README.md
git commit -m "Initial commit for Module 2"
# 모듈 2를 원격 저장소에 푸시
git remote add origin <remote-url-for-module2>
git push -u origin master

cd ..

 

서브모듈로 추가 

상위 모듈인 api-module에 module1, module2를 서브모듈로 추가합니다.

여기서 <remote-url-for-module1> 에는 바로 위에서 만든 github repository 주소를 입력해 주면 됩니다. 

# api-module 디렉토리로 이동
cd api-module

# module1 추가
git submodule add <remote-url-for-module1> modules/module1
# module2 추가
git submodule add <remote-url-for-module2> modules/module2

# 서브모듈 추가 확인 및 커밋
git status
git add .
git commit -m "Add submodules: module1 and module2"
git push -u origin master

cd ..

 

새로운 폴더 생성 

다음의 명령어를 입력해줍니다.

mkdir api-module2
cd api-module2
git init
git remote add origin <remote-url-for-api-module>
git pull origin master

cd ..

pull을 하게 되면, modules 하위 submodule 관련 코드들이 생성되지 않은 것을 확인하실 수 있습니다.

이 경우에 대해 다음의 명령어를 사용하면 코드를 확인할 수 있습니다. 

git submodule init
git submodule update

 

 

submodule 업데이트 후 동기화

submodule이 업데이트된 후 동기화는 어떻게 진행하는지 알아보도록 하겠습니다. 

module2의 README.md 파일을 수정합니다. 

cd module2
vi README.md 
** README 파일 수정 **
git commit -m "Update README.md"
git push origin master

cd ..

 

submodule의 형상 번호가 변경되었으므로, submodule을 업데이트해 주어야 합니다. 

업데이트의 경우 git submodule update --remote 명령어를 사용합니다. 

# api-module 업데이트 
cd api-module

git submodule update --remote 
git commit -am "Update SubModule references"

 

파일을 열어 확인을 해 보시면 새로 commit 한 버전으로 파일이 변경된 것을 확인하실 수 있습니다. 

 

마치며

이렇게 Github의 SubModule에 대해서 알아보았습니다. 

SubModule을 사용한다면 보다 효율적으로 MultiModule을 관리할 수 있을 것이라고 생각되네요.

 

참고자료 

[1] Git 공식 홈페이지