DataSource 알아보기
DataSource란?
DataSource는 커넥션을 회득하는 방법을 추상화하는 인터페이스로 DBCP2 커넥션 풀, HikariCP 커넥션 풀 등 다양한 커넥션 풀 방법이 있을 때 커넥션을 회득하는 방법을 변경하는 작업을 최소화하기 위해서 사용된다.
어떤 커넥션이든 연결하는 부분만을 추상화 후 원하는 구현방법을 개발자가 구현체를 통해서 코드를 직접적으로 의존하는 것이 아니라 DataSource 인터페이스에 의존하도록 하여 DB와 연결하는 방법이 더 효율적이다.
위 그림과 같이 DBCP2 커넥션 풀을 사용하다가 HikariCP 커넥션 풀을 사용하려고 할 때 DataSource의 해당 구현체로 변경 작업을 진행하면 간단히 커넥션 풀을 변경할 수 있다.
단, DriverManager는 DataSource 인터페이스를 사용하지 않아 DriverManager를 사용하다 커넥션 풀을 사용하려면 관련 코드를 전부 변경해야 하는 문제가 발생한다. 이런 문제를 해결하는 방법으로 DataSource에서 DriverManager를 사용할 수 있도록 DriverManagerDataSource를 DataSource에서 제공하여 문제를 해결했다.
public class DriverManagerDataSource extends AbstractDriverBasedDataSource {
...
@Override
protected Connection getConnectionFromDriver(Properties props) throws SQLException {
String url = getUrl();
Assert.state(url != null, "'url' not set");
if (logger.isDebugEnabled()) {
logger.debug("Creating new JDBC DriverManager Connection to [" + url + "]");
}
return getConnectionFromDriverManager(url, props);
}
/**
* Getting a Connection using the nasty static from DriverManager is extracted
* into a protected method to allow for easy unit testing.
* @see java.sql.DriverManager#getConnection(String, java.util.Properties)
*/
protected Connection getConnectionFromDriverManager(String url, Properties props) throws SQLException {
return DriverManager.getConnection(url, props);
}
}
Java는 DataSource를 통해커넥션을 회득하는 방법을 추상화작업을 통해 애플리케이션 로직에 DataSource 인터페이스만을 의존하도록 작업하였다.
DataSource와 DriverManager 비교 코드
@Slf4j
public class DBConnectionUtilTest {
@Test // DriverManager
void driverManager() throws SQLException {
Connection con1 = DriverManager.getConnection(URL, USERNAME, PASSWORD);
Connection con2 = DriverManager.getConnection(URL, USERNAME, PASSWORD);
log.info("connection={}, class={}", con1, con1.getClass());
log.info("connection={}, class={}", con2, con2.getClass());
}
@Test // DataSource
void dataSourceDriverManager() throws SQLException {
//DriverManagerDataSource - 항상 새로운 커넥션 획득
DataSource dataSource = new DriverManagerDataSource(URL, USERNAME, PASSWORD);
useDataSource(dataSource);
}
private void useDataSource(DataSource dataSource) throws SQLException {
Connection con1 = dataSource.getConnection();
Connection con2 = dataSource.getConnection();
log.info("connection={}, class={}", con1, con1.getClass());
log.info("connection={}, class={}", con2, con2.getClass());
}
}
두 개의 코드를 비교
DriverManager는 커넥션을 회득해야 할 때마다 URL, USERNAME, PASSWORD와 같은 파라미터를 계속 전달받아야 하지만, DataSource는 기본 세팅 이후 getConnection() 메서드를 통해서 호출만 하면 된다. 이런 방식은 설정과 사용이 분리되는 장점이 있고 모든 Connection이 DataSource의 세팅만을 의존하게 되어 다른 사이드 임팩트가 줄어든다.
'CS > Spring' 카테고리의 다른 글
TDD 방법론 알아보기 (4) | 2024.12.29 |
---|---|
Spring Bean 알아보기 (0) | 2024.05.31 |
Connection Pool 이해하기 (3) | 2024.03.23 |
Spring MVC과 관심사 분리 (1) | 2024.03.17 |
h2 DB에서 mysql로 변경하기 (0) | 2022.12.03 |