상세 컨텐츠

본문 제목

Apache-JServ 에 postgreSQL 연동하기

프로그래밍/시스템, 서버구축

by 라제폰 2008. 12. 30. 13:19

본문

1. 필수 사항

아피치 JServ 환경에 포스트그레스를 연동하기전 다음과 같은 것들이 설치되어있어야 한다.

  • 아파치
  • JServ
  • JDK1.1.x 이상
  • JSDK2.0 이상
  • postgreSQL

이미 테스트를 마친 필자의 환경은 다음과 같다.

  • 액셀 리눅스 6.1
  • 아파치 1.3.9
  • JServ 1.0
  • JDK 1.2.2
  • JSDK 2.0
  • postgresql 6.5.3

2. JDBC 드라이버 만들기

2.1 포스트그레스의 드라이버 타입

포스트그레스는 Type 4의 JDBC 드라이버를 제공한다. Type 4는 순수 자바로 작성되었고 데이타베이스 자체의 통신 프로토콜로 통신함을 의미하며 이를 네이티브 프로토콜 순수 자바 기반이라고도 한다. 이는 클라이언트측이 DBMS 서버와 직접 통신이 가능함을 의미하며 인트라넷 환경에 적합할수도 있다. 또한 이 드라이버는 플랫폼에 비종속적이므로 한번 컴파일된 드라이버는 어떤 플랫폼에서도 사용 가능하다.

2.2 JDBC 다운받기

포스트그레스를 직접 설치하지 않아 포스트그레스의 소스가 없을 경우 http://www.retep.org.uk에서 드라이버를 다운받으면 된다. 단, 주의할 점이 있는데 만약 JDK1.1.x 를 가지고 있다면 JDBC1 드라이버를 다운받아야 하고 JDK1.2 이상을 가지고 있다면 JDBC2 드라이버를 다운받으면 된다.

2.3 JDBC 만들기

JDBC 드라이버가 없다면 이를 만들어야 한다. 만약 포스트그레스의 소스를 다운받아 직접 설치를 한 경우이면 포스트그레스 소스 디렉토리내의 interfaces 디렉토리에 JDBC 소스가 있어서 컴파일을 하면 된다. 또한, JDK1.1.x 하에서 JDBC 드라이버를 만들면 JDBC 1 드라이버이다. JDK1.2 버젼에서 만들어진 JDBC 드라이버는 JDBC 2 드라이버이다.

드라이버를 만들기전에 포스트그레스의 소스 디렉토리는 /usr/local/src/pgsql6.5.3 이라 가정하고 설치된 디렉토리를 /usr/local/pgsql 이라 가정한다. 자, 이제 JDBC 드라이버를 만들어보자.

/usr/local/src/pgsql6.5.3/src/interfaces/jdbc]$ make

단지 위의 디렉토리로 가서 make만 해주면 된다. 이제 컴파일 된 드라이버를 확인해 보자. 드라이버의 이름은 postgresql.jar 이다. 이 드라이버는 /usr/local/pgsql 에 jdbc 라는 디렉토리를 만들고 이 드라이버를 복사해 놓으면 된다.

/usr/local/pgsql]$ mkdir jdbc
/usr/local/pgsql]$ cp ../src/pgsql653/src/interfaces/postgresql.jar ./jdbc/

꼭 /usr/local/pgsql 디렉토리가 아니어도 되고 jdbc 라는 디렉토리가 아니어도 된다.

 

3. 환경 설정들

3.1 JDK 를 위한 환경설정

JDK 를 위해 CLASSPATH 를 설정하여야 한다.

export CLASSPATH="$CLASSPATH:/usr/local/pgsql/jdbc/postgresql.jar:."

아니면 위의 export 명령이 아닌 /etc/profile 이나 /root/.bash_profile 에 CLASSPATH를 작성한다. 테스트를 위해 /usr/local/src/pgsql653/src/interfaces/jdbc/example 디렉토리의 예제 소스를 컴파일해본다.

3.2 Jserv를 위한 환경설정

