Home [jdbc] datasource
Post
Cancel

[jdbc] datasource



DataSource란?



커넥션을 획득하는 방법을 추상화하는 인터페이스.

1
2
3
public interface DataSource {
	Connection getConncetion() throws SQLException;
}


이전에는 Connection을 획득할 때 는 JDBC의 DriverManager 기술만을 의존해왔다. 커넥션풀을 사용하는 방법으로 변경하려면 애플리케이션 코드도 함께 변경해야한다. 그래서 커넥션을 획득하는 방법을 추상화 시켰다. 이것을 DataSource라 한다.


23-08-30

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());
    }


DriverManagerDataSource 인터페이스를 사용하지 않는다. 때문에 DriverManager를 직접 생성해서 사용해야한다. 만약 DriverManager를 사용하다 connection pool로 변경을 한다고 하면 관련 코드들을 모두 수정해야한다.

그래서 Spring에선 DriverManagerDataSource 를 제공한다. DriverManagerDataSource 는 spring에서 DriverManagerDataSource 를 통해서 사용할 수 있도록 구현한 클래스이다.

[결과]
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 같은 부분을입력하는 것. 설정과 관련된 속성들을 한곳에 모아두면 향후에 변경에 더욱 유연하게 대처할 수 있다.

분리 : 설정은 신경쓰지 않고 DataSourcegetConnection()을 사용하는것.


필요한 데이터를 DataSource 가 만들어지는 시점에 미리 다 넣어두게 되면, DataSource 를 사용하는 곳에서는 dataSource.getConnection() 만 호출하면 되므로, URL , USERNAME , PASSWORD 같은 속성들에 의존하지 않아도 된다. 그냥 DataSource만 주입받아서 getConnection() 만 호출하면 된다.

This post is licensed under CC BY 4.0 by the author.

첫 포스팅

[jdbc] connection pool