🗯️ 문제 : 민감한 정보는 노출되지 않게 관리 해야한다.
최종 프로젝트를 진행하면서 AWS 계정 정보나 DB 계정 정보 등 민감한 정보들을 application.yml 에 담아야 했습니다.
프로젝트는 협업 및 버전 관리를 위해 Github Repository을 사용하는데, 민감한 정보들이 노출되면 안되므로 이를 숨기는 방법들이 여러가지가 있습니다.
- 외부 서비스 이용
- Spring Cloud Config(Vault), AWS Service Manager
- 설정파일 암호화
- Git Submodule
- Git Secrets 이용
이 중 우리 프로젝트에 적용하기로 결정한 것은 Git Submodule 입니다. 결정한 이유로는 크게
- 기존 코드를 추가 및 수정하는 비용이 제일 적고
- 나름 쉽게?! 적용할 수 있다!
정도로 볼 수 있겠습니다 😄
🔥 해결 방법 : Git Submodule 이용
Git Submodule 이란?
서브모듈은 깃 레포지토리를 사용할 때, 메인 레포지토리(상위)에서 다른 레포지토리(하위)의 파일을 사용할 때, 이 둘을 연결하고 관리하기 위한 도구 입니다. 사용하는 목적은 다양할 수 있겠지만 저희는 민감한 정보(Secret)들을 관리하기 위해 위 도구를 사용하였습니다.
Git Submodule 적용 방법
- private Repository 생성
먼저 민감한 정보들이 담긴 설정파일을 관리할 repository를 private으로 생성해야 합니다.
저희는 ‘Everevent-Kazedon-BE’ Organization을 따로 생성하고( 프로젝트 레포지토리는 프로그래머스 데브코스 Organization에서 public으로 관리되어지고 있습니다.) 해당 Organization에 security라는 private 레포지토리를 생성하였습니다.

- submodule 등록
하위 레포지토리(서브 모듈)을 만들고 설정파일을 두었으면 상위 레포지토리(메인)에서 아래 명령어를 통해 서브모듈을 등록해야 합니다.
git submodule add https://github.com/{사용자명}/{저장소명}.git {폴더명}
폴더명은 resources/config 하위에서 설정파일을 관리하기 위해 resources/config 폴더로 설정하였습니다.
그러면 .gitmodules 파일이 루트 디렉터리에 생성되고 내용은 다음과 같습니다.
[submodule "src/main/resources/config"] path = src/main/resources/config url = https://github.com/Everevent-Kazedon-BE/security.git
- path 정보와 하위 레포지토리 url 을 확인할 수 있습니다.
- 서브 모듈 commit 최신화하기
서브 모듈 레포지토리의 변경 사항을 메인 레포지토리에 적용하기 위해선 서브모듈 레포지토리의 upstream에 반영된 커밋을 메인 레포지토리에 가져와야 합니다.
git submodule update --remote
위 명령어를 실행하게 되면 메인 레포지토리 현재 브랜치의 서브모듈(config) commit을 서브모듈 repository의 최신 commit으로 변경하고 이는 파일 변경 이력으로 남게 됩니다.
+추가)
해당 프로젝트를 진행하는 팀원이 있을 경우, 팀원의 로컬 레포지토리에서도 submodule을 관리해야 할 때는,
git submodule init
위 명령어를 통해 팀원 로컬의 메인 레포지토리에서 .gitmodules 파일에 작성된 submodule을 관리할 수 있습니다.
회고( 거의 예고 )
서브모듈을 프로젝트에 적용한 배경 및 방법에 대해서 간단히 알아보았습니다!
다음 포스팅에선 서브모듈을 다른 organization의 private 레포지토리를 사용함에 따라 github action 을 사용할 때 발생한 문제에 대해서 알아보도록 하겠습니다.