설정 우선순위는 가장 구체적이고 나중에 정의된 것이 이긴다 는 대원칙을 따른다.
1. 설정 우선순위 (Top to Bottom)
- 커맨드 라인 인자 (Command Line Arguments)
- 예: java -jar app.jar --server.port=9090
- 어떤 설정 파일에 무엇이 적혀 있든, 실행 시 직접 입력한 이 값이 무조건 우선
- JVM 시스템 속성 (VM Options)
- 예: java -Dspring.profiles.active=prod -jar app.jar
- OS 환경 변수 (Environment Variables)
- 예: 데이터베이스 비밀번호 등을 시스템 환경 변수로 등록한 경우.
- 애플리케이션 외부의 설정 파일 (/config 폴더)
- JAR 파일과 같은 위치에 있는 config/application.yaml이 JAR 내부의 파일보다 우선
- 애플리케이션 내부의 프로필 기반 설정 (application-{profile}.yaml)
- 현재 활성화된 프로필(local, dev 등) 파일이 기본 파일보다 우선
- 애플리케이션 내부의 기본 설정 (application.yaml)
2. 멀티모듈에서 Class Path 싸움
호출 주체 모듈 > 호출 대상 모듈
예를 들어, core, api, admin 과 같은 멀티모듈에서 core 와 api 모듈 간의 관계를 보자.
rootProject.name = 'demo'
include 'demo-api'
include 'demo-admin'
include 'demo-core'
demo-api 모듈은 실행 모듈이자 core 모듈을 호출하여 사용한다.
demo-core 모듈은 라이브러리 모듈이며 demo-api와 batch 에서 호출되어 사용된다.
빌드 결과물로 보자면,
demo-api 모듈을 빌드하면
- demo-api 모듈의 설정은 빌드 시 BOOT-INF/classes 에 위치한다.
- demo-demo 모듈의 설정은 빌드 시 BOOT-INF/lib/demo-core.jar 내부의 classes 에 위치한다.
스프링 부트가 실행모듈인 demo-api 모듈의 class path를 먼저 찾고, 그다음 core 를 찾게 되는 순서이다.
즉 승자 독식(Winner Takes All) 방식이다.
스프링 부트가 application.yaml을 찾을 때, classes 폴더(api)와 lib/*.jar(core 등)를 순회한다.
- 스프링은 먼저 **실행 모듈의 classes**를 찾는다.
- 거기서 application.yaml을 발견하면 "아, 여기 설정 파일이 있네!" 하고 집어든다.
- 중요: 일단 파일을 찾으면, 다른 라이브러리(core.jar 등) 안에 있는 똑같은 이름의 파일은 더 이상 찾지 않고 무시한다.
따라서 나중에 발견되는 core.jar의 파일이 우선순위가 높은 게 아니라, 아예 로드조차 되지 않는다.
이러한 동작 이유는 스프링의 규칙이라기보다는 자바 ClassLoader 의 기본 동작 방식이기 때문이다.
- API 모듈의 application.yaml: BOOT-INF/classes/application.yaml
- Core 모듈의 application.yaml: BOOT-INF/lib/core.jar!/application.yaml
자바 입장에서는 둘 다 클래스패스 루트의 application.yaml로 보이지만, classes 폴더가 항상 lib보다 앞에 있기 때문에 api 쪽이 항상 승리이다.
이러한 이유로 모듈별로 설정파일 이름을 바꿔 구분하여서 spring.config.import에서 명시적으로 import 하는 것이다.
설정파일 이름이 같으면 자바 클래스로더가 로딩하지 않으니, 서로 다르게 네이밍하면 전부 로드하게 된다.
그 이후, spring.config.import 의 우선 순위 규칙으로 사용한다.
3. spring.config.import 사용
실행모듈에서 application.yaml 에서 라이브러리 모듈을 import 할때 우선순위가 있다.
- 가장 높은 순위 : 실행모듈에서 application.yaml 내용
- 중간 순위 : spring.config.import 의 리스트값 중 아래족에 명시된 파일
- 낮은 순위 : spring.config.import 의 리스트값 중 위족에 명시된 파일
core 에서 어플리케이션 공통 설정을 가져올때 동일한 설정이 api 모듈 설정에도 존재한다면 api 설정을 사용한다.
'개발 > spingboot' 카테고리의 다른 글
| H2 Datasource 설정 - File Based 방식 (0) | 2026.02.19 |
|---|---|
| Springboot Controller 에서 OpenAPI 분리하기 (0) | 2026.02.11 |