2023. 5. 11. 13:19ใ์ธํ๋ฐ/์คํ๋ง ๋ถํธ - ํต์ฌ ์๋ฆฌ์ ํ์ฉ
์คํ๋ง ์ธ๋ถ ์ค์ ๋ฐฉ๋ฒ (์ธ๋ถ ๋ฐ์ดํฐ) (tistory.com)
์คํ๋ง์์ ์ธ๋ถ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก 4๊ฐ์ง ์ ๋ ์๋ค.
- OS ํ๊ฒฝ ๋ณ์
- ์๋ฐ ์์คํ ์์ฑ
- ์ปค๋งจ๋ ๋ผ์ธ ์ธ์
- ์ค์ ๋ฐ์ดํฐ (application.properties)
๊ทธ๋ฆฌ๊ณ ์ด ์ธ๋ถ ์ค์ ์ ์ฝ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ง๊ธ๊น์ง๋ Environment ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ดค๋๋ฐ ์คํ๋ง์ Environment ๋ง๊ณ ๋ 2๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ ์ ๊ณตํ๋ค.
* ์ธ๋ถ ์ค์ ์กฐํ ๋ฐฉ๋ฒ
- Environment
- @Value
- @ConfigurationProperties : ํ์ ์์ ํ ์ค์ ์์ฑ
0๏ธโฃ ์ธ๋ถ ์ค์ ์กฐํ ๋ฐฉ๋ฒ : Environment
์ธ๋ถ ์ค์ ๋ค์ ์คํ๋ง์ด ์ ๊ณตํ๋ Environment๋ฅผ ํตํด์ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ๊ฐ์ ์กฐํํ๊ณ ์ฌ์ฉํ ์ ์๋ค.
MyDataSource
@Slf4j
public class MyDataSource
{
private String url;
private String username;
private String password;
private int maxConnection;
private Duration timeout;
private List<String> options;
public MyDataSource(String url, String username, String password,
int maxConnection, Duration timeout, List<String> options)
{
this.url = url;
this.username = username;
this.password = password;
this.maxConnection = maxConnection;
this.timeout = timeout;
this.options = options;
}
@PostConstruct
public void init()
{
// ์ค์ ๋ ๊ฐ ์ถ๋ ฅ
log.info("url={}", url);
log.info("username={}", username);
log.info("password={}", password);
log.info("maxConnection={}", maxConnection);
log.info("timeout={}", timeout);
log.info("options={}", options);
}
}
์์ ๋ ํ์ํ ์์ฑ๋ค(url, username...) ๋ค์ ์ธ๋ถ ์ค์ ๊ฐ์ผ๋ก ์ฑ์ด ๋ค์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๊ณ ์ฌ์ฉํ๋ ์์ ์ด๋ค.
(์ค์ DB์ ์ ๊ทผํ์ง๋ ์์, ๋จ์ ์์ )
@PostConstruct
: ์ค์ ๋ ๊ฐ๋ค์ ํ์ธํ๊ธฐ ์ํด์ ์ฌ์ฉ
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
์ธ๋ถ ์์ฑ์ application.properties์ ์ค์ ํด๋๊ณ ์ฌ์ฉํ๋ค.
๐พ ๊ทธ๋ฆฌ๊ณ application.properties์์๋ ๋ํ ํ๊ธฐ๋ฒ์ด ์๋ ์ผ๋ฐฅ ํ๊ธฐ๋ฒ์ ์ฃผ๋ก ์ฌ์ฉํ๊ณ properties์๋ ์ผ๋ฐฅ ํ๊ธฐ๋ฒ์ ๊ถ์ฅํ๋ค.
์ผ๋ฐฅ ํ๊ธฐ๋ฒ์ ์๋ฌธ์ - (dash)๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
MyDataSourceEnvConfig
@Slf4j
@Configuration
public class MyDataSourceEnvConfig
{
private final Environment environment;
public MyDataSourceEnvConfig(Environment environment)
{
this.environment = environment;
}
@Bean
public MyDataSource myDataSource()
{
String url = environment.getProperty("my.datasource.url");
String username = environment.getProperty("my.datasource.username");
String password = environment.getProperty("my.datasource.password");
int maxConnection = environment.getProperty("my.datasource.etc.max-connection", Integer.class);
Duration timeout = environment.getProperty("my.datasource.etc.timeout", Duration.class);
List options = environment.getProperty("my.datasource.etc.options", List.class);
return new MyDataSource(url, username, password, maxConnection, timeout, options);
}
}
MyDatasource๋ฅผ ๋ง๋ค๊ณ ์ด๋ฅผ ๋น์ผ๋ก ๋ฑ๋กํ๊ธฐ ์ํ ์ค์ ํ์ผ์ด๋ค.
Environment๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ๋ถ ์ค์ ์ ์ด๋ค ๋ฐฉ์์ ์ฌ์ฉํ๋ ์ผ๊ด๋ ์ฝ๋๋ฅผ ํตํด์ ์ธ๋ถ ์ค์ ์ ์กฐํํ ์ ์๋ค.
Environment.getProperty(key, type) ๋ฅผ ํธ์ถํ ๋ ํ์ ์ ๋ณด๋ฅผ ์ฃผ๋ฉด ํด๋น ํ์ ์ผ๋ก ๋ณํํด์ค๋ค. (์คํ๋ง์ ํ์ ์ ๋ํด์ ๊ธฐ๋ณธ ๋ณํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.)
@Import(MyDataSourceEnvConfig.class)
@SpringBootApplication(scanBasePackages = "hello.datasource")
public class ExternalReadApplication {
public static void main(String[] args) {
SpringApplication.run(ExternalReadApplication.class, args);
}
}
MyDataSourceEnvConfig ์ค์ ํ์ผ์ ๋น์ผ๋ก ๋ฑ๋กํด์ ์ฌ์ฉํ๊ธฐ ์ํด์ @Import ๋ก ์ถ๊ฐ๋ฅผ ํด์ฃผ๊ณ ,
@SpringBootApplication(scanBasePackages = "hello.datasource") ๋ฅผ ํตํด ์ปดํฌ๋ํธ ์ค์บ ๋ฒ์๋ฅผ ์ ํํ๋ค.
(์๋ํ๋ฉด ๋ค์ ์์ ๋ฅผ ํ๋ฉด์ @Import ๋ก ์ค์ ์ ๋ณด๋ฅผ ๊ณ์ ๋ณ๊ฒฝํ ์์ ์ด๊ธฐ ๋๋ฌธ์ ์ค์ ์ ๋ณด๋ฅผ ๋ฐ๊พธ๋ฉด์ ์ฌ์ฉํ๊ธฐ ์ํด์ hello.config ๋ ์ปดํฌ๋ํธ ์ค์บ์ ํ์ง ๋ชปํ๊ฒ ์ ํํ๋ค. )
๐ application.properties์ ํ์ํ ์ธ๋ถ ์ค์ ๊ฐ๋ค์ ์ถ๊ฐํด์ฃผ๊ณ , ๊ทธ ๋ค์ Environment ๋ฅผ ํตํด์ ํด๋น ๊ฐ๋ค์ ์กฐํํด์ MyDataSource๋ฅผ ๋ง๋ค์๋ค.
๊ทผ๋ฐ Environment๋ฅผ ํตํด์ ์ธ๋ถ ์ค์ ๊ฐ๋ค์ ์กฐํํ ๋๋ getProperty๋ฅผ ํตํด์ ํ์ํ ๊ฐ๋ค์ ๊ณ์ ๊บผ๋ด๋ ๊ณผ์ ์ ๋ฐ๋ณตํด์ผ ํ๋ค๋ ๋จ์ ์ด ์๋ค.
1๏ธโฃ ์ธ๋ถ ์ค์ ์กฐํ ๋ฐฉ๋ฒ : @Value
์คํ๋ง์ด ์ ๊ณตํ๋ @Value ๋ฅผ ์ฌ์ฉํ๋ฉด Enviroment๋ฅผ ์ฌ์ฉํ ๋ getProperty ์ด๋ฐ ๋ฐ๋ณต๋๋ ๊ณผ์ ์ด ์์ด๋ ์ธ๋ถ ์ค์ ๊ฐ์ ํธ๋ฆฌํ๊ฒ ์ฃผ์ ๋ฐ์ ์ ์๋ค.
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);
}
// @Value๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ฌ์ฉํ ์๋ ์๋ค.
@Bean
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("${}") {} ์์ ํค ๊ฐ์ ๋ฃ์ด์ค๋ ์ํ๋ ๊ฐ์ ์ฃผ์ ๋ฐ์ ์ ์๋ค.
MyDataSource1๊ณผ MyDataSource2์์๋ ์ ์ ์๋ฏ์ด, @Value๋ ํ๋์ ์ฌ์ฉํ ์๋ ์๊ณ , ํ๋ผ๋ฏธํฐ์ ์ฌ์ฉํ ์๋ ์๋ค.
* ๊ธฐ๋ณธ๊ฐ
๋ง์ฝ @Value๋ก ๊ฐ์ ๊ฐ์ ธ์ฌ ๋ ๊ฐ์ด ์๋ค๋ฉด @Value("${my.datasource.max-connection:1}") : ๋ค์ ๊ธฐ๋ณธ ๊ฐ์ ์ ์ด์ฃผ๋ฉด ๋๋ค.
๐ ์ด๋ฒ์๋ application.properties์ ์ธ๋ถ ์ค์ ๊ฐ์ ์ถ๊ฐํด๋๊ณ , @Value ๋ฅผ ํตํด์ ํด๋น ๊ฐ๋ค์ ์ฝ์ด์ MyDataSource๋ฅผ ๋ง๋ค์๋ค.
@Value๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์ญ์ ํธ๋ฆฌํ์ง๋ง ๋ณด๋ฉด ์ค์ ๋ฐ์ดํฐ๋ฅผ ํ๋ํ๋ @Value๋ก ํค ๊ฐ์ ์ ๋ ฅํ๊ณ ์ฃผ์ ๋ฐ์์ผํ๋ ๋ถ๋ถ์ ์ญ์๋ ๋ฒ๊ฑฐ๋กญ๋ค.
2๏ธโฃ ์ธ๋ถ ์ค์ ์กฐํ ๋ฐฉ๋ฒ : @ConfigurationProperties
Type-safe Configuration Properties
: ์คํ๋ง์ ํ์ ์์ ํ ์ค์ ์์ฑ์ด๋ผ๊ณ ์ธ๋ถ ์ค์ ์ ๋ฌถ์ ์ ๋ณด๋ฅผ ๊ฐ์ฒด๋ก ๋ณํํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
์ ํ์ ์์ ํ ์ค์ ์์ฑ์ด๋ผ๊ณ ํ๋๋ ํ๋ฉด ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ ์ ์ฌ์ฉํ ์ ์๋๋ฐ, ์ด๋ฌ๋ฉด ์ค์๋ก ์๋ชป๋ ํ์ ์ด ๋ค์ด์ค๋ ๋ฌธ์ ๋ฅผ ๊ธ๋ฐฉ ๊ฐ์งํ๊ณ ๋ฐฉ์งํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
MyDataSourcePropertiesV1
@Data
@ConfigurationProperties("my.datasource")
public class MyDataSourcePropertiesV1
{
private String url;
private String username;
private String password;
private Etc etc;
@Data
public static class Etc {
private int maxConnection;
private Duration timeout;
private List<String> options = new ArrayList<>();
}
}
application.properties์ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ฉด ํ๋ํ๋ ๋ถ๋ฆฌ๋ ๊ฐ๋ค์ด ์๋๋ผ my.datasource๋ก ๋ฌถ์ฌ ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
MyDataSourcePropertiesV1์ ์ธ๋ถ ์ค์ ์ ๋ณด๋ฅผ ์ฃผ์ ๋ฐ์ ๊ฐ์ฒด๋ก ๊ฐ ํ๋๋ฅผ ์ธ๋ถ ์ค์ ํค ๊ฐ์ ๋ง์ถ์ด ์์ฑํด๋๋ค.
@ConfigurationProperties ์ด ์ด๋ ธํ ์ด์ ์ด ์์ผ๋ฉด ์ธ๋ถ ์ค์ ์ ์ฃผ์ ๋ฐ๋ ๊ฐ์ฒด๋ผ๋ ๋ป์ผ๋ก ๊ฐ์ฒด๋ก ๋ฌถ์ ์์์ (?)์ธ my.datasource๋ฅผ ํค ๊ฐ์ผ๋ก ์ ์ด์ค๋ค.
MyDataSourceConfigV1
@Slf4j
@EnableConfigurationProperties(MyDataSourcePropertiesV1.class)
public class MyDataSourceConfigV1
{
private final MyDataSourcePropertiesV1 propertiesV1;
public MyDataSourceConfigV1(MyDataSourcePropertiesV1 propertiesV1)
{
this.propertiesV1 = propertiesV1;
}
@Bean
public MyDataSource dataSource()
{
return new MyDataSource(propertiesV1.getUrl(),
propertiesV1.getUsername(),
propertiesV1.getPassword(),
propertiesV1.getEtc().getMaxConnection(),
propertiesV1.getEtc().getTimeout(),
propertiesV1.getEtc().getOptions());
}
}
@EnableConfigurationProperties(MyDataSourcePropertiesV1.class)
: ์ด ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํด์ ์คํ๋ง์๊ฒ MyDataSourcePropertiesV1์ ConfigurationProperties๋ก ์ฌ์ฉํ ๊ฒ์ด๋ผ๊ณ ์๋ ค์ค์ผ ํ๋ค.
๊ทธ๋ฌ๋ฉด ์ด ํด๋์ค๋ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋๊ณ ํ์ํ ๊ณณ์์ ์ฃผ์ ๋ฐ์์ ์ฌ์ฉํ ์ ์๋ค.
๐ @ConfigurationProperties๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ ์์ ํ ์ค์ ์์ฑ์ ์ฌ์ฉํ ์ ์๋ค.
๋ง์ฝ max-connection์ ์ซ์๊ฐ ์๋ dkafj ๋ญ ์ด๋ฐ ๋ฌธ์์ด์ด ๋ค์ด๊ฐ๋ค๊ณ ํ๋ฉด ์คํํ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํด์ ํ์ ์ด ๋ค๋ฅด๋ค๊ณ ์๋ ค์ค๋ค.
๋ฐ๋ผ์ ์ค์๋ก ์ซ์๋ฅผ ๋ฃ์ด์ผํ๋ ๊ณณ์ ๋ฌธ์๋ฅผ ๋ฃ๋ ์ค์๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
์ด๋ฒ ๋ฐฉ๋ฒ์ application.properties์ ์ธ๋ถ ์ค์ ๊ฐ์ ๋ฃ์ด๋๊ณ , @ConfigurationProperties๋ฅผ ์ฌ์ฉํด์ MyDataSourcePropertivesV1 ์ ์ธ๋ถ ์ค์ ๊ฐ๋ค์ ์ค์ ํด MyDataSource๋ฅผ ๋ง๋ค์๋ค.
* ๊ทธ๋ฆฌ๊ณ ์ด๋ application.properties๋ ์ผ๋ฐฅ ํ๊ธฐ๋ฒ์ด๊ณ , MyDatasourcePropertiesV1์์๋ ๋ํ ํ๊ธฐ๋ฒ์ผ๋ก maxConnection์ ๋ค๋ฃจ๊ณ ์๋๋ฐ ์คํ๋ง์ ์ผ๋ฐฅ ํ๊ธฐ๋ฒ์ ๋ํํ๊ธฐ๋ฒ์ผ๋ก ์ค๊ฐ์์ ์๋์ผ๋ก ๋ณํํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์ ๊ฒฝ์ธ ํ์๋ ์๋ค.
@ConfigurationPropertiesScan
@ConfigurationProperties๋ฅผ ํ๋ํ๋ ๋ฑ๋กํ ๋๋ @EnableConfigurationProperties๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ง๋ง ๋ง์ฝ ํน์ ๋ฒ์๋ก ์๋ ๋ฑ๋กํ๊ณ ์ถ์ ๋๋ ๋ฉ์ธ ๋ฉ์๋์ @ConfigurationPropertiesScan ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํด์ฃผ๋ฉด ๋๋ค.
@ConfigurationPropertiesScan
@SpringBootApplication(scanBasePackages = "hello.datasource")
public class ExternalReadApplication {
public static void main(String[] args) {
SpringApplication.run(ExternalReadApplication.class, args);
}
}
MyDataSourcePropertiesV2
@Getter
@ConfigurationProperties("my.datasource")
public class MyDataSourcePropertiesV2
{
private String url;
private String username;
private String password;
private Etc etc;
public MyDataSourcePropertiesV2(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 {
private int maxConnection;
private Duration timeout;
private List<String> options = new ArrayList<>();
public Etc(int maxConnection, Duration timeout, @DefaultValue("DEFAULT") List<String> options)
{
this.maxConnection = maxConnection;
this.timeout = timeout;
this.options = options;
}
}
}
์์ MyDatasourcePropertiesV1์ Getter, Setter๋ฅผ ํตํด ๊ฐ์ ์ฝ๊ณ ์ฐ๊ณ ํ๊ณ ์๋๋ฐ Setter ๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ธ๋ถ ์ค์ ๊ฐ์ผ๋ก ๊ฐ์ ธ์๋๋ฐ๋ ๋ถ๊ตฌํ๊ณ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค.
๋ณดํต ์ธ๋ถ ์ค์ ๊ฐ์ ๊ฐ์ ธ์์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ํ๋ฒ ์กฐํํด์ ๊ฐ์ ์ ๋ ฅํ๊ณ ๋๋ฉด ๋ ์ด์ ๋ณ๊ฒฝํ ์ผ์ด ์๋ค๋ ๊ฑด๋ฐ Setter๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ด๋ ํฌ์ธํธ์์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ง ๋ชจ๋ฅธ๋ค๋ ์ํ์ด ์๋ค.
๋ฐ๋ผ์ Getter, Setter ๋ฐฉ์์ด ์๋ MyDatasourcePropertiesV2 ์ฒ๋ผ ์์ฑ์๋ฅผ ํตํด ๊ฒ์ฒด๋ฅผ ๋ง๋๋ ๊ฒ์ด ๋ ์์ ํ ๋ฐฉ๋ฒ์ด๋ค.
(๋์ ๊ฐ์ฒด๋ฅผ ์กฐํํ ์๋ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ @Getter๋ง ๋จ๊ฒจ๋๋ค. )
@DefaultValue
: ํด๋น ๊ฐ์ ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ์ ๊ธฐ๋ณธ ๊ฐ์ ์ฌ์ฉํ๋๋ก ์ง์ ํด์ฃผ๋ ์ด๋ ธํ ์ด์
@DefaultValue("DEFAULT") List<String> options ๋ก ํด์ฃผ๋ฉด options์ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ์๋ DEFAULT ๋ฅผ ๊ธฐ๋ณธ ๊ฐ์ผ๋ก ์ฌ์ฉํ๋ค.
MyDataSourceConfigV2
@Slf4j
@EnableConfigurationProperties(MyDataSourcePropertiesV2.class)
public class MyDataSourceConfigV2
{
private final MyDataSourcePropertiesV2 propertiesV2;
public MyDataSourceConfigV2(MyDataSourcePropertiesV2 propertiesV2)
{
this.propertiesV2 = propertiesV2;
}
@Bean
public MyDataSource dataSource()
{
return new MyDataSource(propertiesV2.getUrl(),
propertiesV2.getUsername(),
propertiesV2.getPassword(),
propertiesV2.getEtc().getMaxConnection(),
propertiesV2.getEtc().getTimeout(),
propertiesV2.getEtc().getOptions());
}
}
MyDataSourceProperties๋ฅผ ๋น์ผ๋ก ๋ฑ๋กํ๊ณ ์ธ๋ถ ์ค์ ๊ฐ์ ์ฌ์ฉํ๊ธฐ ์ํด์ @EnableConfigurationProperties ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ค.
๐ MyDataSourcePropertiesV2์์๋ณด๋ฉด application.properties ์์ ์ธ๋ถ ์ค์ ๊ฐ์ ์ถ๊ฐํด์ฃผ๊ณ , ๊ทธ ๋ค์ @ConfigurationProperties ์ ์์ฑ์ ์ฃผ์ ์ ํตํด์ ์ด ์ธ๋ถ ์ค์ ๊ฐ์ ์ฝ์ด์จ๋ค. Setter๊ฐ ์๋ ์์ฑ์๋ฅผ ํตํด์ ์ธ๋ถ ์ค์ ๊ฐ์ ์ฝ์ด์ค๊ธฐ ๋๋ฌธ์ ์ด์ ์ค๊ฐ์ ๋ณ๊ฒฝ๋ ์ผ์ ๋ฐ์ํ์ง ์๋๋ค!
3๏ธโฃ @ConfigurationProperties ๊ฒ์ฆ
@ConfigurationProperties ํ์ ์์ ์ค์ ์์ฑ์ ํตํด์ ์ธ๋ถ ์ค์ ์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ด์ ๊ฐ์ฒด๋ก ๋ณํํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ซ์๊ฐ ๋ค์ด๊ฐ์ผํ๋ ๋ถ๋ถ์ ๋ฌธ์๊ฐ ๋ค์ด๊ฐ๊ณ ์ด๋ฐ ๋ฌธ์ ๋ ๋ฐฉ์งํ ์ ์์ง๋ง, ์ซ์์ ๋ฒ์๋ ๋ฌธ์ ๊ธธ์ด์ ๋ํด์๋ ๊ฒ์ฆ์ด ์ด๋ ต๋ค.
(๋ฌผ๋ก ์ฝ๋๋ก ์ง์ ์์ฑํด์ ๊ฒ์ฆํ ์๋ ์์ง๋ง ์ด๋ ๊ฒ ํ๋ ค๋ฉด ํ๋ํ๋ ๊ฒ์ฆ ์ฝ๋๋ฅผ ๋ฃ์ด์ผ ํด์ ๋ฒ๊ฑฐ๋กญ๊ณ ์ฝ๋๋ ์ง์ ๋ถํด์ง๋ค.
๋์ ์๋ฐ ๋น ๊ฒ์ฆ๊ธฐ (Java Bean Validation) ์ ํตํด์ ๊ฒ์ฆํ ์ ์๋ค.)
implementation 'org.springframework.boot:spring-boot-starter-validation'
์ฐ์ build.gradle์ ์ถ๊ฐํด์ฃผ๊ณ reload ํด์ค๋ค.
MyDataSourcePropertiesV3
@Getter
@ConfigurationProperties("my.datasource")
@Validated
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 = new ArrayList<>();
public Etc(int maxConnection, Duration timeout, List<String> options)
{
this.maxConnection = maxConnection;
this.timeout = timeout;
this.options = options;
}
}
}
- url, username, password์๋ @NotEmpty๋ฅผ ์ค์ ํญ์ ๊ฐ์ด ์๋๋ก ํ๋ค.
- maxConnection ์๋ @Min(1), @Max(999)๋ก ๊ฐ์ ์ ํํด์ ์ต์ 1, ์ต๋ 999๋ก ๊ฐ์ ํ์ฉํด ๊ทธ ๊ฐ์ ๋๊ฑฐ๋ ๋ถ์กฑํ๋ฉด ์๋ฌ๊ฐ ๋๋๋ก ํ๋ค.
- timeout์๋ @DurationMin(seconds =1), @DurationMax(seconds = 60) ์ ์ค์ ์ต์ 1์ด, ์ต๋ 60์ด๋ก ์ ํํ๋ค.
MyDataSourceConfigV3
@Slf4j
@EnableConfigurationProperties(MyDataSourcePropertiesV3.class)
public class MyDataSourceConfigV3
{
private final MyDataSourcePropertiesV3 propertiesV3;
public MyDataSourceConfigV3(MyDataSourcePropertiesV3 propertiesV3)
{
this.propertiesV3 = propertiesV3;
}
@Bean
public MyDataSource dataSource()
{
return new MyDataSource(propertiesV3.getUrl(),
propertiesV3.getUsername(),
propertiesV3.getPassword(),
propertiesV3.getEtc().getMaxConnection(),
propertiesV3.getEtc().getTimeout(),
propertiesV3.getEtc().getOptions());
}
}
์ด๋ ๊ฒ ๊ฐ ์ ํ์ ํ๊ณ ๋์ ์คํํ ๋ application.properties์ maxConnection์ ๋ง์ฝ 0์ผ๋ก ์ค์๋ก ์ค์ ์ ํ๋ค๋ฉด
์ด๋ฐ์์ผ๋ก ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
๐ ConfigurationProperties ์ ๋ฆฌ
@ConfigurationProperties ๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ๋ถ ์ค์ ์ ๊ฐ์ฒด๋ก ๋ณํํด์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๊ณ , ์ธ๋ถ ์ค์ ์ ํ์ ์์ ํ๊ฒ ์ฌ์ฉํ๋ฉฐ ๊ฒ์ฆ๊ธฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
'์ธํ๋ฐ > ์คํ๋ง ๋ถํธ - ํต์ฌ ์๋ฆฌ์ ํ์ฉ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์คํ๋ง๋ถํธ Actuator (0) | 2023.05.15 |
---|---|
์คํ๋ง YAML, @Profile (0) | 2023.05.11 |
์คํ๋ง ์ธ๋ถ ์ค์ ๋ฐฉ๋ฒ (์ค์ ํ์ผ ์ฐ์ ์์) (0) | 2023.05.10 |
์คํ๋ง ์ธ๋ถ ์ค์ ๋ฐฉ๋ฒ (์ธ๋ถ ๋ฐ์ดํฐ) (0) | 2023.05.09 |
์คํ๋ง ์ธ๋ถ ์ค์ ๋ฐฉ๋ฒ (์ปค๋งจ๋ ๋ผ์ธ ์ธ์, ์ปค๋งจ๋ ๋ผ์ธ ์ต์ ์ธ์, ์คํ๋ง ํตํฉ) (0) | 2023.05.08 |