Connection Pool 기능 추가하기
앞에서 구현한 회원가입/로그인기능에 Connection Pool을 추가해 보도록 한다.
커넥션 풀을 사용할 경우 직접 만들거나 라이브러리를 사용한다.
앞의 실습에서 직접 코드를 작성해 봤으니 직접 구현하려면 참조하도록 하자.
일반적으로는 라이브러리를 사용할 경우가 많으므로 다음 참조하여 기존 코드를 수정하고 테스트해보도록 하자.
<자카르타 커넥션 풀 사용>
- 라이브러리를 포함하여 커넥션 풀을 사용할 경우 다음과 같은 작업을 진행할 것
1. WebContent/WEB-INF/lib 폴더에 ojdbc.jar, tomcat-dbcp.jar 라이브러리 추가
- tomcat-dbcp.jar 파일은 톰캣의 lib폴더에 가면 찾을 수 있다.
2. WebContent/WEB-INF/web.xml 파일에 다음 코드 추가
- tomcat실행 시 참조되는 설정파일이며 resource 참조를 할 수 있도록 설정 정보를 작성
1
2
3
4
5
6 |
<resource-ref>
<description>ConnectionPool</description>
<res-ref-name>jdbc/myOracle</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref> |
cs |
3. WebContent/META-INF/context.xml 파일 생성 후 다음 코드 추가
- web.xml 설정파일에 등록한 이름의 리소스 정보를 작성하는 작업이다.
이 정보를 이용하여 DB에 접속하고 ConnectionPool을 생성하여 관리
(javax.sql.DataSource의 기능)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 |
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name="jdbc/myOracle"
auth="Container"
driverClassName="oracle.jdbc.driver.OracleDriver"
type="javax.sql.DataSource"
url="jdbc:oracle:thin:@localhost:1521:xe"
username="데이터베이스접속계정"
password="데이터베이스접속계정비밀번호"
initialSize="50"
maxTotal="20"
maxIdle="10"
maxWaitMillis="10000" />
<!--
initialSize
: 최초 시점에 getConnection() 를 통해 커넥션 풀에 채워 넣을 커넥션 개수 (default = 0)
maxTotal (1.x에서는 maxActive):
: 동시에 사용할 수 있는 최대 커넥션 개수 (default = 8)
maxIdle
: Connection Pool에 반납할 때 최대로 유지될 수 있는 커넥션 개수 (default = 8)
minIdle
: 최소한으로 유지할 커넥션 개수 (default = 0)
maxWaitMillis (1.x에서는 maxWait)
: pool이 고갈되었을 경우 최대 대기 시간 (ms단위, default = -1 = 무한정)
-->
</Context> |
cs |
4. 다음 getConnection함수 정의
기존에 MemberDao.java에서 DB에 접속하던 다음과 같은 코드가 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 |
public static String ID = "scott"; //사용할 DB 계정
public static String PASSWORD = "tiger"; //위 계정의 비밀번호
public static String IP = "localhost";
static {
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
}
catch(ClassNotFoundException e){
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException{
return DriverManager.getConnection("jdbc:oracle:thin:@"+IP+":1521:xe", ID, PASSWORD);
}
|
cs |
위 코드를 지우던지 아니면 주석처리를 하고 다음 코드를 작성한다.
/src/memberone/MemberDao.java코드 수정
(Singleton 패턴이 적용되도록 static으로 작성했음. DAO 싱글톤은 일반적인 방법임)
1
2
3
4
5
6
7
8
9
10
11
12 |
private static DataSource ds = null;
{
try{
Context init = new InitialContext();
ds = (DataSource)init.lookup("java:comp/env/jdbc/myOracle");
}catch(Exception e){
System.err.println("Connection 실패");
}
}
public Connection getConnection() throws SQLException{
return ds.getConnection();
} |
cs |
5. Singleton 적용
앞에서 완성한 회원관리 기능을 좀더 효율적으로 바꿔보자.
현재 데이터베이스와 연결을 처리하는 DAO는 자바 빈과 액션태그 연습을 위해 반복적으로 생성하고 사용하도록 구현했다. 근데 이러한 방식으로 처리하면 사용자가 많아질 경우 DAO객체가 많이 발생하여 서버의 리소스소모가 많아질 수 있다. 그래서 앞에서 Connection Pool을 적용하고 추가적으로 Singleton이라는 클래스 디자인 패턴을 적용시키면 보다 효율적으로 데이터베이스와의 연결을 관리할 수 있다. Singleton이란
다음을 보고 객체를 하나만 생성하도록 DAO에 Singleton을 적용시켜 보자.
MemberDao에 다음 코드를 추가한다.
/src/memberone/MemberDao.java 에 메서드 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 |
/*
Singleton 적용 시
다음과 같은 코드를 추가하거나 변경한다.
*/
private static MemberDao instance = null;
private MemberDao(){ } //생성자
//생성자를 private 으로 선언했으므로 useBean으로 생성 불가
public static MemberDao getInstance(){
if(instance == null){
synchronized(MemberDao.class){
instance = new MemberDao();
}
}
return instance;
} |
cs |
위와 같이 singleton패턴을 적용한 내용을 추가하면 생성자를 private으로 제한 했으므로 모든 jsp페이지에서 useBean을 사용하여 DAO를 생성할 수 없다.
그래서 모든 jsp페이지의 dao 자바빈을 생성하는 다음과 같은 코드가 있는데
<jsp:useBean id="dao" class="memberone.MemberDao"/>
위 코드 들을 다음과 같이 수정한다.
<%@ page import="memberone.*" %> 선언으로 사용할 클래스들을 import하고
다음 코드와 같이
<% MemberDao dao = MemberDao.getInstance(); %>
싱글톤으로 생성된 DAO객체의 인스턴스를 참조하여 사용하도록 수정한다.
여기까지 완료되면 서버를 실행하여 모든 동작이 잘 돌아가는지 확인한다.
결과동작은 동일하게 보여지지만 서버에서 DB접속에 대한 기능은 우리가 설정한 Connection Pool이 적용되어 관리되게 된다.
'교육자료 > JSP' 카테고리의 다른 글
(교육자료)게시판에 페이징 처리 및 답글 기능 구현하기 실습 (0) | 2018.09.03 |
---|---|
(교육자료)게시판 구현하기 실습 (0) | 2018.09.03 |
(교육자료)로그인 기능 구현하기 실습 (0) | 2018.09.03 |
(교육자료)회원가입 기능 구현하기 실습 (0) | 2018.09.03 |
(교육자료)JSP로 JDBC이용하기 (0) | 2018.08.31 |