Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

kym8821 님의 블로그

[Spring Boot] Spring Boot 설정 파일 분리 : submodule 본문

Spring

[Spring Boot] Spring Boot 설정 파일 분리 : submodule

kym8821 2025. 3. 31. 23:51

Spring Boot 설정 파일 관리

프로젝트를 진행하며 기존에는 google drive 혹은 카카오톡을 통해 설정 파일을 관리했다.

하지만, 설정 파일 버전 관리와 수동으로 공유하는 과정에서 어려움과 수고스러움이 있었다.


이러한 문제를 해결하기 위해서 spring boot의 설정 파일 관리 방법에 대해서 알아보았다.

github secrets vs github submodule

설정 파일 저장 방식을 결정하기 위해 github sercrets와 git submodule을 비교했다.

 

보안 측면에서는 github secrets가 좋은 선택지였지만, 설정 정보의 버전 관리와 공유 측면에서 git submodule을 사용하기로 결정했다

 

git submodule을 활용한 설정 파일 관리

git submodule 기초 개념

우선 해당 방법을 사용하기 전에 github submodule에 대해서 알고 넘어가자.

 

git submodule은 하나의 리포지토리에서 다른 리포지토리를 포함 및 관리할 수 있는 기능이다.

다른 독립적인 저장소를 clone하여 현재 저장소에 포함할 수 있고, 각 저장소의 커밋은 독립적으로 관리된다.

해당 기술을 사용하면 독립적인 프로젝트를 포함하면서도 원본 저장소와의 연계를 유지할 수 있기에 공통 라이브러리를 관리하기 적합하다.

 

submodule로 설정 파일을 관리하는 과정

우선 아래 순서에 따라서 따라서 전체적인 설정 파일 세팅이 완료된다.

 

1. private repository 생성 및 application.yml 업로드

2. 설정 파일을 적용하려는 프로젝트에서 서브모듈 생성

3. build.gradle에 서브모듈 copy 설정 추가

4. .gitignore에 설정 파일 추가

5. github에 해당 변경사항 업로드

 

이젠 각 단계를 세부적으로 알아보자.

1. private repository 생성 및 application.yml 업로드

설정 파일은 민감한 정보이기에, 허용된 사용자만 접근할 수 있어야 한다.

따라서 이러한 설정 파일들은 private repository에서 관리한다.

 

나는 아래와 같은 파일 구조로 설정 파일들을 생성 및 github에 업로드했다.

.
└── dev
    ├── discovery-service
    │   └── application.yml
    ├── gateway-service
    │   └── application.yml
    └── user-service
        └── application.yml

 

재차 강조하지만, 왠만하면 설정 파일은 private repository에 저장해야 한다.

2. 기존 리포지토리에서 서브모듈 생성하기

 두 번째 단계에서는 기존에 생성한 설정 파일 리포지토리를 프로젝트 리포지토리의 서브 모듈로 생성하는 단계이다.

해당 과정은 간단한 명령어를 통해서 완료될 수 있다.

git submodule add {사설 리포지토리 주소}

 

해당 명령어가 성공적으로 실행되었다면, .gitmodules와 기존에 생성한 설정 파일 리포지토리가 추가된다.

여기서 gitmodules는 서브디렉토리와 하위 프로젝트 URL의 매핑 정보를 담은 설정파일이다.

 

또한, git status를 통해 서브 모듈과 동일한 이름의 파일이 변경사항에 추가된 것을 확인할 수 있다.

git은 이러한 서브 모듈의 수정사항을 직접 추적하지 않는다. 대신 서브 모듈 디렉토리를 특별한 커밋으로 취급한다.

3. build.gradle에 서브모듈 copy 설정 추가

다음으로 서브모듈의 설정파일을 실제 프로젝트의 설정파일 위치에 복사하는 작업을 진행한다.

해당 작업은 build.gradle에 task를 추가하는 방식으로 진행된다.

