-
Github Actions + Git Submodule로 application.yml 관리하기Spring 2024. 4. 10. 04:19
Scoop 프로젝트를 하며 Spring의 application-dev.yml 코드의 여러 키값들을 공개하지 않아야 했다. 그래서 처음에 각 값들을 secrets에 저장해서 사용하는 방식을 선택했다. 그랬더니 아래와 같은 코드가.. 되었다.
env: spring.datasource.driver-class-name: ${{ secrets.DRIVER_CLASS_NAME }} spring.datasource.url: ${{ secrets.DATASOURCE_URL }} spring.datasource.username: ${{ secrets.DATABASE_USERNAME }} spring.datasource.password: ${{ secrets.DATABASE_PASSWORD }} spring.security.oauth2.client.registration.kakao.client-id: ${{ secrets.KAKAO_CLIENT_ID }} spring.security.oauth2.client.registration.kakao.client-secret: ${{ secrets.KAKAO_CLIENT_SECRET }} spring.security.oauth2.client.registration.kakao.redirect-uri: ${{ secrets.KAKAO_REDIRECT_URI }} spring.security.oauth2.client.provider.kakao.authorization-uri: ${{ secrets.KAKAO_AUTHORIZATION_URI }} spring.security.oauth2.client.provider.kakao.token-uri: ${{ secrets.KAKAO_TOKEN_URI }} spring.security.oauth2.client.provider.kakao.user-info-uri: ${{ secrets.KAKAO_USER_INFO_URI }} spring.data.redis.host: ${{ secrets.REDIS_HOST }} spring.data.redis.port: ${{ secrets.REDIS_PORT }} spring.rabbitmq.host: ${{ secrets.RABBITMQ_HOST }} spring.rabbitmq.port: ${{ secrets.RABBITMQ_PORT }} spring.rabbitmq.username: ${{ secrets.RABBITMQ_USERNAME }} spring.rabbitmq.password: ${{ secrets.RABBITMQ_PASSWORD }} jwt.secret-key: ${{ secrets.JWT_SECRET_KEY }} rabbitmq.summary.queue.name: ${{ secrets.SUMMARY_QUEUE_NAME }} rabbitmq.summary.exchange.name: ${{ secrets.SUMMARY_EXCHANGE_NAME }} rabbitmq.summary.routing.key: ${{ secrets.SUMMARY_ROUTING_KEY }} rabbitmq.store.queue.name: ${{ secrets.STORE_QUEUE_NAME }} rabbitmq.store.exchange.name: ${{ secrets.STORE_EXCHANGE_NAME }} rabbitmq.store.routing.key: ${{ secrets.STORE_ROUTING_KEY }}
너무 가독성이 떨어지고 지저분한 코드가 되어버린 것 같아서 다른 방법을 고민하게 되었다.
1. application-dev.yml 파일을 통째로 secrets에 넣어버리는 방법
장점
- 쉽다. 그냥 Secrets에 파일 전체를 넣고, {{ secrets.APPLICATION_YML }}처럼 사용하면 된다.
단점
- 하나의 설정을 변경하거나 추가하고자 해도, 파일 전체를 다시 secrets 변수로 넣어야 한다.
- 내가 저장한 파일 정보를 다시 확인하는 것이 불가능하다.
2. application-dev.yml 파일을 내 개인 레포지토리에 private으로 올려서 submodule로 사용하는 방법
장점
- 내가 작성한 파일을 얼마든지 다시 확인할 수 있다.
- 값들을 하나씩 secrets 변수로 설정할 필요가 없다.
단점
- 협업자가 있을 경우, 내 개인 레포지토리에 올리는 것이기 때문에 협업자가 해당 파일을 확인하는 것이 불가능하다.
- submodule을 사용하기 때문에, 내 개인 레포지토리에서 커밋 -> 실제 프로젝트 레포지토리에서 서브모듈 체크아웃 후 다시 커밋 하는 약간의 복잡한 과정이 필요하다.
결국 선택한 방법은 두 번째 방법이다. 이유는 내가 올려둔 내용을 다시 확인할 수 있고, 이번 프로젝트에서 백엔드를 혼자 맡았기 때문에, 협업자에게 공유해야 하는 것을 고려할 필요가 없기 때문이다.
아래와 같이 두 개의 설정 파일을 submodule로 설정했다.
path에는 작업 레포지토리에 들어갈 설정 파일의 위치를 넣고, url에는 설정 파일을 올려둔 내 개인 private레포지토리의 url을 넣으면 된다. branch에는 내 개인 레포지토리에서 설정 파일을 커밋하는 브랜치명을 작성했다.
[ .gitmodules ]
[submodule "backend/core/src/main/resources/scoop-core-config"] path = backend/core/src/main/resources/scoop-core-config url = https://github.com/yeonjy/scoop-core-config.git branch = main [submodule "backend/ai_response_processor/scoop-ai-env"] path = backend/ai_response_processor/scoop-ai-env url = https://github.com/yeonjy/scoop-ai-env.git branch = main
submodule 추가 명령어
git submodule add ${생성한 Private Repository의 URL}
submodule을 추가할 때, 처음에 비밀번호를 입력하라고 한다. 이 경우, Personal Access Token을 넣어야 한다. 계정 비밀번호의 경우 아래와 같이 2021년 8월 13일 이후로 인증이 불가능하다.
remote: Support for password authentication was removed on August 13, 2021.
그 결과, 아래와 같이 잘 적용된 것을 볼 수 있다.
submodule을 private 레포지토리에 업데이트 한 후, 해당 내용을 메인 작업 레포지토리에 업데이트 하려면 아래 명령어를 입력하면 된다.
git submodule update --remote --merge
'Spring' 카테고리의 다른 글
Spring Batch로 성능 최적화하기 (0) 2024.07.03 [트러블 슈팅] @InjectMocks @Mock vs. @Autowired @MockBean (0) 2024.06.17 [Spring Security] kakao 소셜 로그인 (0) 2023.11.21 Event Publisher / Event Listener (0) 2023.07.04 [Test Code] @NotBlank 테스트 코드 작성 방법 (0) 2023.07.03