예제를 통해 DataSource 를 알아봅시다.
먼저 기존에 개발했던 DriverManager 를 통해서 커넥션을 획득하는 방법을 확인해보겠습니다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import static hello.jdbc.connection.ConnectionConst.PASSWORD;
import static hello.jdbc.connection.ConnectionConst.URL;
import static hello.jdbc.connection.ConnectionConst.USERNAME;
@Slf4j
public class ConnectionTest {
@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());
}
}
실행해서 실제 커넥션을 각각 가져오는지 확인해봅시다.
로그를 보면 서로 다른 커넥션임을 확인할 수 있습니다.
이번에는 스프링이 제공하는 DataSource 가 적용된 DriverManager 인 DriverManagerDataSource 를 사용해봅시다.
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import static hello.jdbc.connection.ConnectionConst.PASSWORD;
import static hello.jdbc.connection.ConnectionConst.URL;
import static hello.jdbc.connection.ConnectionConst.USERNAME;
@Slf4j
public class ConnectionTest {
@Test
void dataSourceDriverManager() throws SQLException {
//DriverManagerDataSource - 항상 새로운 커넥션 획득
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 도 DataSource 를 통해서 사용할 수 있도록 DriverManagerDataSource 라는 DataSource 를 구현한 클래스를 제공합니다.
DriverManagerDataSource 의 패키지를 보면 package org.springframework.jdbc.datasource;
로 되어있습니다. 스프링에서 제공한다는 것이죠.
반환 값을 DriverManagerDataSource 로 처리했지만 DataSource 로 받을 수 있습니다.
DriverManagerDataSource 의 부모를 따라가보면 결국 DataSource 를 구현하고 있기 때문입니다.
useDataSource()
실행결과를 확인해봅시다.