도입 배경
JPA 게시판 과제 진행 중 이메일 & DB & Jwt 관련 민감정보 설정을 담당하는 application-core.yml이라는 파일이 존재했는데, 해당 파일을 그냥 .gitignore에 등록하고 repo에 올렸었다. 그런데 문제는 해당 yml 파일을 다른 사람들이 클론하거나, 팀 프로젝트의 상황에서는 해당 파일을 매번 공유해서 사용하거나 그렇지 않으면 사용할 수 없다.라는 문제가 발생했다. 따라서 해당 문제를 해결하고자 알아보던중 git에서 제공하는 submodule이라는 기술이 존재하여 사용해보려고 한다.
Flow
- 민감정보 데이터를 담을 private repo 생성한다.
- 민감정보가 담긴 private 레포지토리를 public 레포지토리의 서브모듈로 git add submodule ${서브 모듈로 등록할 github repository의 주소} 을 사용해 등록한다.
- 원격 서브모듈 레포지토리에 있는 파일들을 로컬 프로젝트로 가져온다.
Private Repo 생성
- 먼저 민감 정보를 담고 있는 설정 파일을 관리하기 위해 private repository를 생성합니다.
- 생성한 repository에 관리하고자 하는 설정 파일들을 업로드합니다. (필자는 application-core.yml)
private Repo를 public Repo의 서브모듈로 등록
git submodule add -b main ${서브모듈 repo URL}
# -b main은 생략 가능하다
git submodule add -b main ${서브모듈 repo URL} ${디렉토리}
# target 디렉토리를 지정할 수도 있다.
- 디렉토리를 지정하지 않으면, 루트 디렉토리 내에 생성 됩니다.
- 디렉토리를 지정하면, 현재 내 프로젝트에 지정한 디렉토리 부분에 서브모듈로 등록한 것들을 가져옵니다.
등록을 하게 되면, 서브모듈이 생성된 디렉토리와 .gitmodule 파일이 생성됩니다.
// .gitmodules 파일
[submodule "board-api-privates"]
path = board-api-privates
url = ${private repo 깃허브 주소}
주의할 점 !
- 주의할 점은 지정해준 디렉토리내의 application-core.yml 파일은 .gitignore 파일에 추가해주어야 합니다.
- 추가해주지 않으면 submodule의 application-core.yml파일이 public 프로젝트를 push할 때 함께 업로드 될 수 있습니다.
외부인이 클론할 경우
- 예를 들어, 팀원이 해당 프로젝트를 클론할 경우 board-api-privates 디렉토리는 존재하지만 하위에 application-core.yml 파일은 존재하지 않은채로 클론이 됩니다.
- 아래의 명령어를 사용해 submodule로 부터 해당 파일을 가져오도록 하면 사용 가능합니다.
git submodule init
git submodule update
또는 clone 시 --recurse-submodules 옵션을 주면 submodule도 함께 불러온다.
git clone --recurse-submodules ${main repo URL}.git
서브모듈이 업데이트 될 경우
root 디렉토리에서 git submodule update --remote 명령어를 통해 Git이 알아서 submodule을 fetch + update 하도록 할 수도 있다.
# merge가 필요하다면 해줘야한다.
git submodule update --remote --merge
팀원이 원격 저장소에 서브모듈을 등록하고 push 한 경우
이 경우엔 프로젝트를 최신화 해준 후, 서브 모듈들을 일괄적으로 clone해오면 된다.
git pull
git submodule update --init --update
실제로 적용하고 푸쉬하면 ?
- 이런식으로 board-api-privates (서브모듈) 디렉토리가 생긴것을 확인할 수 있다.
이렇게, git에서 제공하는 submodule을 이용하여 민감정보를 담고 있는 yml 설정 파일을 따로 분리 해보았는데 팀원과 협업을 진행할 때에는 상호간 수정이나 사용에 있어 좀 더 신경써야 할 부분들이 늘어날 것 같다 !
< 참고 자료 >