아파치-JServ 가 이미 설치되어 있다면 JServ 환경파일인 jserv.properties 가 있을 것이다. 이 화일내에 postgresql.jar 의 경로를 포함시켜주면 된다. 필자의 아파치-JServ의 환경 파일 구성은 다음과 같다.

/usr/local/apache/conf]$ ls
  access.conf  
  httpd.conf    
  srm.conf   
  jserv.conf   
  jserv.properties 
  servlets.properties 

포스트그레스의 JDBC 드라이버가 jserv.proeprties 에 등록이 되면 아파치-JServ 를 위한 환경 설정은 끝이다. jserv,properties 에 다음처럼 추가해주면 된다.

wrapper.classpath=/usr/local/pgsql/jdbc/postgresql.jar

위처럼 추가를 하였다면 이제 환경설정 부분은 끝났다.

 

4. 포스트그레스 JDBC 기초

4.1 JDBC를 위한 준비사항

포스트그레스의 프로그램 작성전 포스트그레스 디몬은 활성화 되어 있어야 하며 데몬은 다음 옵션에 의해 기동되어져야 한다.

postmaster -i &

이것은 포스트그레스의 JDBC 컨넥션으로 인해 필수 사항이다. 또한 pg_hba.conf 파일을 확인하도록 한다.

4.2 드라이버 로딩

드라이버의 로딩방법에는 두가지가 있다. 첫째는 다음과 같다.

Class.forName("postgresql.jar");

위의 방법은 묵시적인 방법으로 Class.forName()메소드를 사용하여 로딩한다. 로딩하는동안 드라이버는 자동적으로 JDBC로 등록될것이다.forName()메소드는 ClassNotFoundException 을 throw 할 수 있다.

위의 방법은 가장 일반적인 방법이나 포스트그레스에만 치중되므로 다른 데이타베이스를 사용할 경우 문제가 될수도 있다. 이 때는 다음과 같은 두번째 방법이 있다.

java -Djdbc.drivers=postgresql.Driver example

위의 예는 실행 시점에서 포스트그레스 드라이버를 등록하는 방법이다.

4.3 Connection to the Database

  • jdbc:postgresql:database
  • jdbc:postgresql://host/database
  • jdbc:postgresql://host:port/database
host

서버의 호스트네임. 디폴트는 localhost 이다.

port

포스트그레스 디폴트 포트는 5432 이다.

database

데이타베이스명

컨넥트하기 위해 JDBC 로부터 Connection 인스턴스를 얻어야 한다. 이를 위해 DriverManager.getConnection() 메소드를 사용해야 한다.

Connection db = DriverManager.getConnection(url,user,pwd);

JDBC 를 위한 나머지 자세한 부분은 일반 JDBC 문서들을 참조하기 바란다.

 

5. 테스트용 소스

5.1 소스 설명

다음은 테스트를 위한 소스이다. 다음의 소스는 포스트그레스의 예제 소스로서 단지 servlet 로 바꾸어 web 상에서 실행이 되게끔 해준 것이다.

다음 예제를 컴파일하고 실행하기에 앞서 포스트그레스에 데이타베이스를 만들어야 한다. 여기서는 데이타베이스 이름이 nogadax 이다. 이를 적절히 바꾸기 바란다. 또한 포스트그레스의 유저명은 postgres 이고 패스워드는 없다. 이곳의 소스에서의 url, usr, pwd 의 설정은 다음과 같다. 이를 참조하여 자신의 환경에 맞게 바꾸기 바란다.

String url = "jdbc:postgresql:nogadax";  
String usr = "postgres";  
String pwd = "";

또한 필자의 테스트 환경은 한대의 PC 에 포스트그레스와 아파치가 같이 설치되어 있다. 만약 테스트하려고 하는 환경이 DB서버 WEB서버가 서로 다른 곳에 있는 즉, 3Tier 환경이면 URL 은 위와는 다르게 되어져야 한다. 즉, 다음의 예와 같다.

String url= "jdbc:postgresql://diver:5432/nogadax";

