✍️ 개발 기록

[🎵MIML] 서브모듈(Submodule)을 사용하여 개발 효율 개선하기

ming412 2023. 10. 23. 16:11

프로젝트를 진행하면서 민감한 환경 변수를 보호하는 것을 매우 중요하게 생각한다.

 

이제까지는 간단히 `application-xxx.yml` 파일을 `.gitignore`에 등록하여 관리했는데,

협업을 진행하다보면 팀원들에게 설정 파일의 변경 사항을 공유하는 것을 잊기도 하여 이러한 방식의 문제를 인식하게 되었다.

 

해결 방법을 고민하던 중, 이전에 협업을 같이한 팀원이 언급했던 '서브모듈'에 대해 떠올리게 되었다.

 

서브모듈에 대해 알아보니 내가 원하던 아래 두 가지 조건을 모두 만족시킬 수 있는 방법임을 깨닫고 도입하게 되었다.

1. git에 직접적으로 내용이 노출되지 않아야 한다.

2. 번거롭게 파일로 주고받을 필요 없이 git을 통해 형상관리를 할 수 있다.

 

🟠 서브모듈 적용 방법

1. 민감 정보를 담을 private 레포지토리 생성

 

2. 서브모듈 등록

진행하고 있던 프로젝트(로컬)에서 아래 커맨드를 실행한다.

git submodule add https://github.com/{organization}/{서브모듈로 사용할 레포지토리}.git config
🙋‍♀️ 스프링부트가 설정 파일을 인식할 수 있는 경로가 몇 가지 있는데, 프로젝트 최상위 계층의 `config` 디렉토리 하위도 자동으로 인식이 가능하다.

 

3. 원격 레포지토리로부터 서브모듈 가져오기

* 시나리오에 따른 분류

 

1) 프로젝트를 진행 중 서브모듈이 생겼을 경우

$ git submodule init
$ git submodule update --remote

 

2) 서브모듈이 등록된 프로젝트를 처음 클론하는 경우

// 서브 모듈을 포함한 프로젝트 클론하기
$ git clone --recurse-submodules https://github.com/devHudi/super-repository.g

 

3) 서브모듈을 포함하여 프로젝트 진행 중 서브모듈이 타인에 의해 수정되었을 경우

// 서브 모듈 최신 커밋 가져오기 (원격 config 레포에서 변경사항 커밋&푸시 후 -> 로컬에서 아래 커멘드 실행)
$ git submodule update --remote

 

4) 서브모듈을 포함하여 프로젝트 진행 중 내가 로컬에서 서브모듈을 수정한 경우

// git 이 메인프로젝트를 push 하기 이전에 submodule 로 들어가서 push 를 해 준 후, 메인프로젝트를 push 해주는 옵션이다.
$ git push --recurse-submodules=on-demand

 

🟠 주의할 점

서브모듈에 수정 사항이 생겼는데, 이를 무시하고 그냥 내 작업을 push 하려고 한다면 아래와 같은 상황을 마주하게 된다.

 

따라서 서브모듈에 수정 사항이 생겼다면, 반드시 이를 먼저 push하고 내 작업을 push 해야 한다!

 

로컬에서 코드를 push할 때, 위 문제를 해결하기 위한 두 가지 방법이 있다.

$ git push --recurse-submodules=check
or
$ git push --recurse-submodules=on-demand

첫 번째 명령어는 서브모듈의 로컬 커밋이 remote 로 push 되지 않았다면, 메인프로젝트의 push 를 실패하도록 하는 옵션이다.
두 번째 명령어는 git 이 메인프로젝트를 push 하기 이전에 submodule 로 들어가서 push 를 해 준 후, 메인프로젝트를 push 해주는 옵션이다.

 

🟠 서브모듈 등록 완료

등록을 완료했다면, 아래와 같은 모습을 볼 수 있다. 🎉

 

🟠 참고 자료

Github private repository로 설정파일 관리하기

Git의 서브모듈(Submodule)

[Git] git submodule을 이용하여 중요한 정보 숨기기

Git Submodule 알아보기