리우's IT Story
article thumbnail
728x90
반응형

 

 

Connection Pool

보통 useBean은 기본생성자를 통해 객체를 호출한다.
ex ) new TestDAO();

만약 목록 추가 수정 삭제의 함수를 생성한다고하면  

각자의 객체가 하나의 DB에 접근할 것이다. 똑같은 DB에 접근할 객체가 여러개일 필요가 있을까?

dao를 어느페이지에서 호출하더라도 항상 같은 객체에서 호출하게 해주면
시간적인 처리비용, 메모리절감에 효율적일것이다. 

그래서 connection을 미리 여러개 만들어놓고 돌려가면서 쓴다 이것을  connectionPool

 

pool = 수영장
즉, 웅덩이에 여러개의 커넥션이 담겨있고  프로젝트가 시작할때 미리 여러개의 커넥션을 만들어놓고
그 커넥션들을 관리하는 데이터소스 객체를 꺼내서 사용하는 것이다. 

 

Singleton : 싱글톤 
해당 클래스의 객체는 항상 하나만 존재하는 형태의 디자인 패턴

 

  ex) 천장에 램프가 여러개 있어도  스위치가 하나만 있으면된다. 

 1) 생성자 호출을 허용하면 생성자를 호출할 때 마다 새로운 객체를 생성한다.
 => 외부에서 생성자를 호출할 수 없도록 private 접근 제한자를 적용한다.
2) 생성자를 막았기 때문에 객체를 통해서 메서드를 호출할 수 없다.
=> 객체없이 클래스로 접근 가능한 static 메서드를 작성한다.
3) static 메서드에서 객체를 반환하려면 static 필드를 참조해야 한다.
=> 자신과 동일한 클래스의 객체 하나를 저장할 수 있는 static 필드를 작성한다.

 

즉, 동일한 기능을 수행하는 객체는 하나만 있으면 된다. 

 

public class SingletonTest {
	//Singleton : 해당  클래스의 객체는 항상 하나만 존재하는 형태의 디자인  패턴 
	
	// 1) 생성자 호출을 허용하면 생성자를 호출할 때 마다 새로운  객체를 생성한다. 
	// => 외부에서 생성자를 호출할 수 없도록 private 접근 제한자를 적용한다. 
	private SingletonTest() {
		
	}
	
	//2) 생성자를 막았기 때문에 객체를 통해서 메서드를 호출할 수 없다. 
	// => 객체없이 클래스로 접근 가능한 static 메서드를 작성한다. 
	public static SingletonTest getInstance() {
		if(instance== null) {
			instance = new SingletonTest();	// 내부에서는 private 참조 가능
		}
		return instance;
	}
	
	
	//3) static 메서드에서 객체를 반환하려면 static 필드를 참조해야 한다. 
	// =>  자신과 동일한 클래스의 객체 하나를 저장할 수 있는 static 필드를 작성한다. 
	// jsp UseBean을 통해서 객체를 생성 할 수 없다. 기본생성자를 막았기 때문에.
	private static SingletonTest instance;
}

 

ex01.jsp

<body>

	<h1>ex01.jsp - singleton</h1>
	<hr>

	<%
		Object ob1 = new Object();
		//- The constructor SingletonTest() is not visible
		// 기본 생성자의 접근제한자가 private 이므로 외부에서 생성자를 호출할 수 없다.
// 		SingletonTest ob2 = new SingletonTest();
		
		SingletonTest ob2 =  SingletonTest.getInstance();
		Object ob3 = new Object();
		
		SingletonTest ob4 = SingletonTest.getInstance();
	%>
	
	<h3>ob1 : <%= ob1 %></h3>
	<h3>ob2 : <%= ob2 %></h3>
	<h3>ob3 : <%= ob3 %></h3>
	<h3>ob4 : <%= ob4 %></h3>
	
	<h3><%=ob1 == ob3 %></h3>
	<h3><%=ob2 == ob4 %></h3>
	
	<c:set var="ob5" value="${SingletonTest.getInstance()}" />
	<h3>ob5 : ${ob5 }</h3>
</body>

 

-Connection POOL-

 

 

META-INF에서 오른쪽 마우스 클릭 

 

ctrl + space + enter

 

아래처럼 Context태그를 작성.

여기서 객체를 준비한것이다. (프로젝트를 시작하는 단계에서 객체)

이 자원을 참조하는 이름으로 jdbc/oracle이라는 이름을 달아준다. 

이것을 container에 담아놨다가 뽑아쓴다. 

 

 

 

 

윈도우 탐색기 열어서  주소창에 %CATALINA_HOME%  (톰캣 환경변수) 입력 

 

