[Project] Git Submodule 적용기

bagt13·2023년 3월 10일
0

Project

목록 보기
7/17
post-thumbnail

🖥️ Git Submodule 적용 계기

application.yml과 같은 설정 파일에는 DB 접속 정보, secret key 등 민감한 정보가 들어있기 때문에, 일반적으로 .gitignore를 통해 repository에 올라가지 않도록 한다.

하지만 이 경우 배포할 때 설정 파일에 대한 추가적인 작업이 필요하다. 설정 파일을 외부에 노출하지 않고 배포하는 방법에는 다음과 같은 방법들이 존재한다.

  1. 배포 시 배포 서버에서 직접 파일을 넣어준다

    • 배포할때마다 작업해줘야하기 때문에 번거롭다.
    • 만일 서버가 여러대라면, 각 서버마다 환경 변수 세팅을 해줘야 하므로, 이 방법은 사용하지 않는게 좋다.
  2. Spring Cloud Config와 같은 외부 서비스 연동

  3. Git Submodule 사용

나는 2번과 3번 중 비교적 쉬운 방법인 Git Submodule을 사용하기로 했다.


📚 Git Submodule이란?

repository 내부에 디렉토리 형태로 존재하는 repository로써, 외부 라이브러리나 다른 repository의 데이터를 내 repository에 추가하고 싶을 때 사용할 수 있다.

현재 나는 설정 파일 관리를 위해 사용하는 것이기 때문에, private repository로 생성해야 한다. submodule을 적용하면 해당 submodule의 repository가 디렉토리 형태로 생성된다.

📙 서브모듈 저장소 생성

private으로 생성 후 필요한 설정 정보를 입력해준다.


📙 프로젝트에 Submodule 추가

git submodule add -b main ${서브모듈 repo URL} 
# -b main은 생략 가능하다

git submodule add -b main ${서브모듈 repo URL} ${디렉토리}
# target 디렉토리를 지정할 수도 있다.

Submodule을 추가하면 서브 모듈 repository의 이름과 같은 이름의 디렉토리가 생성된다. 또한 해당 디렉토리와 서브모듈 repository의 매핑 정보를 담은 .gitmodules라는 파일도 함께 생성된다.

이제 변경 내용을 원격으로 push하면 다음과 같이 submodule 디렉토리가 생성된 것을 확인할 수 있다.

이제 위에 있는 application-local.yml, application-prod.yml더이상 민감 정보를 가지고 있지 않는다. 대신, Submodule 디렉토리로부터 설정 정보를 주입받도록 했다.

application-local.yml 예시

spring:
  config:
    activate:
      on-profile: local
    import:
      - security/application.yml
      - security/application-datasource.yml
      - security/application-cloud.yml

❗️ 주의할 점

Main Repo와 Submodule은 별개의 프로젝트로 관리된다.

즉, Main Repo에서 Submodule의 내용을 직접 변경할 수 없기 때문에, 설정 파일에 수정 사항이 생길 경우 Submodule Repo에 직접 접근하여 수정해야 한다.

반대의 경우도 마찬가지이다. Submodule Reop에 작성된 설정 파일의 내용이 변경되어도 Main Repo는 알지 못한다. 따라서 변경 사항이 생길때 직접 최신화된 Submodule로 업데이트 해주어야 한다.


📙 Submodule Clone

Submodule을 가지고 있는 프로젝트를 clone할 경우, 기본적으로 Submodule 디렉토리는 존재하지만 내용은 비어있는 상태이다.

Submodule Repo의 내용도 함께 가져오려면 아래와 같은 명령어를 추가적으로 입력해주어야 한다.

git submodule init # Submodule 디렉토리를 git 로컬 저장소로 초기화해준다. (git init처럼)
git submodule update # 원격 Main Repo가 기억하는 submodule의 특정 커밋 시점으로 업데이트

또는 clone 시 --recurse-submodules 옵션을 주면 submodule도 함께 불러온다.

git clone --recurse-submodules ${main repo URL}.git

❌ private repo(서브모듈 저장소)에 대한 권한이 없는 사용자의 경우

private repo, 즉 서브모듈에 대한 권한이 없는 사용자는 git submodule update 명령어 시도 시 실패하게 된다.



📙 Submodule Update

Submodule을 최신으로 업데이트하려면 Submodule 디렉토리로 이동하여 git fetch + git merge를 통해 upstream의 브랜치를 merge해주면 된다.

git fetch
git merge origin/main

또는 root 디렉토리에서git submodule update --remote 명령어를 통해 Git이 알아서 submodule을 fetch + update 하도록 할 수도 있다.

git submodule update --remote --merge
# merge가 필요하다면 해줘야한다.

Update 시도

Update 결과


📘 팀원이 원격 저장소에 서브모듈 등록 후 Push한 경우

이 경우엔 프로젝트를 최신화 해준 후, 서브 모듈들을 일괄적으로 clone해오면 된다.

git pull
git submodule update --init --update

📃 References

profile
주니어 백엔드 개발자입니다😄

0개의 댓글