깃 서브모듈을 도입해보자

teamdevelup·2024년 9월 27일

안녕하세요, 리브입니다!

서브모듈이 뭘까?

Submodules allow you to keep a Git repository as a subdirectory of another Git repository. This lets you clone another repository into your project and keep your commits separate.
Git 공식 문서

공식 문서에 따르면 서브모듈은 하나의 Git 저장소 안에 다른 Git 저장소를 디렉토리처럼 보관할 수 있도록 허가한다고 합니다. 또, 기존 Git 저장소와 서브모듈 Git 저장소의 커밋은 독립적으로 관리할 수 있습니다.

우리는 이 서브 모듈을 secret 변수들을 관리하기 위해 사용하기로 결정했습니다.
application.yml에 환경 변수로 전달해야 할 secret 값들이 늘어가면서 관리하기가 어려워졌기 때문이죠!

1 서브모듈을 위한 private github repository 만들기

먼저, 서브모듈이 될 깃허브 레파지토리를 만들어줍니다. 이 때, 공개되면 안되는 정보들을 담고 있는 파일을 저장할 것이기 때문에 private으로 생성해야 합니다.

2 1에서 만든 레파지토리에 파일 옮기기

우리는 서브모듈을 위한 레파지토리에 기존 src/main/resources에 있던 application*.yml 파일들을 옮겨주었습니다. 그리고src/main/resources에 있던 application*.yml 파일들은 더이상 필요가 없기 때문에 삭제했습니다.

3 서브모듈 추가하기

이제 우리 프로젝트가 있는 레파지토리에 서브모듈을 추가해야 합니다. 방법은 간단합니다!
로컬에서 우리 프로젝트 레파지토리 위치에 이동해서 아래와 같이 git submodule add 명령어를 사용해서 서브모듈을 추가해줍니다. 여기서 서브모듈 레파지토리 주소는 우리가 1번에서 만들었던 레파지토리 주소를 입력해주면 됩니다.

git submodule add {서브모듈 레파지토리 주소}

위와 같이 단순하게 레파지토리 주소만 기재하면 서브모듈의 레파지토리 이름으로 명령어를 실행한 위치에 디렉토리가 생성됩니다. 다른 위치에 다른 이름으로 디렉토리를 추가하고 싶다면 아래와 같이 레파지토리 주소 뒤에 경로를 지정하면 됩니다.

git submodule add {서브모듈 레파지토리 주소} {경로}

경로에 ./backend/secrets와 같이 지정하면 현재 경로에서 backend 디렉토리 하위에 secrets 디렉토리를 만들고 해당 디렉토리(secrets)에 서브모듈 파일들이 추가 됩니다.
이 과정을 완료하면 프로젝트의 최상단에 .gitmodules 파일도 추가됩니다.(서브모듈을 관리하기 위한 메타데이터를 포함하는 파일이에요. 서브모듈의 위치와 관련된 정보를 저장하고 서브모듈이 저장소 내에서 어떻게 구성되어 있는지를 Git에 알려줍니다.)

[submodule "backend/secrets"]
	path = backend/secrets
	url = https://github.com/woowacourse-teams/2024-devel-up-secret.git

4 application*.yml 파일을 src/main/resources로 옮기기

Spring Boot는 기본적으로 src/main/resources에 있는 application*.yml 파일을 읽습니다.
그리고 현재 우리 서브모듈 디렉토리(secrets)는 src 디렉토리와 같은 레벨에 위치해 있습니다. Spring Boot가 해당 파일을 읽을 수 있도록 build.gradle 설정을 추가해주어야 합니다.

build.gradle에 다음과 같은 내용을 추가해줍니다.

processResources.dependsOn('copySecret')

tasks.register('copySecret', Copy) {
    from './secrets'
    include "application*.yml"
    into './src/main/resources'
}

Spring Boot 빌드 과정 중 리소스 파일을 처리하는 단계가 있습니다. 리소스 디렉토리(src/main/resources 등)에서 필요한 파일을 build 디렉토리로 복사하고 application*.yml에 정의된 변수들을 실제 값으로 대체하는 등의 단계입니다.

바로 위 내용이 우리의 서브모듈 디렉토리에서 필요한 파일을 먼저 복사한 뒤 processResources를 실행할 수 있도록 해주는 과정입니다.

5 application*.yml 파일 커밋되지 않도록하기

4번 과정을 통해 로컬에서 스프링 부트를 빌드하면 src/main/resources에 서브모듈에 있던 파일들이 복사됩니다. 이 파일들은 커밋이 되어서는 안되겠죠!
.gitignore에 다음과 같은 내용을 추가해줍니다.

### submoduleyml ###
src/main/resources/application*.yml

이제 서브모듈을 추가하는 모든 단계가 끝났습니다! 😊

하지만 서브모듈이 포함된 프로젝트를 다른 로컬에서 클론한 후에는 초기화하고 업데이트 하는 과정이 필요합니다! 클론 후에 서브모듈이 자동으로 포함되지 않기 때문입니다. (디렉토리만 생기고 내부에 아무 파일도 없습니다.)

git submodule init
git submodule update --remote

위 두 명령어를 사용해서 로컬에 서브모듈 파일을 받아올 수 있습니다.

profile
팀 데벨업입니다

0개의 댓글