lib - tomcat-dbcp.jar  을 라이브러리 폴더에 복사 

 

 

그럼 WEB -INF에 4개의 아카이브 파일이 있을 것이다. 

 

 

 

프로젝트에서 우클릭 -> javaEE tools -> Generate... 클릭 하면

 

 

WEB-INF에 web.xml이 만들어질 것이다. 

 

web.xml더블클릭 

 

welcome-file-list의  닫는태그 밑에 

 

wep_app 태그안에  아래 내용 작성 

 

Context.xml에 있는 jdbc/oracle이라는 이름으로 참조한다. 

 

 

TestDAO로 가서 각각의 자원 뽑아쓰기 

package day09;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

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

public class TestDAO {
	/*** 싱글톤  ***/
	private static TestDAO instance;
	
	public static TestDAO getInstance() {
		if(instance == null) {
			instance = new TestDAO();
		}
		return instance;
	}
	
	private TestDAO() {
		/** 커넥션 풀 설정, context.xml, web.xml 사전설정 필요함 **/
		// META-INF/context.xml
		// WEB-INF/web.xml
		try {
			// 프로젝트가 초기화 될때 객체를 만들어서. 
			init = new InitialContext();
			ds = (DataSource) init.lookup("java:comp/env/jdbc/oracle");
			//자바 컴포넌트 중, 환경 요소 중에서 이름이 jdbc/oracle인 요소를 불러온다. 
		} catch (NamingException e) {
			System.err.println("dataSource 불러오기 실패 : " +e);
		}
	}
	
	private Context init;
	private DataSource ds;
	
	private Connection conn;
	private PreparedStatement pstmt;
	private ResultSet rs;

 

TestDAO에서 현재날짜와 시간을 불러오는 함수를 작성해보자. 

public String getSysDate() {
		String sysdate = null;
		String sql = "select sysdate from dual";
		
		try {
//			conn = DriverManager.getConnection(url, user, password);
			conn = ds.getConnection();	// {conn1, conn2, conn3, conn4 ...}
			pstmt = conn.prepareStatement(sql);
			rs = pstmt.executeQuery();
			
			while(rs.next()) {
				sysdate = rs.getString("sysdate");
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				if(rs != null) rs.close();
				if(pstmt != null) pstmt.close();
				if(conn != null) conn.close();
			} catch(Exception e) {}
		}
		
		return sysdate;
	}

 

 

ex02.jsp

<body>

	<h1>ex02.jsp</h1>
	<hr>
	
	<c:set var="dao" value="${TestDAO.getInstance() }"></c:set>
	<c:set var="sysdate" value="${dao.getSysDate() }"></c:set>
	<h3>sysdate : ${sysdate }</h3>
</body>

 

 

 

DBCP, 싱글톤 정리 

===>  싱글톤 <===
public Class TestDAO{
  //1) 생성자에 외부 접근 불가
 private TestDAO() {
 // 이후 커넥션 풀을 위한 init 및 ds 내용을 작성해야 한다. 
}
 //2) 생성자 대신 객체를 반환할 수 있는 static 메서드
public static TestDAO getInstance(){
 if(instance == null) {
  instance = new TestDAO();
}
return instance; 
}
//3)  단하나의 객체를 저장할 static 필드 instance
private static TestDAO instance;
}

===>프로젝트가 시작될때의 객체 <===
context.xml 
===>  프로젝트가 시작 될때 위에서 준비한 객체를 컨테이너에 준비하여 참조할 수 있게 설정 <===
web.xml 

===> DAO에서 객체 컨테이너를 참조할 init와 , 커넥션을 관리하는 ds를 작성  <===
private Context init;private DataSource ds;

private TestDAO() {/** 커넥션 풀 설정, context.xml, web.xml 사전설정 필요함 **/// META-INF/context.xml// WEB-INF/web.xmltry {// 프로젝트가 초기화 될때 객체를 만들어서. init = new InitialContext(); (context.xml)ds = (DataSource) init.lookup("java:comp/env/jdbc/oracle");//자바 컴포넌트 중, 환경 요소 중에서 이름이 jdbc/oracle인 요소를 불러온다. } catch (NamingException e) {System.err.println("dataSource 불러오기 실패 : " +e);}}

 

728x90
반응형

'JSP' 카테고리의 다른 글

Servlet  (0) 2023.09.01
session  (0) 2023.08.18
JSTL  (0) 2023.08.07
EL 태그  (1) 2023.08.04
영화정보를 El태그, action태그를 사용해서 추가하기  (0) 2023.08.04
profile

리우's IT Story

@LRWoo

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!