Rylah's Study & Daily Life

11. JSP, DataBase (4) - DBCP API 본문

Web Study/JSP

11. JSP, DataBase (4) - DBCP API

Rylah 2022. 3. 20. 22:55

1. DBCP Setting

 데이터베이스에 연결하기 위한 커넥션(Connection)은 객체이다. 이 객체는 새로 만들어질 때 시스템에서 많은 자원을 요구한다.

 a. 객체는 메모리에 적재된다.

 b. 메모리에 객체를 할당할 자리를 만든다.

 c. 객체가 사용할 여러가지 자원들에 대한 초기화 작업, 객체가 필요없게 되면 객체를 거두는 가비지 컬렉터 작업 등이 요구된다.

 

즉, 객체 생성은 많은 자원을 필요로 한다.

 

이러한 문제를 낫게 하기 위해 JSP에서는 커넥션 풀에서 커넥션 객체들을 만들어 놓고, 커넥션 객체가 필요한 경우 작성한 객체를 할당해 주고, 사용이 끝난 후에는 다시 커넥션 풀로 회수하는 방법을 사용한다.

 결론적으로 한번 만들어져서 사용한 커넥션 객체는 다시 커넥션 풀로 회수하는 것이다.

 

자카르타 프로젝트의 DBCP API를 사용해서 이것을 간단히 사용해보자.

 

이와 같이 진행 될 예정이다.

  1. DBCP API 관련 jar 파일 설치
  2. DBCP에 관한 정보 설정 - context.xml
  3. JNDI 리소스 사용 설정 - web.xml
  4. JSP 페이지에서 커넥션 풀 사용

 

 

1. DBCP API 관련 jar 설치

 tomcat 라이브러리 폴더에는 DBCP API 관련 jar 파일이 제공되어 있다. 

이것을 이클립스에 연결하자.

JDBC 커넥터도 톰캣에 복사

2. DBCP API 관련 정보 설정 - context.xml

 context.xml은 Tomcat 홈에 conf 폴더에 있다.

또한 이클립스에서도 설정해줘야 된다. 이것은 Project Explorer의 server 추가한 곳에 있다.

 

a. DBCP에 관한 정보를 설정하는 방법 : <Resource> Element

DBCP에 관한 정보를 설정하는 <Resource> 엘리먼트는 JDBC 사용 정보를 속성의 값으로 설정한다.

tomcat\webapps\docs\jndi-resources-howto.html 참고

 

MySQL 기반 DBCP에 관한 정보 설정을 사용한다.

<Resource name="jdbc/basicjsp"
           auth="Container"
           type="javax.sql.DataSource"
           driverClassName="com.mysql.jdbc.Driver" 
           username="test"
           password="1234"
           url="jdbc:mysql://localhost:3306/basicjsp"
           maxWait="5000"       
 />
속성 설명
name java:comp/env 콘텍스트와 관련되어 생성되는 자원의 이름을 기술, 임의로 지정 가능. (jdbc/basicjsp)
auth 컨테이너를 자원관리자로 기술 할 수 있음, Application or Container가 온다. 
type 웹에서 이 리소스를 사용할 때, 실제로 사용되는 클래스를 type 속성의 값으로 기술
javax.sql.DataSource 를 사용 
jdbc/basicjsp라는 이름을 찾으면 이름에 해당하는 객체 타입인 javax.sql.DataSource로 리턴
driverClassName JDBC Driver로 MySQL 사용시에는 com.mysql.jdbc.Driver로 기술
Oralce 사용시에는 oracle.jdbc.driver.OracleDriver
username 데이터베이스에 접근하는 계정 명
password 계정의 암호
url JDBC의 url로 여기서는 mysql://localhost:3306/basicjsp를 사용했다.
오라클은 jdbc:oracle:thin:@localhost:1521:orcl 과 같이 기술
maxWait 가능한 커넥션이 없는 경우 커넥션 회수를 기다리는 시간이다. 밀리 세컨드 단위 여기서는 5초

 

이 Resource 정보를 </Context> 바로 위에 삽입해준다.

실제 톰캣에서도 추가해준다.

3. JNDI 리소스 사용 설정 - web.xml

context.xml에 저장된 JNDI 리소스를 사용하려면 web.xml에 다음과 같이 <resource-ref> 엘리먼트를 설정해야 한다.

<resource-ref> 
   <description>basicjsp db</description> 
   <res-ref-name>jdbc/basicjsp</res-ref-name> 
   <res-type>javax.sql.DataSource</res-type> 
   <res-auth>Container</res-auth> 
</resource-ref>
Element Description
<description> 리소스의 설명
<res-ref-name> context.xml의 <Resource> 태그의 name 속성과 같은 값을 기술
<res-type> context.xml의 <Resource> 태그의 type 속성과 같은 값을 기술
<res-auth> context.xml의 <Resource> 태그의 auth 속성과 같은 값을 기술

4. JSP 페이지에서 커넥션 풀 사용

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import = "java.sql.*" %>
<%@ page import = "javax.sql.*" %>
<%@ page import = "javax.naming.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Connection Pool을 사용한 테이블의 레코드들을 화면에 표시하기</title>
</head>
<body>
    <h3>Connection Pool을 사용한 테이블의 레코드들을 화면에 표시하기</h3>
    <table border="1">
        <tr>
            <td width="100">아이디</td>
            <td width="100">패스워드</td>
            <td width="100">이름</td>
            <td width="250">가입일자</td>
        </tr>
        
        <%
            Connection conn = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
            
            try {
                Context initCtx = new InitialContext();
                Context envCtx = (Context)initCtx.lookup("java:comp/env");
                DataSource ds = (DataSource)envCtx.lookup("jdbc/basicjsp");
                conn = ds.getConnection();
                
                String sql = "select * from member";
                pstmt = conn.prepareStatement(sql);
                rs = pstmt.executeQuery();
                
                while(rs.next()) {
                    String id = rs.getString("id");
                    String passwd = rs.getString("passwd");
                    String name = rs.getString("name");
                    Timestamp register = rs.getTimestamp("reg_date");
            %>
            
            <tr>
                <td width="100"><%=id %></td>
                <td width="100"><%=passwd %></td>
                <td width="100"><%=name %></td>
                <td width="250"><%=register.toString() %></td>
            </tr>
            <%
                }
            } catch(Exception ex) {
                ex.printStackTrace();
            } finally {
                if (rs != null)
                    try { rs.close(); } catch (SQLException e) {}
                if (pstmt != null)
                    try { pstmt.close(); } catch (SQLException e) {}
                if (conn != null)
                    try { conn.close(); } catch (SQLException e) {}
            }
            %>
            
 
    </table>
</body>
</html>
cs

 

 

 

'Web Study > JSP' 카테고리의 다른 글

Paging  (0) 2022.03.29
12. JSP - Cookie, Session  (0) 2022.03.21
11. JSP, DataBase (3) - JSP CRUD  (0) 2022.03.20
11. JSP, DataBase (2) - Basic Query  (0) 2022.03.20
11. JSP, DataBase (1) - MySQL  (0) 2022.03.20