본문 바로가기
웹 프로그래밍(풀스택-->java)/웹프로그래밍(백엔드-->java)

26. Jsp와 데이터베이스 Connection Pool

by 백엔드개발자0107 2021. 12. 1.

자, 데이터베이스 연결할때 패턴이 3가지가 있다.

 

예전에 데이터베이스를 jsp에서 직접치는 방법과

 

DAO패턴을 사용하는 방법 

 

그리고 마지막으로 connection pool이라는 개념을 마지막으로 이용한다.

 

즉 결국에는 DAO패턴인데 , DAO패턴내에서 connection을 직접 사용하는 것이 아닌,

 

connection pool을 이용하는 것을 말한다.

 

도대체 그럼 connection pool이라는것은 무엇인가?

 

더보기

1. 커넥션풀(DBCP)사용 이유

 

-JDBC를 통하여 DB에 연결하기 위해서는 드라이버를 로드하고 커넥션객체를 받아와야 한다.

-JDBC를 사용하면 사용자가 요청을 할 떄마다 매번 드라이버를 로드하고 커넥션 객체를 생성하여 연결하고 종료하기 떄문에 매우

비효율적이다.

-이런 문제를 해결하기 위해서 커넥션풀(DBCP)를 사용한다.

 

2. 커넥션풀(DBCP)

-웹 컨테이너가 실행되면서 커넥션 객체를 미리 풀에 생성해 둔다.

-DB와 연결된 커넥션을 미리 생성해서 풀속에 저장해두고 있다가 필요할 때에 가져다 쓰고 반환한다.

- 미리 생성해두기 떄문에 데이터베에스에 부하를 줄이고 유동적으로 연결을 관리할수 있다.

자 ,우리가 에전에 수업했던 MemberDAO파트를 열어보자

 

이 부분을 매번 정의하고 사용하기에는 무리가 있다. 

그래서 connection pool이라는 것을 만들어 미리 정의하고 계속 끊어지지 않고 사용할수 있게끔 하는 개념이다.

 

 

여기서 웹 컨테이너란 여기서는 tomcat 서버를 말한다.

 

자 여기서 server.xml창을 열어서,

커넥션 풀을 DRP 에 적용시켜보자..!

server.xml에 소스코드로 들어가서

더보기

<Context docBase="DRP" path="/DRP" reloadable="true" source="org.eclipse.jst.jee.server:DRP">

</Context>

이렇게 <Context></Context>로 한쌍으로 만들어준다.

 

더보기

<Context docBase="DRP" path="/DRP" reloadable="true" source="org.eclipse.jst.jee.server:DRP">

<Resource name="jdbc/pool" auth="Container" type="javax.sql.DataSource"

driverClassName="com.mysql.jdbc.Driver" loginTimeOut="10" maxWait="5000" username="root" password="Dahyon0107!"

url="jdbc:mysql://127.0.0.1:3306/sys"/>

</Context>

자 , 이것들은 컨테이너가 관리한다.

자 기본의 getCon() 커넥션을 주석 처리해주고 

 

Connection Pool 처리 기법메소드들을 이용해 처리한 결과이미지이다..

 

기억하자..!

 

MemberDAO.class

 

package db;

import java.sql.Connection;

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Vector;

import javax.naming.InitialContext;
import javax.sql.DataSource;



//오라클 데이터베이스에 연결하고 select,insert,update,delete작업을 실행해주는 메소드이다. 
public class MemberDAO {

	String id = "root";
	String pass = "Dahyon0107!";
	String url = "jdbc:mysql://localhost:3306/sys";//접속 url 

	Connection con; //데이터베이스에 접근할수 있도록 설정 
	PreparedStatement pstmt;//데이터베이스에서 쿼리를 실행시켜주는 객체 
	ResultSet rs; // 데이터베이스의 테이블의 결과 리턴받아 자바에 저장해주는 객체 
	

	//커넥션풀을 이용하여 데이터베이스 접근(마찬가지로 데이터베이스는 exception이 일어나니, 예외처리해준다.) 
	public void getCon() {
		
		try {
			//외부에서 데이터를 읽어드려야 하기에 
			javax.naming.Context initctx = new InitialContext();
			//톰캣서버에 정보를 담아놓은 곳으로 이동 
			javax.naming.Context envctx = (javax.naming.Context)initctx.lookup("java:comp/env");
			//데이터 소스 객체 선언 
			DataSource ds = (DataSource) envctx.lookup("jdbc/pool");
			//데이터 소스를 기준으로 커넥션을 연결해 주시오.. 
			con = ds.getConnection();
			
			
		} catch (Exception e) {
			// TODO: handle exception
		}
		
	}

	//데이터베이스(mysql)에 접근할수 있도록 도와주는 메소드
//	public void getCon() {
//			
//		try {
//			
//			//1.해당 데이터베이스를 사용한다고 선언 (클래스를 등록= 오라클용을 사용 )
//			Class.forName("com.mysql.jdbc.Driver");
//			//2.해당 데이터베이스에 접속 
//			con = DriverManager.getConnection(url,id,pass);
//			
//			
//			
//			
//		} catch (Exception e) {
//			// TODO: handle exception
//			e.printStackTrace();
//		}
//		
		
	
	
