✔️ 스프링이 지원하는 외부 설정
스프링이 지원하는 다양한 외부 설정 조회 방법
- Environment
- @Value - 값 주입
- @ConfigurationProperties - 타입 안전한 설정 속성
@Slf4j
public class MyDataSource {
private String url;
private String username;
private String password;
private int maxConnection;
private Duration timeout;
private List<String> options;
// 생성자
// @PostConstruct 로 멤버변수 log 출력
}
# application.properties
my.datasource.url=local.db.com
my.datasource.username=username
my.datasource.password=password
my.datasource.etc.max-connection=1
my.datasource.etc.timeout=3500ms
my.datasource.etc.options=CACHE,ADMIN
캐밥 표기법으로 사용(-)
1. Environment
@Slf4j
@Configuration
public class MyDataSourceEnvConfig {
private final Environment env;
public MyDataSourceEnvConfig(Environment env) {
this.env = env;
}
@Bean
public MyDataSource myDataSource() {
String url = env.getProperty("my.datasource.url");
// 뒤에 타입 적으면 해당 타입으로 변환
Integer maxConnection = env.getProperty("my.datasource.etc.max-connection", Integer.class);
//...
return new MyDataSource(url, username, password, maxConnection, timeout, options);
}
}
2. @Vaule
@Value도 내부에서는 Environment를 사용
@Slf4j
@Configuration
public class MyDataSourceValueConfig {
@Value("${my.datasource.url}")
private String url;
//...
@Bean
public MyDataSource myDataSource1() {
return new MyDataSource(url, username, password, maxConnection, timeout, options);
}
// 파라미터에 적용
@Bean
public MyDataSource myDataSource2(
@Value("${my.datasource.url}") String url,
// 생략..
@Value("${my.datasource.etc.options}") List<String> options) {
return new MyDataSource(url, username, password, maxConnection, timeout, options);
}
}
@Value("${my.url:default 값}")
:을 넣어서 기본값을 설정 가능
없으면 기본값 사용
3. ConfigurationProperties
스프링은 외부 설정의 묶음 정보를 객체로 변환하는 기능을 제공 : 타입 안전한 설정 속성
설정 정보 그 자체도 타입을 가지게 됨
자바 빈 검증기를 사용
@Getter
@Validated
@ConfigurationProperties("my.datasource")
public class MyDataSourcePropertiesV3 {
@NotEmpty
private String url;
@NotEmpty
private String username;
@NotEmpty
private String password;
private Etc etc;
public MyDataSourcePropertiesV3(String url, String username, String password, Etc etc) {
this.url = url;
this.username = username;
this.password = password;
this.etc = etc;
}
@Getter
public static class Etc {
@Min(1)
@Max(999)
private int maxConnection;
@DurationMin(seconds = 1)
@DurationMax(seconds = 60)
private Duration timeout;
private List<String> options;
public Etc(int maxConnection, Duration timeout, List<String> options) {
this.maxConnection = maxConnection;
this.timeout = timeout;
this.options = options;
}
}
}
@ConfigurationProperties 이 있으면 외부 설정을 주입 받는 객체라는 뜻
@Slf4j
@EnableConfigurationProperties(MyDataSourcePropertiesV3.class)
public class MyDataSourceConfigV3 {
private final MyDataSourcePropertiesV3 properties;
public MyDataSourceConfigV3(MyDataSourcePropertiesV3 properties) {
this.properties = properties;
}
@Bean
public MyDataSource dataSource() {
return new MyDataSource(properties.getUrl(),
properties.getUsername(),
properties.getPassword(),
properties.getEtc().getMaxConnection(),
properties.getEtc().getTimeout(),
properties.getEtc().getOptions());
}
}
@ConfigurationPropertiesScan
@SpringBootApplication
@ConfigurationPropertiesScan({ "com.example.app", "com.example.another" })
public class MyApplication {}
@EnableConfigurationProperties를 직접 추가하지 않고 주어진 패키지를 탐색해서
@ConfigurationProperties 이 붙은 클래스를 스캔하여 빈 등록한다.
ConfigurationProperties 장점
- 외부 설정을 객체로 편리하게 변환해서 사용
- 외부 설정의 계층을 객체로 편리하게 표현
- 외부 설정을 타입 안전하게 사용
- 검증기를 적용 가능
@ConstructorBinding : 생성자 둘 이상인 경우 사용
✔️ @Profile
각 환경마다 서로 다른 빈을 등록해야할때 사용
@Slf4j
@Configuration
public class PayConfig {
@Bean
@Profile("default")
public LocalPayClient localPayClient() {
log.info("LocalPayClient 빈 등록");
return new LocalPayClient();
}
@Bean
@Profile("prod")
public ProdPayClient prodPayClient() {
log.info("ProdPayClient 빈 등록");
return new ProdPayClient();
}
}
프로필 값을 주는 방법은 전 포스팅을 참고하자.
🔖 학습내용 출처
'Back-End > Spring Advance & Boot' 카테고리의 다른 글
스프링 부트 - 외부 설정과 프로필 (0) | 2025.01.21 |
---|---|
스프링 부트 - 자동 구성 (0) | 2024.11.27 |
스프링 부트 - 부트와 내장 톰캣 (0) | 2024.11.19 |
스프링 부트 - 웹 서버와 서블릿 컨테이너 (2) | 2024.11.15 |
스프링 고급편 - 실무 주의사항 (내부호출, 기술과 한계) (1) | 2024.11.13 |