[Servlet 4-3] JDBC·DBCP 기능을 사용하여 클라이언트에게 전달하는 서블릿(비권장)

임승현·2022년 12월 1일
0

Servlet

목록 보기
11/14

◈ 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;

🐧PHONEBOOK 테이블에 저장된 모든 회원정보를 검색하여 클라이언트에게 전달하는 서블릿 - JDBC

→ JDBC 프로그램을 작성하기 위해 JDBC 관련 라이브러리 파일을 다운로드 받아 프로젝트에 빌드 처리(ojdbc11.jar)

  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) {
	}
}

📃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) {
			}
		}
	}
}

🐧Apache Tomcat 라이브러리에서 제공하는 DBCP 기능을 사용하여 Connection 객체를 미리 생성하고 생성된 Connection 객체를 제공받아 접속정보를 클라이언트에게 전달하는 서블릿

◈ 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>");
	}
}

0개의 댓글