데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      Git Submodule 사용하기

      heewon.ko 23.08.01
      36,088 14 0

      구조적이고 재사용 가능한 프로그램을 만들기 위해서 "공통으로 사용될 수 있는 코드는 모듈로 만들자" 는 소프트웨어 개발의 중요한 철학 중 하나입니다.


      특히 MSA (Micro Service Architecture) 구조의 서비스 아키텍쳐를 채택할 경우,

      각 micro service 에서 공통으로 사용하는 모듈 (ex. 외부 API 에 request 를 보내기 위한 client,

      여러 서비스에서 공통으로 사용하는 cache 핸들링 등) 을 각각의 서비스에서 별도로 관리하다보면 코드 간 동기화가 깨지는 경우가 발생하기 마련이고 유지보수도 어렵게 됩니다.


      이러한 문제를 해결하기 위해서, Git 의 Submodule 기능을 프로젝트에 도입하는 방법을 알아봅시다.


      Submodule (서브모듈) 이란?

      먼저 서브모듈에서 "모듈" 이란 무엇일까요? 모듈이란, 소프트웨어 설계에서 기능단위로 분해하고 추상화 되어 재사용 및 공유 가능한 수준으로 만들어진 단위입니다.

      Git 에서의 서브 모듈은 "Git 저장소 (메인 저장소) 안에 다른 Git 저장소 (서브 저장소 - 재사용 및 공유 가능한 공통 "모듈"들을 주로 의미) 를 디렉토리로 분리해 넣는 것" 입니다.

      이 때, 메인 저장소와 서브 저장소의 커밋들은 동기화되지 않으며, 별도로 관리하게 됩니다.


      서브 모듈 시작하기

      먼저, 서브 모듈을 사용하기 위해 메인 저장소와 서브 저장소를 각각 "main-repo" 와 "sub-repo" 의 이름으로 생성합니다.

      서브모듈을 포함하고자 하는 메인 프로젝트를 다운 받아봅시다.

      > git clone git@github.com:user/main-repo.git
      Cloning into 'main-repo'...

      그리고, 메인 프로젝트에서 다음 명령어를 실행하여 submodule 을 추가합니다.

      git submodule add [repo-url] [path]

      여기서 repo-url 은 추가하고자 하는 서브모듈 저장소의 URL, path 는 submodule 을 포함시킬 하위 디렉토리의 path 를 의미합니다.

      > git submodule add git@github.com:user/sub-repo.git sub
      Cloning into '/Users/dev/main-repo/sub'...
      remote: Enumerating objects: 3, done.
      remote: Counting objects: 100% (3/3), done.
      remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
      Receiving objects: 100% (3/3), done.

      git status 를 실행하여 현재 프로젝트에서 변경된 사항을 출력해봅시다.

      > git status
      On branch main
      
      No commits yet
      
      Changes to be committed:
        (use "git rm --cached <file>..." to unstage)
      	new file:   .gitmodules
      	new file:   sub

      .gitmodules 라는 파일과, sub 라는 디렉토리가 새로 생긴 것을 확인할 수 있습니다.

      .gitmodules 는 다음과 같이, 서브 디렉토리와 하위 프로젝트 URL 의 매핑 정보를 담은 설정 파일입니다.

      > vi gitmodules
      [submodule "sub"]
              path = sub
              url = git@github.com:user/sub-repo.git

      path 에는 submodule 이 들어있는 경로가, url 에는 서브 저장소의 url 이 매핑되어 있습니다.


      이제 서브 모듈을 추가한 내용을 다음과 같이 메인 저장소의 remote 로 push 합니다.

      > git add .
      > git commit -m "feat: add submodules"
      [main (root-commit) 2f513f5] feat: add submodules
       2 files changed, 4 insertions(+)
       create mode 100644 .gitmodules
       create mode 160000 sub
      > git push
      Enumerating objects: 3, done.
      Counting objects: 100% (3/3), done.
      Delta compression using up to 12 threads
      Compressing objects: 100% (3/3), done.
      Writing objects: 100% (3/3), 318 bytes | 318.00 KiB/s, done.
      Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
      To github.com:user/main-repo.git
       * [new branch]      main -> main

      이러한 과정을 거치면, 메인 프로젝트에서 서브모듈을 시작할 준비는 완료됩니다!


      서브 모듈을 포함한 프로젝트 Clone 하기

      서브모듈을 포함한 메인 프로젝트를 최초로 Clone 할 때에는 일반 프로젝트와 다르게 서브모듈에 대한 몇 가지 설정을 해주어야 합니다.

      바로, 1) 서브모듈 초기화 2) 서브모듈 업데이트 (리모트 저장소로부터 pull 받아오기) 두 가지 과정입니다.


      이 과정을 각각 수행하려면 다음과 같이 진행합니다.


      먼저, 메인 레포지토리를 clone 받아옵니다.

      > git clone git@github.com:user/main-repo.git
      Cloning into 'main-repo'...
      remote: Enumerating objects: 3, done.
      remote: Counting objects: 100% (3/3), done.
      remote: Compressing objects: 100% (3/3), done.
      remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
      Receiving objects: 100% (3/3), done.

      다음으로 서브모듈을 초기화합니다. 서브 모듈 정보를 기반으로 로컬 환경설정 파일 준비하는 과정입니다.

      > git submodule init
      Submodule 'sub' (git@github.com:user/sub-repo.git) registered for path 'sub'

      마지막으로, 서브모듈을 업데이트 (리모트 저장소로부터 pull 받아오기) 합니다.

      서브모듈 remote 저장소에서 데이터를 가져오고, 서브모듈을 포함한 프로젝트의 현재 스냅샷에서 Checkout 해야 할 커밋 정보를 가져와서 서브모듈 프로젝트에 대한 Checkout 하는 과정입니다.

      > git submodule update
      Cloning into '/Users/user/dev/main-repo/sub'...
      Submodule path 'sub': checked out '7e39f89295c7886ce1c60aa67a205063fe52e146'

      이러한 과정을 clone 하면서 한번에 수행하고 싶다! 라고 하면, 다음과 같이 진행해주시면 됩니다.

      > git clone --recurse-submodules git@github.com:user/main-repo.git
      Cloning into 'main-repo'...
      remote: Enumerating objects: 3, done.
      remote: Counting objects: 100% (3/3), done.
      remote: Compressing objects: 100% (3/3), done.
      remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
      Receiving objects: 100% (3/3), done.
      Submodule 'sub' (git@github.com:user/sub-repo.git) registered for path 'sub'
      Cloning into '/Users/dev/main-repo/sub'...
      remote: Enumerating objects: 6, done.
      remote: Counting objects: 100% (6/6), done.
      remote: Compressing objects: 100% (2/2), done.
      remote: Total 6 (delta 0), reused 6 (delta 0), pack-reused 0
      Receiving objects: 100% (6/6), done.
      Submodule path 'sub': checked out '7e39f89295c7886ce1c60aa67a205063fe52e146'

      과정을 살펴보면,

      1. 먼저 main-repo 의 데이터를 clone 받아오고,

      2. 서브 모듈을 초기화 (지정된 path 에 module 을 등록)

      3. 서브모듈을 업데이트 (리모트 저장소로부터 pull 받아오기) 하는 순서로 진행된 것을 확인할 수 있습니다.


      서브모듈의 상태 확인 및 변경 사항 적용하기

      프로젝트를 진행하다보면, 서브 모듈 레포지토리에 변경 사항이 발생할 때가 있을 것입니다. 앞서 말씀드린 것처럼,

      메인 프로젝트의 커밋과 서브모듈의 커밋은 독립적으로 동작하기 때문에,

      서브 모듈의 변경사항이 발생할 때 해당 사항이 메인 프로젝트에 자동으로 반영되지 않습니다. 이 부분이 서브 모듈 사용 시에 주의해야 할 포인트입니다.


      메인 프로젝트에서 사용 중인 서브 모듈이 이전 버전을 반영하고 있을 수 있는 것이죠. 이를 방지하기 위해 다음과 같이 서브 모듈의 상태를 주기적으로 확인하고, 변경 사항이 있을 시 적용해주는 것이 중요합니다.


      서브모듈의 상태를 확인하기 위해서는 다음의 커멘드를 실행합니다.

      > git submodule status
       07b6383bae047572b5c4c7b8e41b5cdd7935c9c8 sub (heads/main)

      head 가 메인에 있으며, commit ID 를 확인해보니 최신 commit 을 가리키고 있는 것으로 보입니다.


      서브 모듈에 약간의 변경 사항을 적용하여 push 해보겠습니다.

      > git add test.py
      > git commit -m "fix: add submodule"
      [main 7e39f89] fix: test.py
      1 file changed, 1 insertion(+), 1 deletion(-)
      > git push
      Enumerating objects: 5, done.
      Counting objects: 100% (5/5), done.
      Writing objects: 100% (3/3), 267 bytes | 267.00 KiB/s, done.
      Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
      To github.com:user/sub-repo.git
         07b6383..7e39f89  main -> main

      서브 모듈에 의 새로운 커밋을 push 하였습니다.


      다시 서브모듈의 상태를 확인하기 위해 다음의 커멘드를 실행합니다.

      > git submodule status
       07b6383bae047572b5c4c7b8e41b5cdd7935c9c8 sub (heads/main)

      head 가 메인에 있으며, commit ID 를 확인해보니 여전히 이전 commit 을 가리키고 있는 것으로 보입니다.


      서브 모듈의 최신 상태를 업데이트하기 위해 다음의 커멘드를 실행합니다.

      > git submodule update —remote
      remote: Enumerating objects: 5, done.
      remote: Counting objects: 100% (5/5), done.
      remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
      Unpacking objects: 100% (3/3), 247 bytes | 49.00 KiB/s, done.
      From github.com:user/sub-repo
         07b6383..7e39f89  main       -> origin/main
      Submodule path 'sub': checked out '7e39f89295c7886ce1c60aa67a205063fe52e146'

      다시 서브 모듈의 상태를 확인해봅시다.

      > git submodule status
      +7e39f89295c7886ce1c60aa67a205063fe52e146 sub (remotes/origin/HEAD)

      서브 모듈의 두 번째 commit ID 7e39f89295c7886ce1c60aa67a205063fe52e146 가 보여지고 있네요.

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      heewon.ko 님의 최신 블로그

      더보기
      동영상 기고하기