tasks.register('your_task_name', Copy){
    from "서브 모듈에서 설정 파일의 경로"
    include '설정 파일 이름'
    into '복사한 설정 파일을 배치할 경로'
}

processResources.dependsOn(your_task_name)

 

여기서 dependsOn은 gradle의 작업 의존성을 설정하는 과정이다.

processResources는 정적 리소스를 처리하는 작업으로 Java 애플리케이션 실행에 필요한 리소스들을 준비하는 과정이다.

 

즉, 위 과정은 서브 모듈에서 설정 파일을 복사하는 작업을 리소스 준비 작업보다 먼저 실행하여 안전하게 설정 파일들이 리소스에 포함되도록 하는 것이다.

 

프로젝트를 실행하면 아래와 같이 설정 파일이 복사되는 것을 확인할 수 있다.

4. .gitignore에 설정 파일 추가

다음으로 .gitignore에 설정 파일을 추가하여 github에 설정 파일이 업로드되지 않도록 막는다.

위 copy 작업을 추가한 상황이기에 현재 프로젝트를 실행한다면 설정 파일이 프로젝트 내부에 복사되기 때문이다.

 

필자는 간단하게 아래 내용을 .gitignore에 추가했다.

# config files
**/application.yml

 

만약 다른 이름의 설정 파일을 사용한다면, 추가적인 작업이 필요할 것이다.

5. github에 변경사항 업로드 및 확인

마지막으로 github에 변경 사항을 업로드하고 결과를 확인하자.

업로드 전에, 설정 파일이 github에 업로드되지 않는지 재차 확인할 필요가 있다.

 

업로드에 성공했다면 아래와 같이 서브 모듈이 대상 레포지토리에 추가된 것을 확인할 수 있다.

 

인증된 사용자는 해당 파일의 내용을 확인할 수 있지만, 인증되지 않은 사용자는 접근할 수 없다. 

실제로 게스트 계정으로 접근했을 때 아래 화면이 나타나는 것을 확인했다.

 

서브모듈에서 변경 사항 불러오기

처음 프로젝트를 clone했거나 서브 모듈에 변경 사항이 있는 경우 외부 리포지토리에서 서브 모듈 내용을 받아와야한다.

이러한 상황에서 아래 명령어를 실행하면 쉽게 서브 모듈 내용을 불러올 수 있다.

git submodule update --init --recursive --remote

 

당연히 .gitmodules 파일이 존재할 때만 실행 가능하고, 인증되지 않은 사용자는 private repository에서 서브 모듈 내용을 받아올 수 없다.

 

현재 리포지토리에서 서브 모듈 내용 수정하기

서브 모듈은 위에서도 언급했듯이 독립적인 리포지토리를 현재 리포지토리에 포함시킨 것이다.

따라서 서브 모듈 내부에는 아래와 같이 .git 파일이 존재한다.

$ tree -la -L 1
.
├── .git
└── dev

 

따라서, 서브 모듈의 변경 사항이 있다면, git add, commit, push를 통해 변경 사항을 github에 업로드하면 된다.

 

마무리

이번에는 spring boot 빌드 파일(build.gradle)과 git submodule을 활용하여 설정 파일을 외부 리포지토리에서 독립적으로 관리하는 방법에 대해서 알아보았다.

 

사실 이 방법 외에도 spring cloud config server를 활용한 방법도 존재하고, 보안 측면에서는 git secrets가 더 적절한 방법이라고 생각한다.

 

다만, spring cloud config server는 가뜩이나 메모리 사용량이 많은 spring boot 서버를 하나 더 관리해야하는 문제점이 있었고 서버 하나를 추가로 관리해야하는 점에서 부담이 있었다.

 

또한, git secrets의 경우 설정 파일의 변경이 필요할 때 직접 github에서 수정해야 했고 설정 파일의 버전 관리가 어렵다는 문제가 있었다.

 

이러한 점에서 git submodules도 설정 파일을 관리하는 충분히 강력한 방법임을 알 수 있었다.