스프링 프로젝트의 .gitignore에 등록되어 있는 *.yml 파일들을 버전관리하기 위해서 git의 submodule이라는 것을 사용하게 되었다.
Git의 Submodule
이란 "Git 저장소 (메인 저장소) 안에 다른 Git 저장소 (서브 저장소 - 재사용 및 공유 가능한 공통 "모듈"들을 주로 의미) 를 디렉토리로 분리해 넣는 것"이다.
이 때 메인 저장소와 서브 저장소의 커밋들은 동기화되지 않으며, 별도로 관리하게 된다.
resources 디렉터리에 application.yml 파일이 있다.
spring:
profiles:
active: aws
그리고 같은 디렉터리에 실질적인 설정 데이터를 가지고 있는 application-local.yml, application-aws.yml이 있어 원하는 profile에 맞게 프로젝트에 적용할 수 있다. 이 두 파일을 git submodule에서 관리하고 싶기 때문에 별도의 디렉터리를 만들고, 스프링 프로젝트에서 이를 인식할 수 있게 해야한다.
sourceSets {
main {
resources{
srcDirs "src/main/resources", "src/main/resources/profile"
}
}
}
build.gradle에 이렇게 추가해주면 프로젝트는 실행될 때 src/main/resources, src/main/resources/profile에서 properties 또는 yml 파일을 찾는다.
먼저 submodule의 저장소를 github에 private으로 만들어 주고, 해당 저장소를 원하는 경로에 submodule로 추가했다.
imad-server/src/main/resources$ git submodule add {repo-url} profile
위와 같이 명령어를 입력하면 현재 경로에서 profile이라는 디렉터리를 생성하고 거기에 저장소를 clone 한다. 프로젝트 루트에 .gitmodules
라는 파일이 생기는데 내용은 다음과 같다.
[submodule "src/main/resources/profile"]
path = src/main/resources/profile
url = {repo-url}
특이하게 submodule로 생성된 디렉터리는 일반적인 디렉터리가 아니라 파일로 관리된다. 그렇기 때문에 기존에 있던 git에서는 해당 디렉터리 내의 변화를 트래킹할 수 없다.