기술과 산업/언어 및 프레임워크
Spring Framework 시리즈 7화 – @Value와 Environment로 설정값 주입하기
B컷개발자
2025. 5. 27. 19:07
728x90
Spring Framework에서 @Value 애노테이션과 Environment 객체를 사용해 외부 설정값을 주입하는 방법을 정리합니다. 프로퍼티 파일을 기반으로 한 환경 구성, 기본값 처리, 환경 분기 방법까지 실습 예제로 소개합니다.
왜 외부 설정이 필요한가?
코드에 설정값을 하드코딩하면 다음과 같은 문제가 발생합니다.
- 운영 환경마다 값이 달라 배포가 복잡해짐
- 비밀번호나 토큰이 노출되어 보안 취약
- 리팩토링/재사용이 어렵고 유지보수가 힘듦
스프링은 설정값을 외부에서 관리할 수 있도록 application.properties나 application.yml 파일을 통해 구성하고, 이를 주입할 수 있는 다양한 방법을 제공합니다.
1. @Value 애노테이션 – 간단한 주입
@Component
public class AppInfo {
@Value("${app.name}")
private String appName;
@Value("${app.version:1.0.0}") // 기본값 설정
private String version;
public void print() {
System.out.println("앱 이름: " + appName);
System.out.println("버전: " + version);
}
}
# application.properties
app.name=SpringCoreDemo
- ${...} 구문으로 프로퍼티 키를 지정
- 존재하지 않으면 IllegalArgumentException 발생
- :를 사용하면 기본값을 설정할 수 있음
2. Environment 객체 활용 – 프로그래밍 방식 접근
@Component
public class ConfigPrinter implements CommandLineRunner {
private final Environment env;
public ConfigPrinter(Environment env) {
this.env = env;
}
@Override
public void run(String... args) {
String appName = env.getProperty("app.name");
String profile = env.getProperty("spring.profiles.active", "default");
System.out.println("앱 이름: " + appName);
System.out.println("활성화된 프로파일: " + profile);
}
}
- Environment는 Spring이 자동 주입해주는 핵심 인터페이스
- 프로퍼티 존재 여부 확인, 기본값 설정 등 유연한 처리 가능
- containsProperty(), getRequiredProperty() 등 유용한 메서드 제공
3. 배열, 리스트 값 주입
app.supported.langs=en,ko,ja
@Value("${app.supported.langs}")
private String[] langs;
- ,로 구분된 값을 배열로 자동 매핑
- 필요한 경우 List<String>으로도 사용 가능
4. @ConfigurationProperties – 구조화된 설정 주입
@Component
@ConfigurationProperties(prefix = "app")
public class AppSettings {
private String name;
private String version;
// getter/setter 필수
}
app.name=SpringCoreDemo
app.version=1.2.3
- 설정값이 많은 경우에는 @Value보다 이 방식이 유지보수에 유리
- @EnableConfigurationProperties가 Spring Boot 2.2부터는 자동 적용됨
- application.yml 구조와 매핑이 용이
5. 외부 설정 파일의 우선순위
스프링은 설정 파일의 위치와 설정 방식에 따라 우선순위를 적용합니다. (높을수록 우선)
우선순위 위치 또는 방법
1 | application.properties or .yml (외부 명시) |
2 | --D 명령줄 파라미터 (-Dapp.name=...) |
3 | 환경 변수 (ENV) |
4 | 내부 resources/application.properties |
5 | @PropertySource로 수동 등록한 파일 |
6. 보안 정보 관리 팁
민감한 정보는 절대 git에 올라가선 안 됩니다. 이를 위해 아래와 같은 전략이 필요합니다:
- .gitignore에 application-secret.properties 명시
- CI/CD에서는 환경 변수로 주입하고 @Value("${ENV_VAR_NAME}")로 바인딩
- 비밀 설정만 따로 Vault, AWS Parameter Store, Spring Cloud Config 등으로 관리
7. Profile과 조건부 설정 – 환경 분기 처리
# application-dev.properties
app.mode=개발
# application-prod.properties
app.mode=운영
@Value("${app.mode}")
private String mode;
# application.properties
spring.profiles.active=dev
- spring.profiles.active 값을 변경하면 설정이 자동 전환
- 환경별 DB URL, 로그 설정 등 구성 가능
마무리 – 설정값 주입은 코드보다 강력한 인프라 전략
스프링의 설정 시스템은 단순한 값 주입 도구를 넘어 애플리케이션을 환경에 맞춰 변화시키는 전략의 핵심 요소입니다.
코드에 값을 직접 넣지 않고 외부에서 관리할 수 있도록 설계하는 습관은, 클린 아키텍처나 12-Factor App 원칙에서도 중요한 역할을 합니다.
다음 8화에서는 Profile을 활용한 설정 분리 전략을 자세히 살펴봅니다. 운영/개발/테스트 환경에 따라 서로 다른 설정을 자동 적용하는 방법, 실무에서 Profile을 구조화하는 방식 등을 소개할 예정입니다.
728x90