안녕하세요. 현재 데브코스 4기로 활동 중인 모아밤팀 서버 개발자 홍혁준입니다.
이번 포스팅에서 서브모듈에 대해 이야기를 풀어내 보려고 합니다. 감사합니다.
배경
팀원들과 스프링부트를 활용해 모아밤을 개발하면서, application.yml 혹은 application.properties에 애플리케이션 환경 분리와 Private 정보를 모두 명시해야 했습니다. 때문에, 초반에는 아래와 같이 환경 변수를 활용해 설정 정보를 명시했지만, 이는 큰 문제점이 있었습니다.
...
token:
iss: ${JWT_ISS}
access-expire: ${JWT_ACCESS_EXPIRE}
refresh-expire: ${JWT_REFRESH_EXPIRE}
secret-key: ${JWT_SECRET_KEY}
...
문제 상황
- 모든 팀원과 개발 및 운영 서버에 환경 변수를 물리적으로 세팅해야 하는 문제
- 개발 중 환경 변수 추가 시, 개발 환경을 포함해 운영 환경에도 모든 팀원이 동일하게 추가해야 하는 문제
이러한 문제점을 해결하고자 서브 모듈을 도입하게 되었습니다.
서브모듈 도입
서브모듈 생성
1) Private Repository를 생성합니다.
- 환경 별 설정 정보와 Private한 설정 정보를 모아두기 위한 Private Repository를 생성합니다.
- Repository 명은 config로 해야 합니다. 만약 다른 이름을 사용하고 싶다면 추후에 추가 설정을 해야 합니다.
2) 외부로 노출되면 안되는 정보들을 세팅합니다.
- 모아밤에서는 개발 및 운영 설정 정보들을 넣었습니다.
3) 서브 모듈 생성하기
- 다음 명령어를 통해 메인 프로젝트(모아밤)에 서브모듈을 추가합니다.
- 여기서 {PATH}는 서브모듈을 포함시킬 하위 디렉토리의 경로를 의미하는 것으로 생략 가능합니다.
# 모아밤의 서브모듈 위치 : moabam-server/src/main/resources/config
git submodule add {서브모듈 저장소 URL} {PATH}
- 해당 명령어가 성공하면 아래와 같이 루트 경로에 .gitmodules 파일이 생성된 것을 확인할 수 있습니다. 이제 새롭게 추가된 서브모듈 설정을 커밋 및 푸쉬하면 서브모듈 생성은 끝이납니다.
서브모듈 적용
최초로 메인 저장소를 클론하는 경우 아래 명령어로 진행합니다.
- 이 작업은 최초 클론 시 1회만 실행하면 됩니다.
- git submodule init과 update 명령어는 메인 저장소에 잘 연결되어 있는 서브모듈 저장소의 정보를 가지고 업데이트를 진행하는 작업입니다.
- 주의사항으로는 메인 저장소의 커밋 당시 스냅샷을 가져오는 것입니다. 즉 매번 최신 서브 모듈 저장소를 가져오는 것이 아니라 메인 저장소의 기준으로 반영된 커밋을 가져옵니다.
git clone {Moabam Repository URL}
git submodule init
git submodule update
작업 도중 서브모듈이 추가되어 반영해야 하는 경우
아래 명령어를 통해 메인 저장소를 Pull 받아도 서브모듈의 저장소까지는 최신화되지 않습니다. 즉 각 서브모듈을 일괄적으로 업데이트해야 합니다.
git pull origin develop
각각의 서브모듈 저장소에서 Pull을 진행해도 되지만 아래 명령어를 통해 진행할 수 있습니다.
git submodule update --remote --merge
주의사항
- 서브모듈이 수정되면 꼭 팀원들에게 변경사항 전달을 해야합니다. 특히 모아밤 같은 경우는 서브모듈을 하나의 메인 브랜치로 관리하고 있기 때문에, 동시 수정 시 충돌될 가능성도 있기 때문에 꼭 변경사항을 전달해야 하고 동시 작업을 피해야 합니다.
- 서브모듈이 변경될 경우 나머지 팀원들은 앞서 작성한 명령어를 통해 일괄적으로 서브모듈의 변경점을 반영해야 합니다. 그리고 서브모듈을 변경한 팀원은 어떤 이유로 수정했는 지 명시하고 적용하여 나머지 팀원들이 잘 적용할 수 있도록 합니다. 때문에, 가이드 라인을 명시하는 것이 좋습니다.
번외로 CI 환경에서도 서브모듈 정보를 알게 하려면 깃 저장소 관리자가 토큰키를 발급받은 후 다음 이미지와 같이 서브모듈 설정을 추가적으로 해야 합니다.
결론
모아밤은 다양한 환경과 외부로 노출되면 안되는 중요 정보관리를 위해 서브모듈을 도입하게 되었습니다. 이로 인해 환경 변수를 사용할 때보다 원활하게 형상 관리와 팀원 간의 공유를 편리하게 설정 정보로 관리하게 되었습니다.
하지만 Private 저장소와 서브모듈를 관리해야 하는 자원이 소모됩니다. 또한 팀원 간 소통이 잘못됐을 시, 커밋이 꼬여서 설정 정보가 온전하게 적용되지 않을 수도 있으니 주의해야 합니다.
때문에, 모아밤에서는 다음과 같이 가이드라인을 작성하여 Git Wiki에 등록 후 서브모듈을 관리하게 되었습니다. 감사합니다.
Reference
'Activity > 데브코스 - 모아밤 테크' 카테고리의 다른 글
Moabam Tech - Caching으로 성능 개선하기 (2) | 2024.01.12 |
---|---|
Moabam Tech - 모아밤의 예외 처리 (0) | 2023.11.09 |
Moabam Tech - 실시간 선착순 쿠폰 이벤트 도입기 (0) | 2023.11.08 |
Moabam Tech - Embedded Redis 테스트 환경 적용기 (feat. M1-ARM) (0) | 2023.11.04 |
Moabam Tech - 모아밤의 FCM Push Notification 도입기 (0) | 2023.10.29 |