728x90
@Value를 사용하면 외부 설정값을 편리하게 주입받을 수 있다.
참고로 @Value 도 내부에서는 Environment를 사용한다.
MyDataSourceValueConfig
@Slf4j
@Configuration
public class MyDataSourceValueConfig {
@Value("${my.datasource.url}")
private String url;
@Value("${my.datasource.username}")
private String username;
@Value("${my.datasource.password}")
private String password;
@Value("${my.datasource.etc.max-connection}")
private int maxConnection;
@Value("${my.datasource.etc.timeout}")
private Duration timeout;
@Value("${my.datasource.etc.options}")
private List<String> options;
@Bean
public MyDataSource myDataSource1() {
return new MyDataSource(url, username, password, maxConnection, timeout, options);
}
@Bean //파라미터 주입 //알아서 converting 해준다
public MyDataSource myDataSource2(
@Value("${my.datasource.url}") String url,
@Value("${my.datasource.username}") String username,
@Value("${my.datasource.password}") String password,
@Value("${my.datasource.etc.max-connection}") int maxConnection,
@Value("${my.datasource.etc.timeout}") Duration timeout,
@Value("${my.datasource.etc.options}") List<String> options
) {
return new MyDataSource(url, username, password, maxConnection, timeout, options);
}
}
- @Value에 ${}를 사용해서 외부 설정의 키 값을 주면 원하는 값을 주입 받을 수 있다.
- @Value 는 필드에 사용할 수도 있고, 파라미터에 사용할 수도 있다.
- myDataSource1() 은 필드에 주입 받은 설정값을 사용한다.
- myDataSource2() 는 파라미터를 통해서 설정 값을 주입 받는다.
기본값
만약키를 찾지 못할 경우 코드에서 기본값을 사용하려면 다음과 같이 ":" 뒤에 기본값을 적어주면 된다.
예) @Value("${my.datasource.etc.max-connection:1}") : key 가 없는 경우 1을 사용한다.
@Slf4j
@Configuration
public class MyDataSourceValueConfig {
@Value("${my.datasource.url}")
private String url;
@Value("${my.datasource.username}")
private String username;
@Value("${my.datasource.password}")
private String password;
@Value("${my.datasource.etc.max-connection:2}") //디폴트 값 적용 가능
private int maxConnection;
@Value("${my.datasource.etc.timeout}")
private Duration timeout;
@Value("${my.datasource.etc.options}")
private List<String> options;
@Bean
public MyDataSource myDataSource1() {
return new MyDataSource(url, username, password, maxConnection, timeout, options);
}
@Bean //파라미터 주입 //알아서 converting 해준다
public MyDataSource myDataSource2(
@Value("${my.datasource.url}") String url,
@Value("${my.datasource.username}") String username,
@Value("${my.datasource.password}") String password,
@Value("${my.datasource.etc.max-connection:2}") int maxConnection,
@Value("${my.datasource.etc.timeout}") Duration timeout,
@Value("${my.datasource.etc.options}") List<String> options
) {
return new MyDataSource(url, username, password, maxConnection, timeout, options);
}
}
- max-connection 같은 경우 기본값이 적용이 된다.
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
실행하기
ExternalReadApplication - 수정
//@Import(MyDataSourceEnvConfig.class)
@Import(MyDataSourceValueConfig.class)
@SpringBootApplication(scanBasePackages = "hello.datasource")
public class ExternalReadApplication {
public static void main(String[] args) {
SpringApplication.run(ExternalReadApplication.class, args);
}
}
- @Import(MyDataSourceEnvConfig.class) 를 주석처리 한다.
- @Import(MyDataSourceValueConfig.class) 를 추가 한다.
단점
@Value를 사용하는 방식도 좋지만, @Value로 하나하나 외부 설정 정보의 키 값을 입력받고, 주입받아와야 하는 부분이 번거롭다.
그리고 설정 데이터를 보면 하나하나 분리되어 있는 것이 아니라 정보의 묶음으로 되어 있다.
여기서는 my.datasource 부분으로 묶여있다. 이런 부분을 객체로 변환해서 사용할 수 있다면 더 편리하고 더 좋을 것이다.
728x90
'스프링 부트(핵심 원리와 활용)' 카테고리의 다른 글
| Ch06. 외부설정과 프로필(2) - 외부 설정 사용(@ConfigurationProperties 생성자) (0) | 2023.03.18 |
|---|---|
| Ch06. 외부설정과 프로필(2) - 외부 설정 사용(@ConfigurationProperties 시작) (0) | 2023.03.18 |
| Ch06. 외부설정과 프로필(2) - 외부 설정 사용(Environment) (0) | 2023.03.15 |
| Ch05. 외부설정과 프로필(1) - 우선순위(전체) (0) | 2023.03.15 |
| Ch05. 외부설정과 프로필(1) - 우선순위(설정 데이터) (0) | 2023.03.13 |