JDBC
자바에서 데이터베이스를 사용할 때는 JDBC API 를 이용하며, JDBC(Java DataBase Connectivity) 는 자바에서 데이터베이스와 관련된 작업을 처리할 수 있도록 도와주는 API입니다.
JDBC의 구조
JDBC API를 사용하는 어플리케이션의 구조는 다음과 같습니다.
자바 기반의 어플리케이션을 사용할 때는 데이터베이스의 종류에 상관없이 JDBC API 를 이용하여 접근이 이루어집니다.
각각의 DBMS는 알맞은 JDBC 드라이버를 제공하고, JDBC API는 JDBC 드라이버를 거쳐서 데이터베이스와 통신합니다.
JDBC 드라이버
사용을 위해서 DBMS에 알맞은 JDBC 드라이버를 준비해야 하는데, JDBC는 DBMS와의 통신을 담당하는 자바 클래스로서 일반적으로 .jar 파일로 제공됩니다.
(MySQL DBMS를 대상으로 실습을 하기 위해서 아래의 경로에서 JDBC 드라이버를 받아주세요)
다운로드 받은 파일을 설치해주면 MySQL 디렉터리에 MySQL Connector J 디렉터리가 생성되고 이 안에 JDBC 드라이버가 생성됩니다.
mysql-connector-java-5.1.26-bin.jar 파일을 실습할 프로젝트의 /WEB-INF 안의 lib 디렉터리에 위치시켜 줍니다.
그 다음 Build Path를 지정해줍니다.
여기까지하면 JDBC 드라이버를 사용할 준비가 완료됐습니다.
JDBC 프로그래밍 코딩 스타일
JDBC 드라이버를 설치했으니 JDBC 프로그래밍을 직접 실습하며 알아보겠습니다.
JDBC 프로그램의 실행 순서는 다음과 같습니다.
① JDBC 드라이버 로딩
② 데이터베이스 Connection 구하기
③ 쿼리 실행을 위한 Statement 객체 생성
④ 쿼리 실행
⑤ 쿼리 실행 결과 사용
⑥ Statement 종료
⑦ 데이터베이스 Connection 종료
우선 예제를 작성한 뒤 각 부분에 대해 알아보겠습니다.
(실습하기전 데이터베이스와 간단한 테이블생성을 꼭해주세요)
<viewMemberList.jsp>
- <%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>
- <%@ page import="java.sql.DriverManager" %>
- <%@ page import="java.sql.Connection" %>
- <%@ page import="java.sql.Statement" %>
- <%@ page import="java.sql.ResultSet" %>
- <%@ page import="java.sql.SQLException" %>
- <html>
- <head>
- <title>MemberList</title>
- </head>
- <body>
- <table border="1" cellpadding="0" cellspacing="0">
- <tr>
- <td>MEMBERID</td>
- <td>PASSWORD</td>
- <td>NAME</td>
- <td>EMAIL</td>
- </tr>
- <%
- Class.forName("com.mysql.jdbc.Driver");
- Connection conn = null;
- Statement stmt = null;
- ResultSet rs = null;
- try {
- String jdbcDriver = "jdbc:mysql://localhost:3306/test?Unicode=true&characterEncoding=euckr";
- String dbUser = "root";
- String dbPass = "1234";
- String query = "select * from member";
- conn = DriverManager.getConnection(jdbcDriver, dbUser, dbPass);
- stmt = conn.createStatement();
- rs = stmt.executeQuery(query);
- while(rs.next()) {
- %>
- <tr>
- <td><%=rs.getString("memberid") %></td>
- <td><%=rs.getString("password") %></td>
- <td><%=rs.getString("name") %></td>
- <td><%=rs.getString("email") %></td>
- </tr>
- <%
- }
- } catch(SQLException ex) {
- out.println(ex.getMessage());
- ex.printStackTrace();
- } finally {
- if(rs != null) { try { rs.close(); } catch(SQLException ex) {} }
- if(stmt != null) { try { stmt.close(); } catch(SQLException ex) {} }
- if(conn != null) { try { conn.close(); } catch(SQLException ex) {} }
- }
- %>
- </table>
- </body>
- </html>
위와 같이 작성하고 실행을 하면 다음과 같이 출력됩니다.
데이터베이스의 테이블 내용이 웹에 출력되는 것을 확인할 수 있습니다.
DBMS와의 통신을 위한 JDBC 드라이버
JDBC 드라이버를 로딩해야 데이터베이스와 연결해서 원하는 작업을 수행할 수 있습니다. 방법은 다음과 같습니다.
try {
Class.forName("JDBC드라이버 클래스의 완전한 이름");
} catch(ClassNotFoundException ex) {
// 지정한 클래스가 존재하지 않을 경우 에러발생 및 처리.
}
아래는 주요 데이터베이스에 대한 각각의 JDBC 드라이버에 해당하는 클래스입니다.
▶ MySQL : com.mysql.jdbc.Driver
▶ 오라클 : oracle.jdbc.driver.OracleDriver
▶ SQL-SERVER(MS SQL) : com.microsoft.sqlserver.jdbc.SQLServerDriver
<viewMemberList.jsp> 파일의 Line 22. 가 이에 해당합니다.
* Class.forName() 메서드는 지정한 클래스 정보를 담고 있는 Class 인스턴스를 구해주는 기능만을 제공합니다.
JDBC 드라이버에 해당하는 클래스들을 Class.forName() 메서드를 통해 로딩할 때, 자동으로 JDBC 드라이버로 등록해주기 때문에 사용합니다.
데이터베이스 식별을 위한 JDBC URL
데이터베이스를 구분할 때도 URL과 비슷한 형식을 취하는 JDBC URL을 사용합니다. 일반적인 형식은 다음과 같습니다.
▶ jdbc:[DBMS이름]:[데이터베이스식별자]
MySQL 의 경우 다음과 같은 JDBC URL을 사용합니다.
▶ jdbc:mysql://[HOST][:PORT]/[DBNAME][?param1=value1¶m2=value2& ... ¶mn=valuen]
<viewMemberList.jsp> 파일의 Line 29. 가 이에 해당합니다.
※ 한글 데이터를 올바르게 사용하기 위해서는 추가 파라미터를 이용하여 캐릭터 셋을 알맞게 지정해 줘야 합니다.
데이터베이스 Connection
JDBC 드라이버가 로딩됬다면 데이터베이스와 연결된 커넥션을 구해야 합니다. 선언부의 java.sql.Connection 클래스가 데이터베이스 커넥션을 나타내며 java.sql.DriverManager 클래스가 제공하는 getConnection() 메서드를 사용하여 구할 수 있습니다.
▶ DriverManager.getConnection(String jdbcURL, String user, String password);
<viewMemberList.jsp> 파일의 Line 34. 가 여기에 해당합니다.
getConnection() 메서드의 파라미터 값을 올바르게 지정했다면, Connection 객체를 리턴해주고 이 객체를 사용하여 필요한 작업을 시작하게됩니다.
(객체를 생성하지 못할 경우 발생하는 예외에 대한 예외처리도 함께 해줘야 합니다)
Connection 객체를 사용한 다음엔 close() 메서드를 호출하여 자원을 반환해줘야 합니다.
<viewMemberList.jsp> 파일의 Line 54. 가 여기에 해당합니다.
null 이 아닐 경우 객체가 할당된 것이기 때문에, null 의 여부를 판단하고 close() 메서드를 호출해줍니다.