application.yml과 같은 설정 파일에는 DB 접속 정보, secret key 등 민감한 정보가 들어있기 때문에, 일반적으로 .gitignore
를 통해 repository에 올라가지 않도록 한다.
하지만 이 경우 배포할 때 설정 파일에 대한 추가적인 작업이 필요하다. 설정 파일을 외부에 노출하지 않고 배포하는 방법
에는 다음과 같은 방법들이 존재한다.
배포 시 배포 서버에서 직접 파일을 넣어준다
사용하지 않는게 좋다
.Spring Cloud Config와 같은 외부 서비스 연동
Git Submodule 사용
나는 2번과 3번 중 비교적 쉬운 방법인
Git Submodule
을 사용하기로 했다.
repository 내부에 디렉토리 형태로 존재하는 repository로써, 외부 라이브러리나 다른 repository의 데이터를 내 repository에 추가하고 싶을 때 사용할 수 있다.
현재 나는 설정 파일 관리를 위해 사용하는 것이기 때문에, private repository
로 생성해야 한다. submodule을 적용하면 해당 submodule의 repository가 디렉토리 형태로 생성된다.
private으로 생성 후 필요한 설정 정보를 입력해준다.
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 디렉토리로부터 설정 정보를 주입받도록 했다.
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 디렉토리는 존재하지만 내용은 비어있는 상태이다.
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, 즉 서브모듈에 대한 권한이 없는 사용자는
git 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가 필요하다면 해줘야한다.
이 경우엔 프로젝트를 최신화 해준 후, 서브 모듈들을 일괄적으로 clone해오면 된다.
git pull
git submodule update --init --update