-
[Camel][JSP] JDBC 프로그래밍 1부 in JSPJSP 2020. 3. 14. 22:34
JDBC 프로그래밍이 대해 설명하기에 앞서 저는 MySQL을 사용하며, 데이터 베이스와 통신을 하기위해서는 JDBC 브라이버와의 연동이 필요합니다. JDBC 드라이버가 준비되어 있지 않으신 분들은 이전 포스팅을 참고해주시면 감사하겠습니다.
2020/03/14 - [JSP] - [Camel][JSP] MySQL JDBC 연동 in JSP, Java
1. JDBC 프로그래밍
우선 예제 코드를 먼저 작성해 보겠습니다.
<%@ page contentType = "text/html; charset=utf-8" %> <%@ 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>Member List</title></head> <body> MEMBMER Table Contents <table width="100%" border="1"> <tr> <td>Name</td><td>ID</td><td>E-Mail</td> </tr> <% // MySQL JDBC Driver Loading Class.forName("com.mysql.jdbc.Driver"); Connection conn = null; Statement stmt = null; ResultSet rs = null; try { String jdbcDriver = "jdbc:mysql://localhost:3306/ch2?" + "useUnicode=true&characterEncoding=utf8"; String dbUser = "camel"; String dbPass = "1234"; String query = "select * from MEMBER order by MEMBERID"; // Create DB Connection conn = DriverManager.getConnection(jdbcDriver, dbUser, dbPass); // Create Statement stmt = conn.createStatement(); // Run Qeury rs = stmt.executeQuery(query); // Print Result (Run by Query) while(rs.next()) { %> <tr> <td><%= rs.getString("NAME") %></td> <td><%= rs.getString("MEMBERID") %></td> <td><%= rs.getString("EMAIL") %></td> </tr> <% } } catch(SQLException ex) { out.println(ex.getMessage()); ex.printStackTrace(); } finally { // Close Statement if (rs != null) try { rs.close(); } catch(SQLException ex) {} if (stmt != null) try { stmt.close(); } catch(SQLException ex) {} // Close Connection if (conn != null) try { conn.close(); } catch(SQLException ex) {} } %> </table> </body> </html>
1-1. JDBC 드라이버 Loading
JDBC 프로그래밍을 하기 위해서는 JDBC 드라이버를 로딩해줘야 합니다. 로딩하는 방법은 아래의 코드를 사용하는 방법이 있습니다.
Class.forName("com.mysql.jdbc.Driver");
이번 포스팅의 경우에는 데이터 베이스로 MySQL을 사용하기 때문에 위와 같이 작성했지만, 다른 데이터 베이스를 사용하는 경우는 각각의 데이터 베이스에 맞는 클래스를 입력해 줘야합니다. MySQL을 제외한 대표적인 데이터베이스인 Oracle과 MS SQL 서버의 JDBC에 해당하는 클래스는 아래와 같습니다.
- Oracle - oracle.jdbc.driver.OracleDriver
- MS SQL - com.microsoft.sqlserver.jdbc.SQLServerDriver
- MySQL - com.mysql.jdbc.Driver
Class.forName 메소드는 지정한 클래스 정보를 가지고 있는 Class 인스턴스를 구하는 기능만을 제공하며, JDBC 드라이버에 해당하는 클래스는 Class.forName 메소드를 통해서 로딩될 때 자동으로 JDBC 드라이버를 틍록해줍니다.
1-2. JDBC URL의 표현방식
데이터베이스 연결에 대해 설명하기에 앞서 데이터베이스를 구분하기위해 사용되는 JDBC URL에 대해 설명하겠습니다. 사용하는 데이터베이스의 JDBC 드라이버에 따라서 JDBC URL의 표현방식이 존재하고, 이 표현방식에는 차이가 있습니다.
MySQL JDBC 드라이버는 아래와 같이 JDBC URL을 표현합니다.
"jdbc:mysql://[호스트]:[포트]/[DB이름]?" +"useUnicode=true&characterEncoding=utf8"
좀 더 직관적으로 설명하기 위해 위의 예제에서 사용한 코드를 통해 설명하겠습니다.
String jdbcDriver = "jdbc:mysql://localhost:3306/ch2?"+"useUnicode=true&characterEncoding=utf8"
호스트에 localhost를 입력함으로써 로컬 서버에서 실행된 다는 것을 확인할 수 있고, 포트을 입력하는 곳에는 MySQL 서버가 사용하는 포트 번호인 3306을 입력해주었습니다. 그리고 ch2는 데이터베이스의 이름을 의미합니다.
또한, 드라이버가 MySQL 서버와 데이터를 주고 받을 때 사용되는 Character Set을 알맞게 지정하지 않을 경우 잘못된 값이 데이터베이스에 저장될 수 있습니다. 그렇기 때문에 추가 파라미터로 Character Set을 알맞게 지정해줄 필요가 있습니다.
만약 JDBC MySQL 5.1.23 이상 버전을 사용하시는 경우 serverTimeZone 관련 에러가 발생할 수 있습니다. 그럴 경우 getConnection 메소드의 첫 파라미터로 지정되는 JDBC URL을 아래와 같이 변경하면 제대로 실행됩니다.
String jdbcDriver = "jdbc:mysql://localhost:3306/ch2?" + "useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&characterEncoding=utf8";
String jdbcDriver = "jdbc:mysql://localhost:3306/ch2?" +
"useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&characterEncoding=utf8";이 문제가 발생하는 이유는 MySQL 5.1.23 이상의 버전을 사용할 경우 MySQL TimeZone의 시간표현 포맷이 달라졌기 때문에 connector 에서 인식을 못하기 때문이라고 합니다.
1-3. DataBase Connection( 데이터베이스 연결 )
데이터베이스 프로그래밍을 하기 위해서는 데이터베이스와의 Connection이 바탕이 되어야합니다. Connection을 위해 java.sql.DriverManager 클래스가 제공하는 getConnection 메소드를 사용합니다.
DriverManager 클래스에는 getConnection 메소드가 아래와 같이 두 종류로 오버로딩 되어있습니다. getConnection 메소드의 반환형은 Connection 객체입니다.
- DriverManager.getConnection( String jdbcURL )
- DriverManager.getConnection( String jdbcURL, String user, String password ) - 계정 이름과 암호 사용
만약 Connection 객체를 생성하지 못할 경우 SQLException이 발생하기 때문에 getConnection 메소드를 사용할 때에는 위의 예제와 같이 try~catch구문을 사용해서 예외처리를 해주는 것이 일반적입니다. finally영역은 예외 여부와 상관없이 무조건 실행되는 영역입니다. 위 예제에서의 finally 영역에서는 Connection 객체의 close 메소드를 호출하면서 자원을 반환하고 있습니다.
(try~catch구문에 대한 설명이 필요하신분은 이전 포스팅인 여기를 눌러주세요.)
1-4. Statement를 통한 Query(쿼리) 실행
Connection 객체를 생성했다면, 우리는 이제 Statement를 생성해서 쿼리를 실행할 수 있습니다. Statement의 생성방법은 아래와 같습니다.
Statement stmt = conn.createStatement();
Statement 객체의 쿼리 실행을 위한 메소드는 아래와 같습니다.
- ResultSet executeQuery(String query) - SELECT 쿼리 실행
- int executeUpdate(String Query) - INSERT, DELETE, UPDATE 쿼리 실행. 반환값은 변경된 레코드의 수를 반환
이어지는 내용은 2부에서 이어서 설명하겠습니다.
2020/03/15 - [JSP] - [Camel][JSP] JDBC 프로그래밍 2부 in JSP
'JSP' 카테고리의 다른 글
[Camel][JSP] Connection Pool (커넥션 풀) with DBCP (0) 2020.03.16 [Camel][JSP] JDBC 프로그래밍 2부 in JSP (0) 2020.03.15 [Camel][JSP] MySQL JDBC 연동 in JSP, Java (0) 2020.03.14 [Camel][JSP] JavaBean(자바빈) & <jsp:useBean> 액션태그 (0) 2020.03.13 [Camel][JSP] Session (세션) (0) 2020.03.13