DataSource란?
커넥션을 획득하는 방법을 추상화하는 인터페이스.
1
2
3
public interface DataSource {
Connection getConncetion() throws SQLException;
}
이전에는 Connection을 획득할 때 는 JDBC의 DriverManager 기술만을 의존해왔다. 커넥션풀을 사용하는 방법으로 변경하려면 애플리케이션 코드도 함께 변경해야한다. 그래서 커넥션을 획득하는 방법을 추상화 시켰다. 이것을 DataSource라 한다.
DriverManager VS DataSource
DriverManager
1
2
3
4
5
6
7
@Test
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());
}
[결과]
INFO hello.jdbc.Connection.ConnectionTest - connection =conn0: url=jdbc:h2:tcp://localhost/~/test2 user=SA class= class org.h2.jdbc.JdbcConnection INFO hello.jdbc.Connection.ConnectionTest - connection =conn1: url=jdbc:h2:tcp://localhost/~/test2 user=SA class= class org.h2.jdbc.JdbcConnection
매번 Connection을 생성할때마다 DriverManager
에 설정값들을 넘겨줘야 한다.
DataSource
1
2
3
4
5
6
7
8
9
10
11
12
@Test
void dataSourceDriverManager() throws SQLException {
DriverManagerDataSource 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
는 DataSource
인터페이스를 사용하지 않는다. 때문에 DriverManager
를 직접 생성해서 사용해야한다. 만약 DriverManager
를 사용하다 connection pool로 변경을 한다고 하면 관련 코드들을 모두 수정해야한다.
그래서 Spring에선 DriverManagerDataSource
를 제공한다. DriverManagerDataSource
는 spring에서 DriverManager
도 DataSource
를 통해서 사용할 수 있도록 구현한 클래스이다.
[결과]
DEBUG org.springframework.jdbc.datasource.DriverManagerDataSource - Creating new JDBC DriverManager Connection to [jdbc:h2:tcp://localhost/~/test2] DEBUG org.springframework.jdbc.datasource.DriverManagerDataSource - Creating new JDBC DriverManager Connection to [jdbc:h2:tcp://localhost/~/test2] INFO hello.jdbc.Connection.ConnectionTest - connection =conn0: url=jdbc:h2:tcp://localhost/~/test2 user=SA class= class org.h2.jdbc.JdbcConnection INFO hello.jdbc.Connection.ConnectionTest - connection =conn1: url=jdbc:h2:tcp://localhost/~/test2 user=SA class= class org.h2.jdbc.JdbcConnection
DriverManager
는 커넥션을 획득할 때 마다 URL , USERNAME , PASSWORD 같은 파라미터를 계속 전달해야 한다. 반면에 DataSource
를 사용하는 방식은 처음 객체를 생성할 때만 필요한 파리미터를 넘겨두고, 커넥션을 획득할 때는 단순히 dataSource.getConnection()
만 호출하면 된다.
설정과 사용의 분리
설정 : DataSource를 만들고 URL , USERNAME , PASSWORD 같은 부분을입력하는 것. 설정과 관련된 속성들을 한곳에 모아두면 향후에 변경에 더욱 유연하게 대처할 수 있다.
분리 : 설정은 신경쓰지 않고 DataSource
의 getConnection()
을 사용하는것.
필요한 데이터를 DataSource
가 만들어지는 시점에 미리 다 넣어두게 되면, DataSource
를 사용하는 곳에서는 dataSource.getConnection()
만 호출하면 되므로, URL , USERNAME , PASSWORD 같은 속성들에 의존하지 않아도 된다. 그냥 DataSource
만 주입받아서 getConnection()
만 호출하면 된다.