-
Spring Framework 시리즈 7화 – @Value와 Environment로 설정값 주입하기기술과 산업/언어 및 프레임워크 2025. 5. 27. 19:07728x90
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'기술과 산업 > 언어 및 프레임워크' 카테고리의 다른 글
Spring Framework 시리즈 9화 – ApplicationContext의 역할과 이벤트 처리 구조 (0) 2025.05.28 NestJS 마스터 시리즈 16화. 인증 시스템 구현 (2) – AuthGuard와 역할 기반 인가 처리 (0) 2025.05.28 Spring Framework 시리즈 6화 – 의존성 순환 오류 해결 전략 (0) 2025.05.27 NestJS 마스터 시리즈 15화. 인증 시스템 구현 (1) – JWT 기반 로그인 시스템 만들기 (1) 2025.05.27 전자정부 표준프레임워크 시리즈 10화 – 파일 업로드와 다운로드 처리 구조 분석: EgovFileMngService의 내부 작동 방식 (1) 2025.05.26