또한 컴파일된 서블릿은 리포지토리에 있어야 한다. 리포지터리는 서블릿을 위한 논리적인 디렉토리이다. 이것은 zone 와 연결되어지는데 zone은 URL에 첨가되어진다. 만약 zone 의 이름이 servlet 이고 아래의 예제소스를 컴파일 후 지정된 리포지터리에 있다면 실행을 위해 브라우져의 URL 창에 다음처럼 입력해주면 되는데 자신에게 맞게 바꾸어주면 된다.

http://localhost/servlet/Hello
혹은
http://210.110.144.162/servlet/Hello
혹은
http://nogadax.tit.ac.kr/servlet/Hello

5.2 소스

Hello.java


import java.io.*;
import javax.servlet.*;
import java.sql.*;
import java.text.*;
import javax.servlet.http.*;

public class Hello extends HttpServlet
{ 
  Connection db;  
  Statement  st;
  PrintWriter out;

    public void doGet (HttpServletRequest request,
                       HttpServletResponse response) 
        throws ServletException, IOException  
        {   
            String title = "Example Apache JServ Servlet";
            response.setContentType("text/html");
            out = response.getWriter();
            out.println("<HTML><HEAD><TITLE>");
            out.println(title);
            out.println("</TITLE></HEAD><BODY bgcolor=\"#FFFFFF\">");
            out.println("<H1>" + title + "</H1>");
            out.println("<H2> Congratulations, Apache JServ is working!</H2>");
            try {
                 test();
            } catch(Exception ex){
               out.println("<h2>DB error!</h2>");
             }
            out.println("</BODY></HTML>");
            out.close();
        }

        public void cleanup()
        {  try {
            st.executeUpdate("drop table basic");
           } catch(Exception ex) {  }
        }
  

        public void doexample() throws SQLException
        {
          out.println("<br><h2>Running tests:</h2>");
          st.executeUpdate("create table basic (a int2, b int2)");
          st.executeUpdate("insert into basic values (1,1)");
          st.executeUpdate("insert into basic values (2,1)");
          st.executeUpdate("insert into basic values (3,1)");
          st.executeUpdate("update basic set b=8");
          out.println("<h2>Updated "+st.getUpdateCount()+" rows</h2>");
          PreparedStatement ps = db.prepareStatement("insert into basic values (?,?)");
          for(int i=2;i<5;i++) {
            ps.setInt(1,4);             // "column a" = 5
            ps.setInt(2,i);             // "column b" = i
            ps.executeUpdate(); 
          }
          ps.close();                
          out.println("<h2>performing a query</h2>");
          ResultSet rs = st.executeQuery("select a, b from basic");
          if(rs!=null) {
            while(rs.next()) {
                int a = rs.getInt("a");
                int b = rs.getInt(2); 
                out.println("<h2>  a="+a+" b="+b+"</h2>");
            }
            rs.close(); 
          }
        }

       public void  test()
          throws   ClassNotFoundException, FileNotFoundException,IOException, SQLException
       { 
        
          String url = "jdbc:postgresql:nogadax";  
          String usr = "postgres";  
          String pwd = "";
          Class.forName("postgresql.Driver");
          db = DriverManager.getConnection(url, usr, pwd);
          out.println("<h2>Connecting to Database URL = " + url +"</h2>");
          out.println("<h2>Connected...Now creating a statement</h2>");
          st = db.createStatement();
          cleanup();    
          doexample();    
          cleanup();
          out.println("<h2>Now closing the connection</h2>");
          st.close();   
          db.close();
  
        }//end test
}

5.3 실행 결과

실행 결과는 다음과 같다. URL이 다를 수 있다.

Example Apache JServ Servlet

Congratulations, Apache JServ is working!

Connecting to Database URL = jdbc:postgresql:nogadax

Connected...Now creating a statement


Running tests:

Updated 3 rows

performing a query

a=1 b=8

a=2 b=8

a=3 b=8

a=4 b=2

a=4 b=3

a=4 b=4

Now closing the connection

관련글 더보기