ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Framework 시리즈 7화 – @Value와 Environment로 설정값 주입하기
    기술과 산업/언어 및 프레임워크 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
Designed by Tistory.