개발/Spring

[Spring Boot] Environment, @Value, @ConfigurationProperties

피터JK 2025. 2. 12. 19:16
728x90

Spring Boot에서 Environment, @Value, @ConfigurationProperties는 설정 값을 주입받는 방법이지만,
각각의 방식이 다릅니다. 아래에서 차이점과 사용법을 설명하겠습니다.


1. Environment 인터페이스

Environment는 애플리케이션의 설정 값을 프로그래밍적으로 가져올 수 있는 인터페이스입니다.
Spring의 ApplicationContext에서 주입받아 사용하며, 특정 프로퍼티 값을 동적으로 가져올 수 있습니다.

사용법

import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

@Component
public class PropertyUtil {

    private final Environment environment;

    public PropertyUtil(Environment environment) {
        this.environment = environment;
    }

    public String getPropertyValue(String key) {
        return environment.getProperty(key);
    }
}

특징

  • 런타임 시점에서 동적으로 프로퍼티 값을 가져올 수 있음.
  • 기본값을 설정할 수 있음 (environment.getProperty("key", "defaultValue")).
  • @Value와 @ConfigurationProperties보다 자유도가 높지만, 타입 변환이 자동으로 되지 않음.

2. @Value 어노테이션

@Value는 단일 설정 값을 주입받는 방법으로, 간단한 프로퍼티 값을 가져올 때 유용합니다.

사용법

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class AppProperties {

    @Value("${app.name}")
    private String appName;

    @Value("${server.port:8080}")  // 기본값 설정 가능
    private int serverPort;

    public String getAppName() {
        return appName;
    }

    public int getServerPort() {
        return serverPort;
    }
}

특징

  • ${property.key} 형태로 설정 값을 가져옴.
  • @Value("${key:기본값}")처럼 기본값을 설정할 수 있음.
  • 타입 변환을 자동으로 지원 (int, boolean 등).
  • 프로퍼티가 많아지면 관리가 어려워짐 → @ConfigurationProperties를 추천.

3. @ConfigurationProperties 어노테이션

@ConfigurationProperties는 관련된 여러 설정 값을 객체 단위로 묶어서 관리하는 방법입니다.
대규모 설정 값을 관리할 때 유용합니다.

사용법

  1. 설정 파일 (application.properties or application.yml)
app.name=MyApp
app.server.port=9090
app.server.host=localhost
app:
  name: MyApp
  server:
    port: 9090
    host: localhost
  1. Java 클래스에 바인딩
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties(prefix = "app")
public class AppConfigProperties {

    private String name;
    private Server server;

    public static class Server {
        private int port;
        private String host;

        // Getter & Setter
        public int getPort() { return port; }
        public void setPort(int port) { this.port = port; }

        public String getHost() { return host; }
        public void setHost(String host) { this.host = host; }
    }

    // Getter & Setter
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    public Server getServer() { return server; }
    public void setServer(Server server) { this.server = server; }
}
  1. 사용 예시
import org.springframework.stereotype.Component;

@Component
public class AppConfigService {

    private final AppConfigProperties appConfigProperties;

    public AppConfigService(AppConfigProperties appConfigProperties) {
        this.appConfigProperties = appConfigProperties;
    }

    public void printConfig() {
        System.out.println("App Name: " + appConfigProperties.getName());
        System.out.println("Server Port: " + appConfigProperties.getServer().getPort());
        System.out.println("Server Host: " + appConfigProperties.getServer().getHost());
    }
}

특징

  • @ConfigurationProperties(prefix = "app")를 사용해 관련 설정 값들을 그룹핑할 수 있음.
  • @Value보다 재사용성이 높고 유지보수가 쉬움.
  • 타입 변환이 자동으로 지원됨 (int, boolean 등).
  • @EnableConfigurationProperties(AppConfigProperties.class)(Spring Boot 2.x 이하) 필요하지만,
    Spring Boot 3.x 이상에서는 생략 가능.

4. 비교 및 정리

방식  주요 특징  사용 목적
Environment 프로퍼티 값을 직접 가져올 수 있음 동적으로 값을 조회할 때
@Value 단일 값 주입, 기본값 설정 가능 간단한 프로퍼티 주입
@ConfigurationProperties 여러 개의 관련 설정을 객체로 묶어 관리 설정이 많을 때

👉 추천하는 사용법

  • 설정 값이 적고 간단한 경우: @Value
  • 설정 값이 많고 그룹화해야 할 경우: @ConfigurationProperties
  • 동적으로 설정 값을 가져와야 하는 경우: Environment

 

728x90