DriverManager
[Java강의노트] JDBC를 이용한 DBMS 연결하기
JDBC를 이용한 데이터베이스 연결
1. JDBC 소개
JDBC는 자바 언어를 이용하여 데이터베이스에 접근할 수 있는 프로그래밍 API입니다. 데이터베이스에 접근해서 작업을 하기위해 SQL(Structured Query Language)를 사용합니다. JDBC는 이 자바 언어를 이용하여 SQL로 작성된 쿼리 객체를 데이터베이스에 전달하여 데이터베이스 안의 테이블을 대상으로 작업을 할 수 있도록 해줍니다.
JDBC는 실제로는 Interface로 정의되어 있기 때문에 각 데이터베이스 제조사들은 각자 자신들의 데이터베이스에 접속해서 작업할 수 있도록 Interface를 구현하여 드라이버 클래스를 만들어서 프로그래머들에게 제공하고 있습니다. 그러므로 프로그래머는 어떤 데이터베이스의 JDBC를 사용하더라도 통일된 메서드의 사용을 통해 작업을 할 수 있으므로 개별 데이터베이스에 접근하는 방법을 일일이 배울 필요없이 표준적인 JDBC의 사용법만을 익히면 JDBC를 제공하는 모든 데이터베이스에 대해 프로그래밍을 할 수 있는 장점을 얻게 됩니다.
JDBC의 역사를 거슬러 올라가면 Microsoft社의 ODBC(Open Database Connectivity)의 영향을 받아 만들어졌습니다. 그래서 자바는 필요하다면 ODBC를 직접 이용할 수도 있습니다. 하지만 C언어로 제작된 ODBC를 이용하려면 여러가지 복잡한 작업이 필요하며 무엇보다 자바의 객체지향적인 언어적 장점을 살릴 수 없게 됩니다. 그래서 순수 자바 기술이 적용된 JDBC를 만들게 된 것입니다.
JDBC는 이미 설명한 바와 같이 프로그래머가 이용하기 위한 API 명세인 Interface 외에 실제 데이터베이스와 연결을 책임지는 드라이버의 2중 구조로 되어 있습니다. JDBC Interface의 핵심부는 DirverManager라는 클래스로 이 클래스는 다양한 드라이버를 자바 응용 프로그램과 연결시켜 주는 역할을 합니다. JDBC 드라아버는 다양한 단체와 업체에서 만들어지기 때문에 다양한 방식으로 제작되는데 4가지 타입이 있습니다.
TYPE1. JDBC-ODBC 브리지 드라이버
Sun社에서 기본적으로 제공하는 JDBC 드라이버로써 윈도우 운영체제에서 제공되는 ODBC를 사용할 수 있도록 해줍니다. sun.jdbc.odbc 패키지를 통해 해당 클래스들이 제공됩니다.
TYPE 2. 네이티브 JDBC 드라이버
DBMS의 C 언어나 C++ 언어용 API를 호출하는 자바 언어로 작성된 메서드입니다. 오라클의 OCI 드라이버가 이 타입에 속합니다.
TYPE 3. JDBC 네트워크 연결 드라이버
JDBC 메서드 호출을 DBMS에 독립적인 네트워크 프로토콜로 바꾸어 미들웨어에게 전달하고 이 미들웨어가 DBMS와 통신을 하는 형태의 순수 자바로 작성된 드라이버입니다.
TYPE-4. DBMS 프로토콜 준수 드라이버
가장 일반적으로 사용되는 드라이버로 DBMS를 직접 접속하여 사용합니다. DBMS 프로토콜을 직접 사용하므로 DBMS에 종속되어 DBMS마다 별도로 만들어집니다. 대부분 DBMS 제작사에서 제공하며 순수 자바로 작성되어 있습니다. 이번 시간에 사용하게 될 MySQL용 JDBC 드라이버 역시 타입4에 해당하는 드라이버입니다.
2. MySQL용 JDBC의 설치
http://www.mysql.com로 접속하여 Developer Zone-Downloads-Connectors-Connector/J 순으로 선택하여 mysql-connector-java-5.1.8.zip 파일을 내려받습니다. 내려받은 파일의 압축을 풀고 mysql-connector-java-5.1.8-bin.jar 파일을 JDK가 설치된 디렉터리에 있는 jre/lib/ext 디렉터리에 복사해 넣습니다. 이 디렉터리는 JVM(자바 가상 머신)이 실행될 때 자동으로 읽어들이는 실행경로(PATH)이므로 별도의 환경변수 설정없이 사용할 수 있습니다.
이클립스의 경우 기본적으로 JDK가 아닌 JRE를 이용하여 실행되므로 JRE가 설치된 경로의 lib/ext 디렉터리에 복사해 넣어야 제대로 사용할 수 있습니다.
3. 연결테스트 하기
일반적으로 JDBC 응용프로그램은 2가지 방식으로 데이터베이스에 연결됩니다.
- DriverManager : 해당 DBMS용 드라이버가 필요하며 DBMS 연결에 필요한 정보는 URL 형식으로 응용프로그램의 소스내에 직접 코딩됩니다.
- DataSource : DataSource 객체를 통해 Data Source(접근하고하는 DB 대상)에 투명하게 접근할 수 있습니다. 연결에 필요한 정보는 DataSource 객체의 속성으로 숨겨지지 때문에 응용프로그램 소스에는 연결 정보가 감춰집니다.
연결은 JDBC 드라이버를 로딩하고 연결을 만드는 2단계로 이뤄집니다.
드라이버 로딩하기
Class.forName() 메서드를 이용하여 JDBC 드라이버 클래스를 로딩하면 자동으로 해당 클래스의 인스턴스가 만들어져서 드라이버를 사용할 수 있게 됩니다.
(사용예)
package net.jeongsam.excise; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; /** * JDBC 사용 예제1 * MySQL과 연결 테스트 * @author 정승용 * */ class JdbcEx01 { public static void main(String[] args) { Connection conn = null; String url = "jdbc:mysql://127.0.0.1/example?user=root&password=1234"; try { // MySQL jdbc 드라이버 로드 Class.forName("com.mysql.jdbc.Driver"); // DriverMangar을 이용하여 Connection 인스턴스 생성 conn = DriverManager.getConnection(url); if (conn != null) System.out.println("데이터베이스 연결을 성공했습니다."); else System.out.println("데이터베이스 연결이 실패했습니다."); // Connection 반납하여 데이터베이스와 연결 해제 if (conn != null) { conn.close(); conn = null; } } catch (ClassNotFoundException e) { // Class.forName() e.printStackTrace(); } catch (SQLException e) { // DriverManager.getConnection() e.printStackTrace(); } } }
연결 생성
DriverManager 클래스를 이용
(사용예)
String url = "jdbc:mysql://127.0.0.1/example?user=root&password=1234"; Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(url);
DriverManager 클래스는 사용 가능한 JDBC 드라이버들 중 선택하여 DBMS와 Driver interface를 연결하여 사용할 수 있도록 합니다. 프로그래머는 Driver interace에서 정의된 메서드를 사용하여 DBMS를 대상으로 프로그래밍을 할 수 있게 됩니다. DBMS 연결에 필요한 로그인 정보는 URL 형식으로 직접 코딩됩니다.
DataSource 객체를 이용
(사용예)
InitialContext ic = new InitialContext(); DataSource ds = ic.lookup("java:comp/env/jdbc/myDB"); Connection con = ds.getConnection(); DataSource ds = (DataSource) org.apache.derby.jdbc.ClientDataSource() ds.setPort(1527); ds.setHost("localhost"); ds.setUser("APP") ds.setPassword("APP");
DataSource 객체는 속성(property)들 사용하기 위해 getter와 setter가 구현되어 제공되어야 합니다. 보통 이 속성들은 DataSource 객체가 사용될 때 초기화됩니다.
4. 간단한 질의어 결과 얻기
(사용예)
package net.jeongsam.excise; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * JDBC 예제2 * 간단한 질의 처리 * @author 정승용 * */ public class JdbcEx02 { public static void main(String[] args) { Connection conn = null; Statement stmt = null; ResultSet rs = null; // DB 접속 문자열 URL 형식 String url = "jdbc:mysql://127.0.0.1/example?user=root&password=1234"; // DB에 전송할 SQL Query 준비 String query = "SELECT DISTINCT sido FROM ziptable"; try { // 1. JDBC 드라이버 로드 Class.forName("com.mysql.jdbc.Driver"); // 2. DriverManager.getConnection()를 이용하여 Connection 인스턴스 생성 conn = DriverManager.getConnection(url); // 3. Connection 인스턴스를 이용하여 Statement 인스턴스 생성 stmt = conn.createStatement(); // 4. Query 실행후 결과를 ResultSet으로 참조 rs = stmt.executeQuery(query); // 5. ResultSet이 참조하는 인스턴스로부터 next() 메서드를 이용하여 데이터 추출 while (rs.next()) { // 5-1. next() 메서드를 이용하여 추출한 데이터를 getter()를 이용하여 다운캐스팅 System.out.println(rs.getString(1)); } } catch (ClassNotFoundException e) { // Class.forName() : 지정한 클래스가 없을 경우 e.printStackTrace(); } catch (SQLException e) { // DriverManager.getConnection() : DB 접속 오류일 경우 e.printStackTrace(); } finally { // 6. 사용이 끝난 ResultSet 인스턴스 반납 if (rs != null) try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } rs = null; // 7. 사용이 끝난 Statement 인스턴스 반납 if (stmt != null) try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } stmt = null; // 8. 사용이 끝난 Connection 객체 반납 if (conn != null) try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } conn = null; } } }