Git의 서브모듈(submodule)이란?

    반응형

    서브모듈(submodule)


    회사에서 개발을 진행하면서 만났던 생소했던 단어,, 서브모듈

     

    서브모듈이 도대체 뭘까? 궁금해하면서 나중에 공부해야지 한 게 어느덧 한 달..ㅎ

     

    이제야 정리합니다 서브모듈 가즈아~

     

     

    1. 서브모듈이란?

     

    우선 이 서브모듈이란 게 뭔지부터 알아볼까요.

     

    서브모듈은 여러 개의 Git Repository를 하나의 repository로 관리할 수 있도록 하는 기능인데요.

     

    이렇게 들으면 이게 무슨 얘기인지 긴가민가 할 수 있습니다.

     

    예시를 들어볼까요?

     

    흔히들 회사에서 공통적으로 많이 사용되는 레포는

    1. 디자인 시스템

    2. 코어 코드(ex. 지도 관련 코드)

     

    등등이 있을 거라 생각합니다. 지도 관련 코드라고 얘기한 것은 제가 다니는 회사는 거의 모든 제품에 지도 관련 코드가 들어가다 보니 레포를 따로 파서 지도에 관련된 공통 코드들을 관리 중에 있습니다.

     

    그러면 현재 디자인 시스템에 관련된 레포 A, 코어 코드에 관련된 레포 B가 존재한다고 했을 때 A와 B를 모두 사용하는 프로젝트를 진행한다고 생각해 볼까요?

     

    그때 이 서브모듈을 사용해서 레포 A, 레포 B를 새로 진행하는 프로젝트에 포함시킬 수 있습니다.

     

    중요한 점은 이 프로젝트에서 A와 B의 소스코드를 수정하고 커밋해도 원래 본 코드에는 영향을 주지 않습니다.

     

    조금은 이해가 됐을까요?

     

    2. 서브모듈 사용 시 장점 및 주의할점

    이렇게 서브모듈을 사용하면, 각각의 프로젝트를 독립적으로 관리할 수 있기 때문에

     

    여러 프로젝트에서 같은 코드를 사용할 때 코드 중복을 줄일 수 있고

     

    라이브러리를 포함한 프로젝트의 관리가 용이해진다는 장점이 있습니다.

     

    서브모듈을 사용하면서 주의(?)할 점이 있다면

     

    부모 프로젝트는 서브모듈의 commit ID만을 가리키고 있으며, 서브모듈의 변경사항을 부모 프로젝트와 별개로 처리해야 한다는 점입니다.

     

    서브모듈을 clone 하면, 서브모듈의 최신 버전이 아닌 commit ID가 checkout이 됩니다.

     

    더보기

    서브모듈을 clone 하면 서브모듈의 최신 버전이 아닌 commit ID가 checkout이 되는 게 무슨 소리인지 살짝 이해가 어려울 수 있는데요.

     

    서브모듈은 부모 프로젝트와 별개의 Git 저장소이기 때문에, 서브모듈을 clone 할 때는 최신 버전이 아닌 특정 commit ID가 checkout 됩니다. 따라서 서브모듈을 사용하려면, 해당 서브모듈 디렉터리에서 git pull 명령어를 실행해서 최신 버전으로 업데이트해야 합니다.

     

    예를 들어, 부모 프로젝트에서 서브모듈을 추가하고 commit 한 후 다른 개발자가 이 부모 프로젝트를 clone 하면, 서브모듈의 최신 버전이 아닌 특정 commit ID가 checkout 되어 있습니다. 따라서 다른 개발자가 서브모듈을 사용하려면, 해당 서브모듈 디렉터리에서 git pull 명령어를 실행해서 최신 버전으로 업데이트해야 합니다. 이때, 부모 프로젝트에서는 git submodule update 명령어를 사용해서 서브모듈을 업데이트할 수 있습니다.

     

    그래서 이 서브모듈을 업데이트하려면, 부모 프로젝트 내에서 git submodule update 명령어를 사용해야 하며

     

    서브모듈의 최신 버전으로 업데이트하려면 각각의 서브모듈에서 git pull 명령어를 사용해야 합니다.

     

    3. 서브모듈 설정방법

     

    이제 서브모듈을 설정하는 방법을 간단히 알아볼 건데요.

     

    1. 부모 프로젝트의 루트 디렉터리로 이동합니다.

    2. git submodule add 명령어를 사용해 submodule을 추가해 줍니다.

        이때, 첫 번째 인자로는 submodule의 원경 저장소 URL을 전달하고

        두 번째 인자로 submodule을 저장할 로컬 디렉터리 이름을 지정합니다.

    git submodule add <원격 저장소 URL> <로컬 디렉토리 이름>

    3. git submodule init 명령어를 사용해 submodule을 초기화해줍니다.

         이때, .gitmodules 파일이 생성됩니다.

    git submodule init

    4. git submodule update 명령어를 사용해 submodule을 업데이트합니다.

        이때, submodule에서 사용하는 코드가 최신 버전인지 확인하고, 최신 버전이 아니라면 최신 버전으로 업데이트합니다.

    git submodule update

     

    이렇게 하면 submodule이 추가되고 초기화된 것입니다. 이제 부모 프로젝트에서 submodule을 사용할 수 있습니다!

     

    submodule에서 변경된 코드는 부모 프로젝트에서 submodule을 업데이트하면 적용됩니다.

     

    ** submodule을 삭제하고 싶다면?

    git submodule deinit submodule-name

    이후 .gitmodules 파일에서 해달 submodule에 대한 설정을 삭제한 뒤 .git/config 파일에서 submodule 설정을 삭제합니다.

     

    그다음 submodule 디렉토리를 삭제하면 됩니다.

    rm -rf submodule-directory

     

    반응형

    댓글