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.