농부와 컴퓨터/JAVA & JSP

[2006.03.21 (화) 맑음] JSP 2.0 / Tomcat 5.5 / MySQL 5.0 / DBCP 개발환경 설정

금오귤림원 2006. 3. 21. 01:34

http://citrus.for-me.kr (청정제주 친환경감귤농원, 금오귤림원)

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

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.