스프링 부트는 설정값을 코드 밖(application.yml·환경변수·명령줄 인자 등)에 두고, 실행 환경에 따라 다른 값을 주입하게 해 준다. 같은 빌드 산출물을 개발·QA·운영에 그대로 쓰고 설정만 바꾸는 것이 목표다.
우선순위
여러 곳에 같은 키가 있으면 더 바깥(구체적인) 쪽이 이긴다. 대략 높은 순서로:
- 명령줄 인자(
--server.port=9000) - 자바 시스템 속성(
-Dserver.port=9000) - OS 환경변수(
SERVER_PORT=9000, 점은 밑줄·대문자로) - 프로파일별 파일(
application-prod.yml) - 기본 파일(
application.yml)
값 읽기
@Value("${app.page-size:20}") // 단일 값, 콜론 뒤는 기본값
private int pageSize;
@ConfigurationProperties(prefix = "app")
@Validated
public record AppProps(@Min(5) @Max(100) int pageSize, List<String> branches) {}@Value는 간단하지만 키가 흩어진다. 관련 값이 여럿이면@ConfigurationProperties로 묶어 타입 안전(type-safe)하게 받고,@Validated로 시작할 때 검증한다(Bean Validation)Environment를 주입받아env.getProperty("...")로 읽을 수도 있다- 기본 파일이 아닌 프로퍼티 파일은
@PropertySource로 추가한다
프로파일(profile)
환경별 설정 묶음이다. application-dev.yml, application-prod.yml을 두고 활성 프로파일을 고른다.
SPRING_PROFILES_ACTIVE=prod java -jar app.jar
java -jar app.jar --spring.profiles.active=prod- 테스트에서는
@ActiveProfiles("test") - 빈 자체를 프로파일로 갈아 끼울 수 있다:
@Profile("!prod")인 가짜 인증 제공자,@Profile("prod")인 실제 구현
비밀값
DB 비밀번호·API 키를 application.yml에 적어 커밋하지 않는다. 환경변수나 비밀 저장소(AWS Secrets Manager, Vault 등)에서 주입받는다(AWS CLI 프로필). 키스토어 비밀번호도 마찬가지다(Let's Encrypt로 HTTPS 적용).
프론트엔드 빌드 도구의 모드·env 파일과 비교하면 Vite mode와 env 파일, 환경변수가 프로세스에 전달되는 원리는 환경변수 스코프와 source를 본다. "설정을 코드에서 분리하라"는 원칙은 Twelve-Factor App의 Config 항목과 같다.
출처: Spring Boot 문서: Externalized Configuration · Type-safe Configuration Properties · Profiles · The Twelve-Factor App: Config