◈ SQL Developer 실행 → scott에 코드 작성 → F5 눌러서 한번에 실행
create table phonebook(phone varchar2(20) primary key, name varchar2(20), address varchar2(50)); INSERT INTO phonebook values('010-1111-1111','홍길동','서울시 송파구'); INSERT INTO phonebook values('010-2222-2222','임꺽정','서울시 강남구'); INSERT INTO phonebook values('010-3333-3333','전우치','부천시 원미구'); INSERT INTO phonebook values('010-4444-4444','일지매','수원시 팔달구'); INSERT INTO phonebook values('010-5555-5555','장길산','인천시 월미구'); commit; -- select * from phonebook; -- desc phonebook;
→ JDBC 프로그램을 작성하기 위해 JDBC 관련 라이브러리 파일을 다운로드 받아 프로젝트에 빌드 처리(ojdbc11.jar)
- JDBC 관련 객체를 저장하기 위한 참조변수 선언(3개의 변수 반드시 필요)
Connection con=null; PreparedStatement pstmt=null; ResultSet rs=null;
try {
① OracleDriver 클래스를 읽어 메모리에 저장
→ OracleDriver 객체를 생성하여 DriverManager 클래스의 JDBC 드라이버로 등록Class.forName("oracle.jdbc.driver.OracleDriver");
② DriverManager 클래스의 JDBC 드라이버를 DBMS 서버에 접속하여 Connection 객체를 반환받아 저장
String url="jdbc:oracle:thin:@localhost:1521:xe"; String user="scott"; String password="tiger"; con=DriverManager.getConnection(url, user, password);
※ SQLException catch로 잡아주기
③ 접속된 DBMS 서버에 전달되어 실행될 SQL 명령이 저장된 PreparedStatement 객체를 Connection 객체로부터 반환받아 저장String sql="select * from phonebook order by phone"; pstmt=con.prepareStatement(sql);
④ PreparedStatement 객체에 저장된 SQL 명령을 전달하여 실행하고 결과를 반환받아 저장
rs=pstmt.executeQuery();
⑤ 반환받은 SQL 명령을 실행 결과를 이용하여 처리 작업
→ SQL 명령의 실행 결과를 HTML 문서로 생성하여 클라이언트에게 전달out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<head>"); out.println("<meta charset='UTF-8'>"); out.println("<title>Servlet</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>전화번호부</h1>"); out.println("<hr>"); out.println("<table border='1' cellspacing='0'>"); out.println("<tr>"); out.println("<th width='200'>전화번호</th>"); out.println("<th width='200'>이름</th>"); out.println("<th width='300'>주소</th>"); out.println("</tr>");
📢 ResultSet 객체에 저장된 모든 행의 컬럼값을 클라이언트에게 전달 - 반복 처리
while(rs.next()) {//ResultSet 커서를 다음행으로 이동하여 처리행이 존재할 경우 반복
out.println("<tr align='center'>");
📢 ResultSet 커서가 위치한 처리행의 컬럼값을 반환받아 클라이언트에게 전달
out.println("<td>"+rs.getString("phone")+"</td>"); out.println("<td>"+rs.getString("name")+"</td>"); out.println("<td>"+rs.getString("address")+"</td>"); out.println("</tr>"); }
out.println("</table>"); out.println("</body>"); out.println("</html>"); } catch (ClassNotFoundException e) { System.out.println("[에러]OracleDriver 클래스를 찾을 수 없습니다."); } catch (SQLException e) { System.out.println("[에러]JDBC 오류 = "+e.getMessage()); } finally {
⑥ JDBC 관련 객체 제거
try { if(rs!=null) rs.close(); if(pstmt!=null) rs.close(); if(con!=null) rs.close(); } catch (SQLException e) { } }
📃PhonebookOldServlet.java
package xyz.itwill.servlet; // import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; // import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; // //PHONEBOOK 테이블에 저장된 모든 회원정보를 검색하여 클라이언트에게 전달하는 서블릿 - JDBC(비권장) //→ JDBC 프로그램을 작성하기 위해 JDBC 관련 라이브러리 파일을 다운로드 받아 프로젝트에 빌드 처리(ojdbc11.jar) @WebServlet("/old.itwill") public class PhonebookOldServlet extends HttpServlet { private static final long serialVersionUID = 1L; // protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out=response.getWriter(); // //1. JDBC 관련 객체를 저장하기 위한 참조변수 선언(3개의 변수 반드시 필요) Connection con=null; PreparedStatement pstmt=null; ResultSet rs=null; try { //① OracleDriver 클래스를 읽어 메모리에 저장 //→ OracleDriver 객체를 생성하여 DriverManager 클래스의 JDBC 드라이버로 등록 Class.forName("oracle.jdbc.driver.OracleDriver"); // //② DriverManager 클래스의 JDBC 드라이버를 DBMS 서버에 접속하여 Connection 객체를 반환받아 저장 String url="jdbc:oracle:thin:@localhost:1521:xe"; String user="scott"; String password="tiger"; con=DriverManager.getConnection(url, user, password);//SQLException catch로 잡아주기 // //③ 접속된 DBMS 서버에 전달되어 실행될 SQL 명령이 저장된 PreparedStatement 객체를 Connection 객체로부터 반환받아 저장 String sql="select * from phonebook order by phone"; pstmt=con.prepareStatement(sql); // //④ PreparedStatement 객체에 저장된 SQL 명령을 전달하여 실행하고 결과를 반환받아 저장 rs=pstmt.executeQuery(); // //⑤ 반환받은 SQL 명령을 실행 결과를 이용하여 처리 작업 //→ SQL 명령의 실행 결과를 HTML 문서로 생성하여 클라이언트에게 전달 out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<head>"); out.println("<meta charset='UTF-8'>"); out.println("<title>Servlet</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>전화번호부</h1>"); out.println("<hr>"); out.println("<table border='1' cellspacing='0'>"); out.println("<tr>"); out.println("<th width='200'>전화번호</th>"); out.println("<th width='200'>이름</th>"); out.println("<th width='300'>주소</th>"); out.println("</tr>"); //ResultSet 객체에 저장된 모든 행의 컬럼값을 클라이언트에게 전달 - 반복 처리 while(rs.next()) {//ResultSet 커서를 다음행으로 이동하여 처리행이 존재할 경우 반복 out.println("<tr align='center'>"); //ResultSet 커서가 위치한 처리행의 컬럼값을 반환받아 클라이언트에게 전달 out.println("<td>"+rs.getString("phone")+"</td>"); out.println("<td>"+rs.getString("name")+"</td>"); out.println("<td>"+rs.getString("address")+"</td>"); out.println("</tr>"); } out.println("</table>"); out.println("</body>"); out.println("</html>"); } catch (ClassNotFoundException e) { System.out.println("[에러]OracleDriver 클래스를 찾을 수 없습니다."); } catch (SQLException e) { System.out.println("[에러]JDBC 오류 = "+e.getMessage()); } finally { //⑥ JDBC 관련 객체 제거 try { if(rs!=null) rs.close(); if(pstmt!=null) rs.close(); if(con!=null) rs.close(); } catch (SQLException e) { } } } }
◈ DBCP(DataBase Connection Pool) : DBMS 서버에 미리 접속하여 다수의 Connection 객체를 저장하여 제공하기 위한 기능의 클래스(객체)
→ JDBC 프로그램의 실행속도의 가독성이 높아지고 유지보수의 효율성 증가
→ DBCP 기능을 제공하는 클래스는 일반적으로 DataSource 인터페이스를 상속받아 작성
📢 BasicDataSource 객체(DataSource 객체 - DBCP) 생성
BasicDataSource dataSource=new BasicDataSource();
📢 BasicDataSource 객체에 저장될 다수의 Connection 객체 생성 관련 정보를 메소드를 호출하여 객체 필드값 변경
dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver"); dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe"); dataSource.setUsername("scott"); dataSource.setPassword("tiger"); dataSource.setInitialSize(10);//최초 생성될 Connection 객체의 갯수 변경 dataSource.setMaxIdle(10);//대기상태의 Connection 객체의 최대 갯수 변경 dataSource.setMaxTotal(10);//생성 가능한 최대 Connection 객체의 최대 갯수 변경
out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<head>"); out.println("<meta charset='UTF-8'>"); out.println("<title>Servlet</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>DBCP(DataBase Connection Pool)</h1>"); out.println("<hr>"); try {
📢 BasicDataSource 객체에 저장된 다수의 Connection 객체 중 하나를 반환받아 저장
Connection con=dataSource.getConnection(); out.println("<p>con = "+con+"</p>"); out.println("<h3>Connection 객체 제공 후<h3>"); out.println("<p>Active Connection Number = "+dataSource.getNumActive()+"</p>"); out.println("<p>Idle Connection Number = "+dataSource.getNumIdle()+"</p>"); con.close(); out.println("<hr>"); out.println("<h3>Connection 객체 제거 후<h3>"); out.println("<p>Active Connection Number = "+dataSource.getNumActive()+"</p>"); out.println("<p>Idle Connection Number = "+dataSource.getNumIdle()+"</p>"); // dataSource.close(); } catch (SQLException e) { e.printStackTrace(); } out.println("</body>"); out.println("</html>");
📃DataSourceServlet
package xyz.itwill.servlet; // import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.SQLException; // import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; // import org.apache.tomcat.dbcp.dbcp2.BasicDataSource; // //DBCP(DataBase Connection Pool) : DBMS 서버에 미리 접속하여 다수의 Connection 객체를 저장하여 제공하기 위한 기능의 클래스(객체) //→ JDBC 프로그램의 실행속도의 가독성이 높아지고 유지보수의 효율성 증가 //→ DBCP 기능을 제공하는 클래스는 일반적으로 DataSource 인터페이스를 상속받아 작성 // //Apache Tomcat 라이브러리에서 제공하는 DBCP 기능을 사용하여 Connection 객체를 미리 생성하고 생성된 Connection 객체를 제공받아 접속정보를 클라이언트에게 전달하는 서블릿 @WebServlet("/dbcp.itwill") public class DataSourceServlet extends HttpServlet { private static final long serialVersionUID = 1L; // protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out=response.getWriter(); // //BasicDataSource 객체(DataSource 객체 - DBCP) 생성 BasicDataSource dataSource=new BasicDataSource(); // //BasicDataSource 객체에 저장될 다수의 Connection 객체 생성 관련 정보를 메소드를 호출하여 객체 필드값 변경 dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver"); dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe"); dataSource.setUsername("scott"); dataSource.setPassword("tiger"); dataSource.setInitialSize(10);//최초 생성될 Connection 객체의 갯수 변경 dataSource.setMaxIdle(10);//대기상태의 Connection 객체의 최대 갯수 변경 dataSource.setMaxTotal(10);//생성 가능한 최대 Connection 객체의 최대 갯수 변경 // out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<head>"); out.println("<meta charset='UTF-8'>"); out.println("<title>Servlet</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>DBCP(DataBase Connection Pool)</h1>"); out.println("<hr>"); try { //BasicDataSource 객체에 저장된 다수의 Connection 객체 중 하나를 반환받아 저장 Connection con=dataSource.getConnection(); out.println("<p>con = "+con+"</p>"); out.println("<h3>Connection 객체 제공 후<h3>"); out.println("<p>Active Connection Number = "+dataSource.getNumActive()+"</p>"); out.println("<p>Idle Connection Number = "+dataSource.getNumIdle()+"</p>"); con.close(); out.println("<hr>"); out.println("<h3>Connection 객체 제거 후<h3>"); out.println("<p>Active Connection Number = "+dataSource.getNumActive()+"</p>"); out.println("<p>Idle Connection Number = "+dataSource.getNumIdle()+"</p>"); // dataSource.close(); } catch (SQLException e) { e.printStackTrace(); } out.println("</body>"); out.println("</html>"); } }