	//데이터 베이스에 한사람의 회원 정보를 저장해주는 메소드 
	public void insertMember2(MemberBean mbean) {
		

try{
	
	getCon();
	
	//3. 접속후 쿼리준비하여 쿼리를 사용하도록 설정 
	String sql = "insert into member2 values(?,?,?,?,?,?,?,?)";
	//4. 쿼리를 사용하도록 설정 
	PreparedStatement pstmt  = con.prepareStatement(sql);//jsp에서 쿼리를 사용하도록 설정 
	//5. ?에 맞게 데이터를 맵핑 
	pstmt.setString(1,mbean.getId());
	pstmt.setString(2,mbean.getPass1());
	pstmt.setString(3,mbean.getEmail());
	pstmt.setString(4,mbean.getTel());
	pstmt.setString(5,mbean.getHobby());
	pstmt.setString(6,mbean.getJob());
	pstmt.setString(7,mbean.getAge());
	pstmt.setString(8,mbean.getInfo());
	
	pstmt.executeUpdate();//insert,update,delete시 사용하는 메소드 
	
	//5. 자원 반납 
	con.close();
	
}catch(Exception e){
	e.printStackTrace();
	
}
		
	}
	
	
	public Vector<MemberBean> allSelectMember2() {
		Vector<MemberBean> v = new Vector<MemberBean>();
		
		try {
			
			
			
			getCon();
			
			String sql = "select * from sys.member2";
			
			PreparedStatement pstmt = con.prepareStatement(sql);
			
		
			rs = pstmt.executeQuery();
			
			while(rs.next()) {
				
				MemberBean bean = new MemberBean();
				
				bean.setId(rs.getString(1));//안드로이드에서는 0 자바에서는 1부터 시작한다.
				bean.setPass1(rs.getString(2));
				bean.setEmail(rs.getString(3));
				bean.setTel(rs.getString(4));
				bean.setHobby(rs.getString(5));
				bean.setJob(rs.getString(6));
				bean.setAge(rs.getString(7));
				bean.setInfo(rs.getString(8));
				
				v.add(bean);
			}
			
			con.close();
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		
		return v;

	}

	public MemberBean oneSelectMember(String id) {
		
		MemberBean bean = new MemberBean();
		
		try {
			
			getCon();
			
			String sql  = "select * from sys.member2 where id =?";
			
			pstmt = con.prepareStatement(sql);
			
			pstmt.setString(1, id);
			
			rs = pstmt.executeQuery();
			
			if(rs.next()) {
				
				bean.setId(rs.getString(1));//안드로이드에서는 0 자바에서는 1부터 시작한다.
				bean.setPass1(rs.getString(2));
				bean.setEmail(rs.getString(3));
				bean.setTel(rs.getString(4));
				bean.setHobby(rs.getString(5));
				bean.setJob(rs.getString(6));
				bean.setAge(rs.getString(7));
				bean.setInfo(rs.getString(8));
			 
				
			}
			
			con.close();
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		
		return bean;
	}
	
	//한 사람에 대한 정보를 리턴하는 메소드작성 
	public String getPass(String id) {
		//스트링으로 리턴을 해야하기에 스트링변수 선언 
		String pass="";
		
		try {
			getCon();
			//쿼리준비 
			String sql = "select pass1 from sys.member2 where id = ?";
			
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, id);
			rs = pstmt.executeQuery();
			if(rs.next()) {
				
				pass = rs.getString(1);//패스워드 값이 저장된 컬럼 인덱스 
				
				
			}
			//자원반납 
			con.close();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		
		//결과를 리턴 
		return pass;
		
	}
	
	//한 회원의 정보를 수정하는 메소드 
	//select외에는 대부분 리턴타입이 없다. 
	
	public void updateMember(MemberBean bean) {
		
		getCon();
		
		try {
			
			//쿼리준비 
			String  sql = "update member2 set email =?, tel=? where id = ?";
			//쿼리 실행 객체 선언
			pstmt = con.prepareStatement(sql);
			//?에 값을 맵핑 
			pstmt.setString(1, bean.getEmail());
			pstmt.setString(2,bean.getTel());
			pstmt.setString(3, bean.getId());
			//쿼리 실행
			pstmt.executeUpdate();
			//자원 반납 
			con.close();
			
		} catch (Exception e) {
			e.printStackTrace();
			// TODO: handle exception
		}
		
	}
	
	//한 회원을 삭제하는 메소드 작성 
	
	public void deleteMember(String id) {
		
		getCon();
		try {
			
			//쿼리 준비 
			String sql = "delete from sys.member2 where id = ?";
			//쿼리 실행 
		
			pstmt = con.prepareStatement(sql);
			//?에 값을 맵핑 
			pstmt.setString(1, id);
			
			pstmt.executeUpdate();
			//자원 반납 
			con.close();
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		
	}
	
	
	
}