기술과 산업/언어 및 프레임워크

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