농부와 컴퓨터/JAVA & JSP

[개발환경] JSP 2.0 / Tomcat 5.5 / MySQL 5.0 / DBCP 개발환경 설정

금오귤림원 2006. 3. 11. 05:43

JSP / JAVA 개발 환경의 설정은 정말이지 너무 힘들어!

http://planet.daum.net/chrkang (제주원시인의 맛 좀 볼래요?)

2. JSP 2.0 Developement with TOMCAT 5.5.15 Servlet Container

-------------------------------------------------------------

1) Tomcat Version : Tomcat 5.5.15 ( JSP Servelt Container & Web Server )

2) JDK Version : JDK 1.5.0_06

3) JRE Version : JRE 1.5.0_06

4) Database Server & Version : MySQL 5.0.18

5) Pursose : Using Connection Pool with Jakarta DBCP API for MySQL Database Server

6) Test Program

가. Web.xml (기존의 내용에 아래 내용을 추가함)

(아래, 나.항의 config.getInitParameter("jdbcdriver") 로 MySQL JDBC Driver 클래스를

지정하기 위함. 톰캣 기동시 설정됨.)

<!-- Define Database Connection Pool 초기화 및 JDBC 드라이버 로딩 -->
<display-name>청정제주금오귤림원을 찾아주신 모든 분을 환영합니다.</display-name>
<description>금오귤림원을 위한 데이터베이스 설정</description>
<servlet>
<servlet-name>DBCPInit</servlet-name>
<servlet-class>info.tobe4u.Common.DBCPInit</servlet-class>
<load-on-startup>1</load-on-startup>
<init-param>
<param-name>jdbcdriver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</init-param>
</servlet>

나. 톰캣 기동시 자동으로 JDBC 드라이버를 로드하기위한 자바 클래스

package info.tobe4u.Common;

import javax.servlet.http.HttpServlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import java.util.StringTokenizer;

public class DBCPInit extends HttpServlet
{
static final long serialVersionUID = 5046097623327857319L;

public void init(ServletConfig config) throws ServletException
{
try
{
String drivers = config.getInitParameter("jdbcdriver");
StringTokenizer st = new StringTokenizer(drivers, ",");
while(st.hasMoreTokens())
{
String jdbcDriver = st.nextToken();
Class.forName(jdbcDriver);
}

Class.forName("org.apache.commons.dbcp.PoolingDriver");

}
catch(Exception ex)
{
throw new ServletException(ex);
}
}
}

다. Database Connection POOL Configuration file.

<object class="org.apache.commons.dbcp.PoolableConnectionFactory"

xmlns="http://apache.org/xml/xmlns/jakarta/commons/jocl">
<object class="org.apache.commons.dbcp.DriverManagerConnectionFactory">
<string value="jdbc:mysql://localhost:3306/DatabaseName?

useUnicode=true&characterEncoding=euc_kr" />
<string value="UserName" />
<string value="Password" />
</object>
<object class="org.apache.commons.pool.impl.GenericObjectPool">
<object class="org.apache.commons.pool.PoolableObjectFactory" null="true" />
<int value="10" />
<byte value="1" />
<long value="10000" />
<int value="10" />
<int value="3" />
<boolean value="true" />
<boolean value="true" />
<long value="600000" />
<int value="5" />
<long value="3600000" />
<boolean value="true" />
</object>
<object class="org.apache.commons.pool.KeyedObjectPoolFactory" null="true" />
<string null="true" />
<boolean value="false" />
<boolean value="true" />
</object>

라. JSP Source Program

<%@ page contentType="text/html; charset=euc-kr" %>
<%@ page import ="java.sql.DriverManager, java.sql.Connection, java.sql.Statement,

java.sql.ResultSet, java.sql.SQLException" %>

<html>
<head>
<title>데이터베이스 콘넥션 풀 시험중... [회원목록 출력]</title>
</head>
<body>
<table>
<tr>
<td>이름</td>
<td>아이디</td>
<td>전자우편</td>
</tr><%
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;

try
{
String jdbcDriver = "jdbc:apache:commons:dbcp:/FarmCitrus";
String query = "select * from Member";

conn = DriverManager.getConnection(jdbcDriver);
stmt = conn.createStatement();
rs = stmt.executeQuery(query);

while(rs.next())
{%>
<tr>
<td><%=rs.getString("Name") %></td>
<td><%=rs.getString("Id") %></td>
<td><%=rs.getString("EMail") %></td>
</tr><%
}
}
finally
{
if(rs != null) try { rs.close(); } catch(SQLException ex) {}
if(stmt != null) try { stmt.close(); } catch(SQLException ex) {}
if(conn != null) try { conn.close(); } catch(SQLException ex) {}
}%>
</table>
</body>
</html>

7) Problem

이런 저런 상황에 따라 정상동작이 되다 안되다 한다. 정확한 이유는 알 수 없으나,

대체로 위의 자바 단독 개발환경과 같은 이유와 같다는 생각이 든다. 다만, 위 에서 다운로드한

각 라이브러리 파일들을 톰캣이 설치된 홈 디렉토리의 common/lib 디렉토리나 또는

각 각의 웹 어플리케이션 ROOT 디렉토리 밑의 WEB-INF/lib 디렉토리에 복사해 넣음으로써

관련된 Exception 들을 해결했다.

그러나, 데이터베이스 연결 풀을 위한 데이터베이스 접속 설정파일(Configuration file;여기서는

FarmCitrus.jocl)을 톰캣이 구동중에 인식할 수 있는 클래스패스(WEB-INF/classes)에

위치 시켰어도 여전히 Configuration file not found 라는 예외가 발생했다.

이 문제는 일단, Class.getResource(String ResourceName) API를 참고하여

WEB-INF/classes 디렉토리 밑에 org/apache/dbcp 라는 하위 디렉토리를 생성한 후,

최 하위 디렉토리인 dbcp 디렉토리에 데이터베이스 접속 설정파일(FarmCitrus.jocl)을 위치시켜

해결했다.

가. Java.sql.SQLException : Configuration file not found

- Configuration file of Database Connection Pool is not located proper classpath or not prepared.

- Create directory named org/apache/dbcp on {Web Application's ROOT}/WEB-INF directory.

(full name : {Web Appliication's ROOT}/WEB-INF/classes/org/apache/dbcp/FarmCitrus.jocl)

- if Configuration file is not prepared yet, Write the configuration file and put it to proper location.

in my case, put the file to WEB-INF/classes/org/apache/dbcp directory.