아피치 JServ 환경에 포스트그레스를 연동하기전 다음과 같은 것들이 설치되어있어야 한다.
이미 테스트를 마친 필자의 환경은 다음과 같다.
포스트그레스는 Type 4의 JDBC 드라이버를 제공한다. Type 4는 순수 자바로 작성되었고 데이타베이스 자체의 통신 프로토콜로 통신함을 의미하며 이를 네이티브 프로토콜 순수 자바 기반이라고도 한다. 이는 클라이언트측이 DBMS 서버와 직접 통신이 가능함을 의미하며 인트라넷 환경에 적합할수도 있다. 또한 이 드라이버는 플랫폼에 비종속적이므로 한번 컴파일된 드라이버는 어떤 플랫폼에서도 사용 가능하다.
포스트그레스를 직접 설치하지 않아 포스트그레스의 소스가 없을 경우 http://www.retep.org.uk에서 드라이버를 다운받으면 된다. 단, 주의할 점이 있는데 만약 JDK1.1.x 를 가지고 있다면 JDBC1 드라이버를 다운받아야 하고 JDK1.2 이상을 가지고 있다면 JDBC2 드라이버를 다운받으면 된다.
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 라는 디렉토리가 아니어도 된다.
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 디렉토리의 예제 소스를 컴파일해본다.
아파치-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
위처럼 추가를 하였다면 이제 환경설정 부분은 끝났다.
포스트그레스의 프로그램 작성전 포스트그레스 디몬은 활성화 되어 있어야 하며 데몬은 다음 옵션에 의해 기동되어져야 한다.
postmaster -i &
이것은 포스트그레스의 JDBC 컨넥션으로 인해 필수 사항이다. 또한 pg_hba.conf 파일을 확인하도록 한다.
드라이버의 로딩방법에는 두가지가 있다. 첫째는 다음과 같다.
Class.forName("postgresql.jar");
위의 방법은 묵시적인 방법으로 Class.forName()메소드를 사용하여 로딩한다. 로딩하는동안 드라이버는 자동적으로 JDBC로 등록될것이다.forName()메소드는 ClassNotFoundException 을 throw 할 수 있다.
위의 방법은 가장 일반적인 방법이나 포스트그레스에만 치중되므로 다른 데이타베이스를 사용할 경우 문제가 될수도 있다. 이 때는 다음과 같은 두번째 방법이 있다.
java -Djdbc.drivers=postgresql.Driver example
위의 예는 실행 시점에서 포스트그레스 드라이버를 등록하는 방법이다.
서버의 호스트네임. 디폴트는 localhost 이다.
포스트그레스 디폴트 포트는 5432 이다.
데이타베이스명
컨넥트하기 위해 JDBC 로부터 Connection 인스턴스를 얻어야 한다. 이를 위해 DriverManager.getConnection() 메소드를 사용해야 한다.
Connection db = DriverManager.getConnection(url,user,pwd);
JDBC 를 위한 나머지 자세한 부분은 일반 JDBC 문서들을 참조하기 바란다.
다음은 테스트를 위한 소스이다. 다음의 소스는 포스트그레스의 예제 소스로서 단지 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
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