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는 관련된 여러 설정 값을 객체 단위로 묶어서 관리하는 방법입니다.
대규모 설정 값을 관리할 때 유용합니다.
사용법
- 설정 파일 (application.properties or application.yml)
app.name=MyApp
app.server.port=9090
app.server.host=localhost
app:
name: MyApp
server:
port: 9090
host: localhost
- 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; }
}
- 사용 예시
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
'개발 > Spring' 카테고리의 다른 글
| Spring Boot에서 파일 업로드 구현하기 (유니크한 파일명 저장 및 확장자 제한) (0) | 2025.02.13 |
|---|---|
| Spring Validation 어노테이션, 구현 방법 (0) | 2025.02.13 |
| Spring Boot Actuator 개요 (0) | 2025.02.12 |
| Spring Data 개요 (0) | 2025.02.12 |
| Spring @PostConstruct와 @PreDestroy 어노테이션 (1) | 2025.02.11 |