다음 이전 차례

5. 포스트그레스 JDBC 기초

5.1 JDBC를 위한 준비사항

JDBC 드라이버로 포스트그레스를 응용한 프로그램을 테스트하기 전에 포스트그레스 디몬 이 활성화 되어 있어야 하며 데몬은 다음의 옵션(i)에 의해 기동되어져야 한다.

postmaster   -i &

이것은 네트워크를 통해 연결하려는 JDBC를 위해 필수 사항이다. 또한 pg_hba.conf 파일을 확인하도록 한다. 만약, 일반적인 IP주소가 아닌 localhost(127.0.0.1)을 사용하려한다면 이 주 소(127.0.0.1)에 대하여 pg_hba.conf 에 설정하여야 한다. 다음은 localhost 설정 예이다.

host  all  127.0.0.1  255.255.255.255  trust

5.2 드라이버 로딩

JDBC 드라이버의 로딩 방법은 Class.forName() 를 사용하면 된다. 주의할 점이 있는데 포 스트그레스 6.5.x 버전과 7.0.x 버전대에서 약간의 차이가 생겼다. 필자가 테스트를 목적으 로 이전에 만들어 놓았던 프로그램으로 7.0.x 버전대의 JDBC 드라이버를 테스트를 해본 결 과 에러가 발생하였다. 에러를 해결하기 위해 7.0.x 버전의 문서를 찾아본 결과 아무런 변동 이 없었지만 example 디렉토리의 예제 소스를 보고 원인을 발견하였다.

포스트그레스 6.5.x 버전의 JDBC 드라이버는 Class.forName("postgresql.jar"); 하면 되지만 7.0.x 버전의 JDBC 드라이버는 Class.forName("org.postgresql.jar");를 하여야 한다. 이러한 차이를 주의하기 바란다. 다음은 포스트그레스 버전대별로 Class.forName()를 사용한 예이 다. 기타 예외 처리를 위해 ClassNotFoundException을 사용한다.

postgresql 6.5.X 에서의 Class.forName() 의 예

public void  test()
throws ClassNotFoundException, FileNotFoundException,
       IOException, SQLException
{ 
   String url = "jdbc:postgresql:nogadax";  
   String usr = "postgres";  
   String pwd = "";

   Class.forName("postgresql.Driver");

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

postgresql 7.0.X 에서의 Class.forName() 의 예

public void  test()
throws ClassNotFoundException, FileNotFoundException,
       IOException, SQLException
{ 
   String url = "jdbc:postgresql:nogadax";  
   String usr = "postgres";  
   String pwd = "";

   Class.forName("org.postgresql.Driver");

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

5.3 Connection to the Database

포스트그레스의 데이터베이스로의 연결을 위한 예는 다음과 같다.

 jdbc:postgresql:database_name 
 jdbc:postgresql://host/database_name 
 jdbc:postgresql://host:port/database_name 

host

포스트그레스 DB 서버의 호스트 네임이다. IP를 주어도 된다. 만약 이 부분이 생략되면 디폴트는 localhost(127.0.0.1) 이다.

port

포스트그레스의 디폴트 포트는 5432 이며 생략 가능하다.

database_name

데이타베이스명

기타 사항

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

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

기타 포스트그레스는 하나의 레코드의 크기가 8K 바이트로 제한되어 있다. 만약 하나의 레 코드가 8K 바이트를 넘어야 한다면 "Large Object" 라는 방법을 사용하여야 한다. 이에 대 해서는 포스트그레스 프로그래머 가이드의 JDBC 부분을 참조하기 바란다. 또한, JDBC 를 위한 나머지 자세한 부분은 일반 JDBC 문서들을 참조하기 바란다.

5.4 Jserv 테스트용 소스

다음은 Apache-Jserv 와 postgreSQL이 연동되었을 때 테스트를 위한 소스이다. 다음의 소스는 포스트그레스의 예제 소스로서 단지 servlet 로 바꾸어 web 상에서 실행이 되게끔 해준 것이다.

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

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

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

자신의 환경을 적용하기 위해 다음의 예를 참조하기 바란다. 참고로 IP 주소 210.110.144.162 는 포스트그레스 DB 서버의 IP주소이며 포트 번호가 생략되었으므로 디폴트 번호 "5432"로 자동 셋팅된 상태이다.

  String  url= "jdbc:postgresql://210.110.144.162/nogadax";

기타 Class.forName()을 버전에 따라 적절히 수정하기 바란다. 아래의 테스트용의 소스는 포스트그레스 6.5.3 의 JDBC 드라이버를 기준으로 작성되었으므로 Class.forName()이 아래 와 같다.

Class.forName("postgresql.Driver");

그러므로 7.0.x 의 JDBC 드라이버에서 테스트를 하려면 "org.postgresql.Driver" 로 수정하 면 된다.

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

http://localhost/servlet/Hello

혹은

http://210.110.144.162/servlet/Hello

혹은

http://nogadax.tit.ac.kr/servlet/Hello

다음은 "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
 }

실행 결과

실행 결과는 다음과 같다. 아래에서 보여지는 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


다음 이전 차례