참고링크
클래스 주석 : Simple implementation of the standard JDBC javax.sql.DataSource interface, configuring the plain old JDBC DriverManager via bean properties, and returning a new Connection from every getConnection call.
SpringJdbcConfig.java
@Configuration
@ComponentScan
public class SpringJdbcConfig {
@Bean
public DataSource mysqlDataSource(){
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/spring");
dataSource.setUsername("root");
dataSource.setPassword("1111");
return dataSource;
}
}
SpringJdbcRepository.java
@Repository
public class SpringJdbcRepository {
private DataSource dataSource;
public SpringJdbcRepository(DataSource dataSource){
this.dataSource = dataSource;
}
public int getUserCount(){
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
int result = jdbcTemplate.queryForObject(
"SELECT COUNT(*) FROM USER", Integer.class
);
return result;
}
}
SpringJdbcTest.java
public class SpringJdbcTest {
public static void main(String[] args) {
ApplicationContext ac = new AnnotationConfigApplicationContext(SpringJdbcConfig.class);
SpringJdbcRepository repository = ac.getBean("springJdbcRepository",SpringJdbcRepository.class);
int queryResult = repository.getUserCount();
System.out.println(queryResult);
}
}
의문점
getConnection() 메소드를 통해 DB와 연결된 Connection 객체를 반환받는다. 이때 connection 객체는 새로 생성되는 것일까? 아니 ConnectionPool에 있는 객체의 주소를 받는 것일까?
새로운 커넥션을 생성한다. 커넥션풀을 사용하려면, 따로 설정해야 한다.
만약 커넥션 객체를 새로 생성한다면, Connection은 내부적으로 소켓으로 통신하는가? 어떤 통신 기법을 사용하는가?
connection은 서버에서 사용중인 DB에서 정의한 프로토콜을 기반으로 통신한다. 예를 들어, Mysql은 TCP/IP socket을 기반으로 통신하는 프로토콜을 사용한다. 따라서, connection이라 함은 socket을 통해 mysql과 연결되는 객체임을 알 수 있다.
public class RawJdbcTest {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
connectionCreateTest();
}
public static void connectionCreateTest() throws SQLException, ClassNotFoundException {
Connection connection1 = RawJdbcConfig.getConnection();
Connection connection2 = RawJdbcConfig.getConnection();
if(connection1 != connection2){
System.out.println("서로 다른 커넥션 객체를 생성합니다.");
}
}
}
// 출력 : 서로 다른 커넥션 객체를 생성합니다.
RawJdbcConfig.java
public class RawJdbcConfig {
public static Connection getConnection() throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.cj.jdbc.Driver");
String dburl = "jdbc:mysql://localhost:3306/spring?useSSL=false";
String ID = "root";
String PWD = "1111";
Connection conn = DriverManager.getConnection(dburl,ID,PWD);
return conn;
}
}
RawJdbcTest.java
public class RawJdbcTest {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
conn = RawJdbcConfig.getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery("select id from USER;");
while(rs.next()) System.out.println(rs.getInt("id"));
} catch (Exception e) {
e.printStackTrace();
}finally {
if(rs != null) {
rs.close();
}
if(stmt != null) {
stmt.close();
}
if(conn != null) {
conn.close();
}
}
}
}