DataSourceConfig
자동구성 클래스와 빈을 만들어 보겠습니다.
어떤 클래스가 존재할때만 Bean으로 등록할 것이기 때문에
@ConditionalMyOnClass
를 사용하였습니다.
따라서 hikariDataSource가 있다면 사용하고 없다면@ConditionalOnMissingBean
으로 인하여 SimpleDriverDataSource 가 빈으로 등록됩니다!
hikariDataSource
는 커넥션 풀을사용합니다SimpleDriverDataSource
는 커넥션을 요청마다 생성합니다.커넥션 풀의 대해서는 아래에서 설명하겠습니다!
@MyAutoConfiguration
@ConditionalMyOnClass("org.springframework.jdbc.core.JdbcOperations")
@EnableMyConfigurationProperties(MyDataSourceProperties.class)
public class DataSourceConfig {
@Bean
@ConditionalMyOnClass("com.zaxxer.hikari.HikariDataSource")
@ConditionalOnMissingBean
DataSource hikariDataSource(MyDataSourceProperties properties) {
// 매번 커넥션을 만들어냄
HikariDataSource dataSource = new HikariDataSource();
dataSource.setDriverClassName(properties.getDriverClassName());
dataSource.setJdbcUrl(properties.getUrl());
dataSource.setUsername(properties.getUsername());
dataSource.setPassword(properties.getPassword());
return dataSource;
}
@Bean
@ConditionalOnMissingBean
DataSource dataSource(MyDataSourceProperties properties) throws ClassNotFoundException {
// 매번 커넥션을 만들어냄
SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
dataSource.setDriverClass((Class<? extends Driver>) Class.forName(properties.getDriverClassName()));
dataSource.setUrl(properties.getUrl());
dataSource.setUsername(properties.getUsername());
dataSource.setPassword(properties.getPassword());
return dataSource;
}
}
커넥션을 매번 요청마다 생성한다면 커넥션 또한 DB와의 tcp/ip
연결이기 떄문에 비용이 많이 들어갑니다.
커넥션풀을 만들어 미리 커넥션을 생성해 놓고, 요청이 올때 만들어진 커넥션을 사용하고 반납하는 식으로 한다면, 커넥션이 생성되는 비용을 줄일 수 있습니다!
DB와 커넥션을 하기 위해 환경설정 정보를 application.properties (yml)파일에서 읽어와야 합니다.
@MyConfigurationProperties(prefix = "data")
prefix로 data를 적용하여 application.properties (yml)파일에 일지하는 key값을 찾습니다.
@MyConfigurationProperties(prefix = "data")
public class MyDataSourceProperties {
private String driverClassName;
private String url;
private String username;
private String password;
// getter setter
}
server.contextPath=/app
server.port=9090
data.driver-class-name=org.h2.Driver
data.url=jdbc:h2:mem:
data.username=sa
data.password=
애플리케이션이 작동할때는 Properties의 값들을 잘 읽어왔지만, Test환경에서는 적용이 안되었습니다.
TestPropertySource
를 사용해서 Properties의 경로를 설정할 수 있습니다!
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = HellobootApplication.class)
@TestPropertySource("classpath:/application.properties")
public class DataSourceTest {
@Autowired
DataSource dataSource;
@Test
void connection() throws SQLException {
Connection connection = dataSource.getConnection();
connection.close();
}
}
적용한 hikariDataSource
가 잘 작동하는것을확인하였습니다!