본문 바로가기
스프링 (Spring)

[Spring boot] 설정 정보 외부에서 관리하기 2 - submodule

by codeyaki 2023. 3. 21.
반응형

https://teching.tistory.com/143

 

Spring boot 설정 정보 외부에서 관리하기 1 - 개요

Spring boot 설정 정보 관리하기 서버를 github를 사용해서 형상관리를 할 생각인데 레파지토리를 public으로 열어두려고 한다... 공개하게 되면 spring boot의 application.yml파일에는 아래와 같이 DB 접속 정

teching.tistory.com

지난번에 설정정보를 관리하는 여러 방법을 알아본 후 그중 Submodule을 사용해서 설정정보를 관리해 보려고 한다.

이를 위해서 submodule에 대한 공부가 필요한 것 같아 가볍게 알아보는 시간을 가져보려고 한다.

 

서브 모듈


서브 모듈이란?

서브 모듈이란, 프로젝트 내부에 다른 프로젝트를 사용해야 하는 경우에 이 프로젝트를 외부에서 관리하거나 여러 프로젝트에서 같이 사용하는 프로젝트인 경우 두 프로젝트를 별개로 관리하면서 그중 하나의 프로젝트에서 모두 사용할 수 있도록 하는 방법이다.

즉, 간단하게 다른 레파지토리를 현재 레파지토리에 모듈처럼 끼워 넣는 방법이다.

라이브러리를 만들어 여러 레파지토리에서 사용하는 방법을 주로 사용하지만 나는 이걸 통해서 spring boot의 설정 정보를 관리하려고 한다.

왜냐하면 public 레파지토리는 아무나 접근해서 코드를 볼 수 있는데 DB접속 정보 같은 공개되면 곤란한 민감정보들은 숨겨야 하는데 혼자 개발하면 단순히 yml파일을 직접 관리하면 괜찮지만 다른 사람들과 함께 개발하는 경우 관리가 어려워지기 때문에 submodule을 통해서 설정 파일의 버전을 손쉽게 관리하고자 한다.

서브 모듈 적용 해보기

1. 먼저 다른 레파지토리에 포함시킬 레파지토리를 만들고 따로 관리할 파일을 만들어준다.

나는 application.yml에 들어갈 내용을 따로 관리할 것이기 때문에 아래와 같이 만들어 주었다.

2. 이제 이 레파지토리를 포함할 레파지토리에서 다음 명령어를 입력해주면 된다.

git submodule add {포함시킬 저장소 주소} {생성할 디렉터리 위치}

예를 들어 config-file 레파지토리를 spring boot 프로젝트의 resources/config 디렉터리에 포함하고 싶다면 아래와 같이 작성하면 된다.

git submodule add [https://github.com/16ssss/config-file.git](https://github.com/16ssss/config-file.git) src/main/resources/config

3. 해당 명령어를 작성하면 정상적으로 명령어를 입력하면 아래와같이 다운로드를 하여서 지정한 폴더에 넣어주게 된다.

나는 관리하기 쉽도록 따로 config 디렉터리에 포함시킨 후 해당 파일을 application.yml에 넣어주었다.

만약 아래 과정이 불편하다면 application.yml로 파일을 만들어서 resources 디렉터리에 바로 포함시켜 주면 된다.

4. 이 submodule에 대한 정보는 프로젝트의 root를 보면 .gitmodules 파일이 한 개 생긴 것을 확인할 수 있다.

이 파일을 통해서 submodule의 설정을 변경하는 등  서브모듈을 관리할 수 있다.

만약 submodule할때 branch를 설정해야 한다면 url아래 branch = {원하는 브랜치명}을 입력해 주면 된다.

아래 예시는 example 브랜치에 있는 config-file 버전을 포함하려고 하는 설정이다!

 

5.. 그 후 원하는대로 applicaiton.yml에 import 해주면 완료.

 

5. 만약 config-file을 최신화해야 하는 경우 git submodule update --remote를 입력하면 자동으로 최신화가 되게 된다.

6. 팀원이 서브모듈이 포함되어 있는 프로젝트를 clone해오면 서브모듈 프로젝트 디렉터리가 비어있을 텐데 아래 명령어를 통해서 가져와 주어야 한다.

git submodule init

만약 이 과정이 귀찮다고 느껴진다면 아예 clone할때 git clone 명령 뒤에 --recurse-submodules를 붙여주면 된다.

git clone {서브모듈이 포함되어있는 프로젝트url} --recurse-submodules

 

참고) submodule은 하나의 commit으로 취급되기 때문에 따로 gitignore에 추가하지 않아도 된다!!

 

완료된 레파지토리에 들어가보면 submodule은 디렉터리명 뒤에 @ submoduleID 가 써져 있게 된다.

만약 권한이 없는 사용자가 서브모듈에 들어가려고 하는 경우 404 에러가 발생하게 되어 정보를 지킬 수 있게 되었다!ㅎㅎ

 

주의 사항

서브모듈을 수정하는 경우

서브 모듈을 포함한 상위 프로젝트에서 서브모듈의 내용을 수정하게 되는 경우 상위 프로젝트를 push 하기 전에 서브모듈의 변경사항을 update 해주어야 한다. 안 그러면 변경 사항을 Checkout 한 다른 사람은 서브모듈이 의존하는 코드를 어디서도 가져올 수 없는 곤란한 상황이 펼쳐질 수 있다.

이러한 상황을 피하기 위해서는 git push를 할 때 git push 명령에 --recurse-submodules 옵션을 주고 이 옵션의 값으로 “check” 나 “on-demand” 를 설정해 주자!

  • check : 서브모듈의 로컬 커밋이 Push 되지 않은 상태라면 현재의 Push 명령도 실패하도록 하는 옵션이다. 
  • on-demand : 서브모듈의 update내용도 같이 push하도록 하는 옵션

 

서브모듈을 동시에 수정하는 경우

서브모듈도 하나의 레파지토리이기때문에 다른 사람과 submodule을 동시에 수정하면(커밋하면) 히스토리 갈라져서 문제가 생길 수 있다! 서브모듈의 커밋 두 개를 비교했을 때 Fast-Forward Merge가 가능한 경우 Git은 단순히 마지막 커밋을 선택한다. 그게 아니라면 서브모듈을 변경한 두 커밋을 합친 커밋을 하나 해주면 해결할 수 있다...!

 

 

 

참고 자료 : https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-%EC%84%9C%EB%B8%8C%EB%AA%A8%EB%93%88

 

Git - 서브모듈

gitmodules 파일에 있는 URL은 조건에 맞는 사람이면 누구든지 Clone 하고 Fetch 할 수 있도록 접근할 수 있어야 한다. 예를 들어 다른 사람이 Pull을 하는 URL과 라이브러리의 작업을 Push 하는 URL이 서로

git-scm.com

 

반응형