
Spring Boot에서 두 개 이상의 데이터베이스(DataSource) 를 사용할 때, @ConfigurationProperties는 사실상 필수라고 할 수 있습니다. 이유는 크게 네 가지입니다.
멀티 데이터소스 환경에서는 보통 아래처럼 여러 DB 설정이 존재합니다.
spring:
datasource:
main:
hikari:
jdbc-url: jdbc:mysql://localhost:3306/main
username: main_user
password: main_pw
maximum-pool-size: 10
log:
hikari:
jdbc-url: jdbc:mysql://localhost:3306/log
username: log_user
password: log_pw
maximum-pool-size: 3
각 DB는:
URL
사용자 정보
pool-size
connection-timeout
driver-class-name
등이 모두 다릅니다.
@ConfigurationProperties(prefix = "...") 를 사용하면
각 데이터소스가 자신의 설정만 정확하게 로드하도록 분리할 수 있습니다.
멀티 데이터소스에서 다음과 같은 코드가 자주 등장합니다.
@Bean("mainDataSource")
@ConfigurationProperties(prefix = "spring.datasource.main.hikari")
public DataSource mainDataSource() {
return DataSourceBuilder.create().build();
}
이 한 줄로 다음 모든 값이 자동으로 설정됩니다.
jdbc-url
username
password
connection pool 설정
driver-class-name
idle-timeout 등
만약 @ConfigurationProperties 없이 하드코딩한다면?
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl("jdbc:mysql://localhost:3306/main");
ds.setUsername("main_user");
ds.setPassword("main_pw");
ds.setMaximumPoolSize(10);
ds.setIdleTimeout(300000);
...
데이터소스가 3개면 잡아야 할 설정 항목이 3배로 늘어납니다.
멀티 데이터소스는 운영/개발/로컬 환경에서 DB가 다릅니다.
@ConfigurationProperties는 단순히 prefix를 따라 yaml 설정만 바꾸면 되기 때문에,
환경마다 코드 수정 없이 즉시 적용됩니다.
예)
-dev.yml → 개발 DB
-prod.yml → 운영 DB
-test.yml → 테스트 DB
각 환경에 따른 DB 전환이 매우 쉬워집니다.
멀티 데이터소스에서는 보통 HikariCP를 사용합니다.
HikariCP에는 다음과 같은 매우 많은 설정 항목이 있습니다.
pool-name
connection-timeout
idle-timeout
max-lifetime
minimum-idle
maximum-pool-size
initialization-fail-timeout
validation-timeout
connection-test-query
만약 이런 설정을 코드로 모두 작성하면 유지보수성이 크게 떨어집니다.
하지만 @ConfigurationProperties를 사용하면
HikariCP 관련 모든 값이 자동 매핑됩니다.
멀티 데이터소스 환경에서는 아래처럼 "패턴"이 반복됩니다.
spring:
datasource:
main:
hikari:
...
log:
hikari:
...
analytics:
hikari:
...
각각을 다음처럼 구성할 수 있습니다.
@ConfigurationProperties(prefix = "spring.datasource.main.hikari")
@Bean("mainDataSource")
public DataSource mainDataSource() { ... }
@ConfigurationProperties(prefix = "spring.datasource.log.hikari")
@Bean("logDataSource")
public DataSource logDataSource() { ... }
@ConfigurationProperties(prefix = "spring.datasource.analytics.hikari")
@Bean("analyticsDataSource")
public DataSource analyticsDataSource() { ... }
DB가 2개이든 10개이든
동일한 구조의 설정 패턴으로 확장할 수 있어 매우 편리합니다.
데이터소스별 설정을 확실하게 분리할 수 있습니다. DataSourceBuilder가 자동으로 값을 바인딩하므로 하드코딩이 필요 없으며, 환경(dev/prod/test) 전환이 매우 쉬워집니다. 또한 HikariCP 같이 설정 항목이 많은 라이브러리에 매우 적합하고,여러 개의 데이터소스를 동일한 패턴으로 확장하기 쉽습니다.