JDBC는 Java 프로그램이 DBMS에 접근할 수 있도록 해주는 표준 API이다. 즉, JAVA는 JDBC를 이용해 데이터베이스에서 자료를 다루는 방법을 제공한다. 우리는 이 JDBC를 이용해 MySQL, MongoDB, Oracle 등의 DB System을 Spring에서 사용할 것이다.
JDBC Driver는 자바 프로그램의 요청을 DBMS가 이해할 수 있는 프로토콜로 변환해주는 클라이언트 사이드 adapter이다. 우리가 사용할 DB는 달라지는 데 그에 따른 DBMS가 존재하므로 그에 맞는 Adapter가 필요하다. JDBC Driver에 우리가 사용할 DB에 맞는 설정을 해 사용해야 한다. DataSource를 JDBC Template을 통해 주입(Dependency Injection)시키고 JDBC Template은 JDBC를 이용하여 DB에 접근한다.
Spring에서 JDBC가 해주는 일은 아래와 같다. DB와 관련된 대부분은 일을 설정만 재대로 있다면 거의 다 해준다. 이로인해 개발자는 자신의 핵심 로직에 집중할 수 있게 된다.(개발 외에 Query문 짜는 건 아직 해줘야 하지만... 이 역시 해결하는 방법(기술)이 많이 나옴)
Connection Pool
데이터를 위해 DataBase에 접근, 즉 DataBase에 연결하려 하는 것은 비용이 많이 든다. 따라서 커넥션 풀은 미리 여러개의 Connection을 만들어 맺어두었다가 필요하면 빌려주고 끝나면 반납한다.
DataSource
DataSource는 Connection Pool을 관리하는 목적으로 사용되는 객체이다. DataSource를 이용해 커넨션을 얻어오고 반납하는 등의 작업을 수행할 수 있다.
import java.sql.*;로 import
import java.sql.*;
드라이버 로드
각각의 DB에 맞게 접속할 수 있는 Driver 객체를 생성한다.
mySQL의 경우
Class.forName("com.mysql.jdbc.Driver");
Oracle의 경우
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection객체 생성(얻기)
DB가 접속 됐을 때 얻어지는 객체 DriverManager를 통해 Conneciton 객체를 얻을 수 있다. Connection은 interface이고, 각각의 DB에 따라 벤더가 구현하고 있는 객체여야 한다. 이 벤더를 통해 라이브러리를 사용할 수 있는데 이러한 기능을 수행하는 것을 Driver Load라고 한다.
mySQL의 경우
String db_url = "jdbc:mysql://localhost/dbName";
Connection con = DriverManager.getConnection(db_url,ID,PW);
Oracle의 경우
String db_url = "jdbc:oracle:thin:@117.16.46.111:1521:xe"; // ip
Connection con = DriverManager.getConnection(db_url,ID,PW);
Statement 객체 생성 및 질의 수행
질의(sql) 수행을 위한 질의 상태 등을 담을 Statement 객체 생성
Statement stmt = con.createStatement();
후에 이 Statement 객체에 수행할 질의 선언 및 결과가 필요하면 결과 객체인 ResultSet에 저장
ResultSet rs = stmt.executeQuery("select no from user");
쿼리에 따른 실행 메서드
stmt.execute("query"); // any SQL
stmt.executeQuery("query"); // SELECT
stmt.executeUpdate("query"); // INSERT, UPDATE, DELETE
열었던 반대 순서로 모든 객체 닫기(필수)
ResultSet을 사용한 경우, 받아온 Result 사용 및 사용한 객체를 닫아워야 한다. 열었던 순서와 반대로 닫아주는 것이 중요하다.
ResultSet rs = stmt.executeQuery("select no from user");
while(rs.next()) // 결과 값이 많으면 메모리 부하적인 문제로 인해 하나씩 꺼내옴
System.out.println(rs.getInt("no"));
rs.close();
stmt.close();
con.close();