들어가며
안녕하세요. 요즘에 플러피(fluffy)라는 온라인 시험 문제 제작 및 관리 서비스를 만들고 있습니다.
공부를 위한 프로젝트이기 때문에 레포지토리는 현재 public
으로 공개되어 있습니다. 서버 개발을 하는 경우 다양한 민감 정보를 사용하게 됩니다. 예를 들어, 데이터베이스 접속 정보, 인증을 위한 시크릿 키, OAuth 인증을 위한 클라이언트 ID, 시크릿, AWS S3 버킷 정보 등이 있습니다. 이러한 정보들은 보안상의 이유로 외부에 노출되어서는 안됩니다.
이러한 정보들을 관리하는 방법은 간단하게 다음과 같이 나눌 수 있습니다.
- yml 파일을 .gitignore에 추가하여 레포지토리에 올리지 않는 방법
- 환경변수를 사용하여 정보를 주입하는 방법
- 서브모듈을 사용하여 외부 레포지토리에서 정보를 가져오는 방법
이 중에서 서브모듈을 사용하여 외부 레포지토리에서 정보를 가져오는 방법에 대해서 알아보겠습니다.
서브모듈이란?
Git 서브모듈은 하나의 Git 저장소 내에 다른 Git 저장소를 포함할 수 있는 기능입니다. 이 기능은 여러 프로젝트에서 공통적으로 사용되는 라이브러리나 모듈을 관리할 때 유용합니다. 서브모듈을 통해 의존성을 명확히 하고, 특정 버전의 코드를 명확히 할 수 있습니다. 서브모듈을 사용하는 저장소를 슈퍼 프로젝트 혹은 부모 저장소라고 부르고, 서브모듈로 사용되는 저장소를 서브 모듈 저장소 혹은 자식 저장소라고 부릅니다. 부모 저장소에서 자식 저장소를 서브모듈로 등록하면 자식 저장소의 특정 커밋 버전을 참조하게 됩니다. 이를 통해 부모 저장소에서 자식 저장소의 특정 커밋 버전을 사용할 수 있습니다.
이 글은 부모 저장소인 fluffy
에서 자식 저장소인 fluffy-config
를 서브모듈로 등록하여 fluffy-config
의 설정 파일을 사용하는 방법에 대해 알아보겠습니다.
자식 저장소(fluffy-config) 생성
먼저 자식 저장소인 fluffy-config
를 생성합니다. fluffy-config
는 민감 정보를 저장하는 저장소이므로 private
으로 생성합니다. 이 저장소에는 spring에서 사용하는 설정 파일인 application.yml
들을 저장합니다. 다음의 이미지는 저장소의 구조를 나타낸 것입니다. 참고로, local, dev, prod에 따라 설정 파일을 나눈 것입니다.
부모 저장소(fluffy)에 서브모듈(fluffy-config) 등록
부모 저장소인 fluffy
에서 fluffy-config
를 서브모듈로 등록하는 방법입니다.
먼저, fluffy
의 루트 디렉토리에서 다음의 명령어를 실행합니다.
명령어 마지막에 src/main/resources/config
와 같이 서브모듈을 등록할 위치를 지정할 수도 있습니다.
git submodule add https://github.com/alstn113/fluffy-config.git
이 명령어를 실행하면 fluffy-config
디렉토리와 .gitmodules
파일이 생성됩니다.
위의 이미지를 확인하면 fluffy-config
이름 옆에 @ 10a165f
와 같이 표시되어 있습니다.
이는 fluffy-config
의 특정 커밋 버전을 참조하고 있다는 의미입니다. .gitmodules
파일은 서브모듈의 정보를 저장하는 파일입니다. 다음과 같이 fluffy-config
의 정보가 저장되어 있습니다. path는 서브모듈을 저장할 위치이고, url은 서브모듈의 주소입니다.
[submodule "fluffy-config"]
path = fluffy-config
url = https://github.com/alstn113/fluffy-config.git
서브모듈(fluffy-config) 업데이트
프로젝트를 진행하다보면 설정 정보들이 변경될 수 있습니다. 이 때 fluffy
내에 있는 fluffy-config
를 변경해도 fluffy
에는 반영되지 않습니다. 따라서 fluffy-config
를 업데이트하려면 다음의 과정이 필요합니다.
먼저 fluffy-config
디렉토리로 이동합니다. 그리고 변경된 내용을 커밋/푸시합니다.
다음으로 fluffy
디렉토리로 이동 후 다음의 명령어를 실행합니다.
git submodule update --remote
이 명령어를 실행하면 fluffy-config
의 최신 커밋 버전을 가져와서 fluffy
에 반영됩니다.
서브모듈의 특정 커밋 버전을 사용하고 싶다면 다음과 같은 과정이 필요합니다.
먼저, fluffy-config
디렉토리로 이동합니다. 그리고 특정 커밋 버전으로 이동(checkout)합니다.
그 후 fluffy
디렉토리로 이동 후 커밋/푸시합니다.
서브모듈을 통한 Spring 설정 파일 사용
서브모듈에 있는 설정 파일을 사용하는 두 가지 방법이 있습니다.
첫 번째 방법은 processResources 과정 전에 서브모듈을 src/main/resources 디렉토리로 복사하는 방법입니다.
두 번째 방법은 설정 파일에서 import를 통해 classpath로 설정 파일을 사용하는 방법입니다.
processResources 전에 서브모듈을 src/main/resources 디렉토리로 복사
fluffy
의 build.gradle 파일에 다음과 같이 코드를 추가합니다.
// (1)
processResources.dependsOn('copySecret')
// (2)
tasks.register('copySecret', Copy) {
from '../fluffy-config
include "application*.yml"
into './src/main/resources'
}
processResources 테스크는 쉽게 설명해서 src/main/resources 디렉토리에 있는 파일들을 빌드 디렉토리로 복사하는 테스크입니다.
(1)에서 processResources 테스크가 실행되기 전에 copySecret 테스크를 실행하도록 설정합니다.
(2)에서 copySecret 테스크를 생성합니다. from은 복사할 파일들의 위치를 지정하고, include는 복사할 파일들을 지정합니다. into는 복사할 위치를 지정합니다.
이 방법은 서브모듈 파일을 복사하기 때문에 반드시 복사된 경로를 .gitignore에 추가해야 합니다.
import를 통해 classpath로 설정 파일 사용
application.yml에서 서브모듈의 설정 파일을 import하여 사용하는 방법입니다.
application.yml은 src/main/resources 디렉토리에 있고, 다음과 같이 작성되어 있습니다.
spring:
config:
import: classpath:../fluffy-config/application.yml
이 방법은 복사 과정이 없기 때문에 테스크를 추가하거나 .gitignore로 지정할 필요가 없습니다.
참고
서브모듈을 포함한 저장소 복제
일반적으로 저장소를 복제할 때 git clone
명령어만을 사용합니다. 그러나 이 경우 서브모듈은 빈 디렉토리로 복제됩니다.
서브모듈을 포함하여 저장소를 복제하고 싶다면 --recurse-submodules
옵션을 사용합니다.
git clone --recurse-submodules https://github.com/alstn113/fluffy.git
이 경우 fluffy-config
디렉토리도 함께 복제됩니다.
github actions로 서비스를 배포할 때
서브모듈을 사용해서 설정 파일을 관리하는 경우 github actions를 사용하여 서비를 배포할 때 주의가 필요합니다.
먼저, checkout action을 사용할 때 submodules
옵션을 true
로 설정해야 서브모듈도 함께 가져옵니다.
서브모듈은 private 저장소이기 때문에 token이 필요합니다. 이 토큰은 Token을 생성하는 페이지에서 생성할 수 있습니다.
현재 기준으로 classic token을 사용해야하고, repo
권한 체크 및 만료일을 설정해야 합니다.
# .github/workflows/server-cd.yml
steps:
- uses: actions/checkout@v4
with:
submodules: true
token: ${{ secrets.SUBMODULE_GITHUB_TOKEN }}
위의 코드에서 SUBMODULE_GITHUB_TOKEN은 생성했던 토큰의 이름입니다.
서브모듈 삭제
서브모듈을 삭제하려면 fluffy
디렉토리에서 다음의 명령어를 실행합니다.
git rm -rf fluffy-config
이 명령어를 실행하면 fluffy-config
디렉토리가 삭제되고, .gitmodules
파일에서도 fluffy-config
정보가 삭제됩니다. 상황에 따라 .gitmodules
파일도 삭제하면 됩니다.
마치며
지금까지 서브모듈을 통해서 Spring 설정 파일을 관리하는 방법에 대해서 알아보았습니다. 좋은 하루 보내세요 ⛅️
'협업' 카테고리의 다른 글
Github Branch Rulesets 로 프로젝트 안전하게 관리하기 (1) | 2025.01.14 |
---|