You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
submodule 내부에서는 여러 application.yml 파일들을 관리하고 있습니다. 이 yml 파일들은 profile로 구분되고 외부로 노출되면 안 되는 private 한 환경변수들을 포함합니다.
애플리케이션을 실행할 때는 -Dspring.profiles.active={profile_name} 설정으로 애플리케이션에 적합한 profile을 매핑합니다.
그렇다면 submodule에 있는 application.yml 파일을 어떻게 애플리케이션 내부로 불러오고 있을까요?
그것은 build.gradle 파일을 보면 알 수 있습니다.
build.gradle 을 보면, build 시 submodule 디렉터리에 있는 파일들을 모두 resources 로 복사하는 로직을 갖고 있습니다.
따라서 코드를 build 하고 jar 를 실행할 때 submodule에 있는 yml 파일들을 사용할 수 있는 것입니다.
이 방법은 편리하지만, 문제를 갖고 있습니다.
문제
어느 환경에서든 build 시 submodule 디렉터리에 있는 파일들이 모두 resources 로 복사되는 것이 문제입니다.
local 환경에서 테스트 코드를 실행할 때에도 yml 파일들이 복사되는 것을 볼 수 있습니다.
submodule 에 yml 파일들을 분리해둔 이유는 이 yml 파일들이 private 정보들을 포함하고 있기 때문입니다. 하지만 이 파일들을 resources 에 복사해서 사용한다면, 다른 코드에 대한 commit & push 를 진행할 때 yml 파일도 함께 올라갈 가능성이 있습니다.
현재 프로젝트에서는 .gitignore 에 private files 들을 등록해놓고 이를 방지하고 있습니다.
다만, 새로운 yml 파일이 추가되거나 기존 yml 파일의 이름을 수정할 경우 .gitignore 에 이러한 변경사항을 반영하는 것을 잊을 수 있습니다.
해결
gradle.build 를 통해 resources에 직접 copy 하는 방법을 사용하지 않고 다른 방법을 택해야 합니다. 다음의 두 가지 방법을 고려해볼 수 있습니다.
1. spring.config.import
spring:
config:
import: {yml 파일 경로}activate:
on-profile: {profile 이름}
spring.config.import 설정을 통해 yml 파일을 직접 불러올 수 있습니다. resources 디렉터리에 copy 하지 않아도 되는 방법입니다.
2. /config 디렉터리
Spring 공식문서를 살펴보면, SpringApplication이 로드될 때 yml 파일을 읽는 순서가 명시되어 있습니다.
현재 디렉터리에 존재하는 /config 디렉터리
현재 디렉터리
classpath 에 존재하는 /config 디렉터리
classpath
classpath 혹은 프로젝트 디렉터리에서 config 라는 이름의 디렉터리에 존재하는 yml 파일을 읽는 것을 알 수 있습니다.
따라서 submodule의 이름을 config 로 설정해둔다면 별다른 import 없이도 yml 파일을 읽게 할 수 있습니다.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
백엔드 프로젝트는 Git submodule을 사용하고 있습니다.
submodule 내부에서는 여러 application.yml 파일들을 관리하고 있습니다. 이 yml 파일들은 profile로 구분되고 외부로 노출되면 안 되는 private 한 환경변수들을 포함합니다.
애플리케이션을 실행할 때는
-Dspring.profiles.active={profile_name}
설정으로 애플리케이션에 적합한 profile을 매핑합니다.그렇다면 submodule에 있는 application.yml 파일을 어떻게 애플리케이션 내부로 불러오고 있을까요?
그것은 build.gradle 파일을 보면 알 수 있습니다.
build.gradle 을 보면, build 시 submodule 디렉터리에 있는 파일들을 모두 resources 로 복사하는 로직을 갖고 있습니다.
따라서 코드를 build 하고 jar 를 실행할 때 submodule에 있는 yml 파일들을 사용할 수 있는 것입니다.
이 방법은 편리하지만, 문제를 갖고 있습니다.
문제
어느 환경에서든 build 시 submodule 디렉터리에 있는 파일들이 모두 resources 로 복사되는 것이 문제입니다.
local 환경에서 테스트 코드를 실행할 때에도 yml 파일들이 복사되는 것을 볼 수 있습니다.
submodule 에 yml 파일들을 분리해둔 이유는 이 yml 파일들이 private 정보들을 포함하고 있기 때문입니다. 하지만 이 파일들을 resources 에 복사해서 사용한다면, 다른 코드에 대한 commit & push 를 진행할 때 yml 파일도 함께 올라갈 가능성이 있습니다.
현재 프로젝트에서는
.gitignore
에 private files 들을 등록해놓고 이를 방지하고 있습니다.다만, 새로운 yml 파일이 추가되거나 기존 yml 파일의 이름을 수정할 경우
.gitignore
에 이러한 변경사항을 반영하는 것을 잊을 수 있습니다.해결
gradle.build 를 통해 resources에 직접 copy 하는 방법을 사용하지 않고 다른 방법을 택해야 합니다. 다음의 두 가지 방법을 고려해볼 수 있습니다.
1. spring.config.import
spring.config.import 설정을 통해 yml 파일을 직접 불러올 수 있습니다. resources 디렉터리에 copy 하지 않아도 되는 방법입니다.
2. /config 디렉터리
Spring 공식문서를 살펴보면, SpringApplication이 로드될 때 yml 파일을 읽는 순서가 명시되어 있습니다.
/config
디렉터리/config
디렉터리classpath 혹은 프로젝트 디렉터리에서
config
라는 이름의 디렉터리에 존재하는 yml 파일을 읽는 것을 알 수 있습니다.따라서 submodule의 이름을 config 로 설정해둔다면 별다른 import 없이도 yml 파일을 읽게 할 수 있습니다.
submodule의 이름과 경로를 변경하는 명령어는 다음과 같습니다.
선택
두 번째 방법을 택하기로 결정했습니다. submodule 디렉터리의 이름을 config로 짓는다면, import를 명시하지 않아도 되는 점이 편리하게 느껴졌습니다. import 경로를 설정해두는 것도 관리해야 할 요소가 될 수 있기 때문입니다.
정리하자면, 두 번째 방법이 유지보수에 더 유리하다고 판단해 선택합니다.
Beta Was this translation helpful? Give feedback.
All reactions