본문 바로가기

프로그래밍/JAVA, Servlet, JSP

Cannot create JDBC driver of class '' for connect URL 'null'

2일동안 헤멨었다....
이클립스(갈릴레오)에서는 어찌어찌 하다가 연결에 성공했는데..
웹서버에 올리고 테스트하는데..별의별 방법을 다 써서 쥐어짜고 했지만...결국 실패;;;

저번주 패배의 쓴맛을 맛보고 다시 새로운 기분으로 구글링 검색을 했는데..정말 놀라운 글을 발견했다..
그걸보고 실행한 결과!

떴따ㅠㅠ

아 정말 ㅠㅠ

서론이 길었다....ㅠㅠ 너무 감동의 도가니라...ㅠㅠ


일단..
테스트버전은 Apach2, Tomcat 5.5.27, jdk1.6, postgreSQL 이다.
아파치와 톰캣은 연동상태, 그다지 상관은 없지만..

이클립스에서는 톰캣을 연결한 상태에서 Server프로젝트아래 server.xml의 <GlobalNamingResources>의 자식요소로 아래내용을 추가했다.

<Resource name="jdbc/testDB"           <-- 데이타소스명
    auth="Container"
    type="javax.sql.DataSource"
    username="test"             <-- 아이디
    password="test"             <-- 비번
    driverClassName="org.postgresql.Driver"             <-- 각 DB에 맞는 드라이버명을 기재
    factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
    url="jdbc:postgresql://192.168.0.9:5432/postgres"          <-- 각 DB에 맞는 url을 기재
    maxActive="20"
    maxIdle="2"
    removeAbandoned="true"/>

각 웹어플리케이션의 WEB-INF/web.xml에 아래의 내용을 기재

<resource-ref>
    <description>postgreSQL</description>
    <res-ref-name>jdbc/testDB</res-ref-name>      <-- 데이타소스명이 일치해야한다
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

테스트파일을 만든후 연결을 시도하면 된다. 나는 클래스로 만들어 jsp에서 간단히 테스트했다.

DBConnection.java
...
public Connection getConnection(){
  try{
   Context context = new InitialContext();
   DataSource ds = (DataSource)context.lookup("java:/comp/env/jdbc/testDB");
   con = ds.getConnection();
   System.out.println("연결성공");
  }catch(Exception e){
   System.out.println("연결실패");
   System.out.println(e.toString());
  }
  
  return con;
 }
...

test.jsp
...
<%
  DBConnection dbcon = DBConnection.getInstance();
  Connection con = dbcon.getConnection();
 %><%=con %>
...

간단히 연결에 성공했다.

이제 실제 웹서버에서의 테스트내용이다.
웹서버도 로컬에서와 같은 버전으로 설치했다.

먼저 $TOMCAT_HOME\conf\Catalina\<서비스하는 주소명>\<웹 어플리케이션명>.xml을 생성한다. 추가내용은 아래와 같다.(나는 Test겠지)
이 부분을 가장 많이 헤멨다.....ㅠㅠ 다른 버전과 틀린부분이라고 한다.

<?xml version="1.0" encoding="UTF-8"?>
<Context path="" docBase="서비스하는 웹 어플리케이션위치(나는 C:\Test 로 했다)" debug="0" reloadable="true">
<Resource name="jdbc/testDB"
    auth="Container"
    type="javax.sql.DataSource"
    username="test"
    password="test"
    driverClassName="org.postgresql.Driver"
    factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
    url="jdbc:postgresql://192.168.0.9:5432/postgres"
    maxActive="20"
    maxIdle="2"
    removeAbandoned="true"/>
</Context>

다음에 웹어플리케이션의 WEB-INF/web.xml에 아래의 내용을 기재

<resource-ref>
    <description>postgreSQL</description>
    <res-ref-name>jdbc/testDB</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

테스트 java파일과 jsp파일은 동일한 것으로 썼다.
테스트 결과 대성공 ㅠㅠ

톰캣 5.5의 모든 버전에서는 이 방법이 통한다고 한다. 
다른버전을 가지고 계신분은 테스트 해보시길..참고로 나는 안해봤다.

이외의 방법외에도 META-INF/context.xml을 이용하는방법, server.xml에서 <GlobalNamingResources>을 이용하는 방법등 여러가지가 있다.
나는 다 해봤다고 장담하지만...솔직히 이 방법써서 연결에 성공했다...이방법으로만..ㅠㅠ
혹시 다른방법을 연구해보고 싶으신 분들은 http://www.theserverside.com/discussions/thread.tss?thread_id=25459 을 보고 참고하시면 좋겠다.

아..드디어..코딩시작.........어?!