카테고리 : APM + Web
2007/12/31   [Tomcat] 톰캣5.5 servlet을 위한 설정(윈도우즈) [2]
2007/04/04   MySQL과 자바의 연결(JDBC 사용법) [4]
2007/02/23   [Tomcat] 톰캣5.5 설치(윈도우즈)
[Tomcat] 톰캣5.5 servlet을 위한 설정(윈도우즈)
톰캣 설치에 대한 글을 쓴지 1년이 다 되어가는 이 시점에 톰캣 설정에 대한 글을 쓰게 되내요. 찾아보니 톰캣 6.0도 있던데. 그런데  버전이 높다고 해서 다 좋은 것은 아닌 것 같내요. 버전 6.0에 도전해 봤는데, 실패했습니다. servlet에 대한 설정이 안되어서 포기하서 톰캣 5.5에 만족하기로 했습니다.

 어째든 이번에는 servlet을 위한 톰캣 5.5 설정을 해보겠습니다. jsp의 경우 그냥 하면 되는 것 같은데 servlet을 그냥 시도해봤는데 잘 안되고 설정을 변경해야 하는 것 같군요.

 이 글은 그냥 설정에서 끝나지 않고, HelloWorld 까지 만들어 보는데 까지 해보겠습니다.

우선 servlet을 위한 설정을 해보겠습니다. \conf\web.xml ( 저의 경우 C:\tools\apm\Tomcat 5.5\conf 디렉토리 안에 있내요. 모두 자기 상황에 맞게 디렉토리를 생각하기 바랍니다. )  파일을 수정해야 합니다. 패치된 버전마다 위치가 틀리겠지만 대략 115행에 다음과 같이 주석처리가 되어 있습니다.
==================================
<!--
    <servlet>
        <servlet-name>invoker</servlet-name>
        <servlet-class>
          org.apache.catalina.servlets.InvokerServlet
        </servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
-->
=================================
여기서 주석처리 기호  <!--  과  --> 를  제거해 줍니다. (제 말을 오해해서 주석된 전체를 지우진 말아주세요.)

대략 366행 쯤에 다음과 같이 주석처리가 되어있습니다.
================================
<!--
    <servlet-mapping>
        <servlet-name>invoker</servlet-name>
        <url-pattern>/servlet/*</url-pattern>
    </servlet-mapping>
-->
==============================
여기서도 주석처리 기호  <!--  과  --> 를  제거해 줍니다.

그러면 설정을 다 되었습니다.

이 다음 이제 HelloWorld 프로그램을 만들어보겠습니다.  \webapps 폴더안에 간단히 Test 라는 폴더를 생성합니다. 이 test라는 폴더명은 자신의 구미에 맞게 써 놓아도 됩니다. 그러나 다음 부터 하는 것은 규정이기 때문에 폴더명을 고치면 안됩니다. 다시 그 안에 WEB-INF 라는 폴더를 생성합니다. 다시 그 안에 classes 이라는 폴더를 생성합니다.
 말이 어렵나요. 결론적으로 이렇게 한다면 \webapps\test\WEB-INF\classes 라는 path가 생성됩니다. 이 안 \webapps\test\WEB-INF 라는 폴더에 \webapps\ROOT\WEB-INF 안에있는  web.xml  파일을 복사해 둡니다.

(대충 눈치 채셨겠지만 내가 원하는 폴더명을 정한 후, 그 안에 일정한 규칙을 갖추어 폴더명을 정합니다. jsp의 경우 이런 복잡한게 필요 없는것 같은데 servlet은 조금 까다롭내요. 약간의 보안을 위해서 이렇게 하는 것 같군요.)




 HelloWorld프로그램의 소스는 examples까지 설치했다면 얻을 수 있습니다. 설치안한 분들을 위해 그 소스를 올립니다.
==========================================
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class HelloWorld extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Hello World!</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Hello World!</h1>");
out.println("</body>");
out.println("</html>");
}
}
===========================================
당연히 이 파일을 저장할 때는 HelloWorld.java로 적어야 합니다. 이 파일을 \webapps\test\WEB-INF\classes 안에 둡니다.
그리고 컴파일 합니다. 이 때 환경변수에 classpath가 \Tomcat 5.5\common\lib\servlet-api.jar 설정되어 있어야 합니다. 저의
경우 complile 할 때 옵션에 classpath를 설정하는 방식을 이용했습니다. 그래서
C:\programs\jdk1.5.0_12\bin\javac.exe -classpath "C:\tools\apm\Tomcat 5.5\common\lib\servlet-api.jar" "C:\tools\apm\Tomcat 5.5\webapps\MySample\WEB-INF\classes\HelloServlet.java"
라는 식으로 컴파일 합니다. (굉장히 긴니다. javac.exe가 있는 path 도 설정되어 있지 않기 때문에 이러한 방식을 이용하는데
어차피 acroeditor에서 컴파일하므로 불편한 일은 없습니다. )

이렇게 컴파일하고 나면, 이제 http://localhost:8080/test/servlet/HelloWorld 를 통해

Hello World!


라는 글을 볼수가 있습니다. 물론 tomcat이 작동하고 있어야 가능하겠죠..

by nahanmil | 2007/12/31 21:55 | APM + Web | 트랙백 | 덧글(2)
MySQL과 자바의 연결(JDBC 사용법)

다음은 수업시간에 교수님이 저를 꼭 집어서 시켜서 제가 작성한 것 입니다. 도움이 될 까 하고 여기에 올려봅니다.



JDBC에 대한 설명을 수업시간에 들어서 다 아실거라 믿습니다. 다시 조금 설명하면 Java와 DB의 연결점이라고 생각하시면 됩니다. DB 마다 조금씩 SQL명령구문이 다릅니다. 다른 DB를 사용한다고 해서 SQL명령이 들어간 부분을 완전히 바꾼다고 한다면 보수유지에 문제가 많겠지요. 그래서 통일성있게 하려고 JDBC를 사용합니다. 


  JDBC를 사용할려면 우선 자바 JDK가 깔려있어야 하겠고 또 DB에 맞는 JDBC Driver가 필요합니다. 우리의 목표는 MySQL과 자바의 연결이니 MySQL에서 제공하는 JDBC Driver 가 필요합니다.  http://www.mysql.com/downloads/api-jdbc.html  이 주소를 따라가면 MySQL의 JDBC 드라이버를 받을 수 있습니다.


   다운 받을 때 버전 번호 잘 확인 하기 바랍니다. 버전 번호에 대한 설명은 http://dev.mysql.com/doc/refman/5.0/en/connector-j-versions.html  에 있습니다. 이 내용은 JDBC버전과 Mysql 의 관계를 설명한것입니다.  저의 엉터리 영어 해석을 동원하자먄  Connector/J 3.0 버전은 MySQL 3.x or MySQL 4.1 servers(버전뒤에 servers 가 붙는 것은 뭔지 모르겠습니다.) 에서 동작하고 , Connector/J 3.1 는 MySQL 4.1 and MySQL 5.0 servers 에서 동작하고, Connector/J 5.0  는  Connector/J 3.1의 기능에 뭔가를 추가했다는 말 같습니다.
  여기에 우리는 자바 가상머신 버전과 Connector/J 의 버전도 고려해야 합니다. 그 설명은 http://dev.mysql.com/doc/refman/5.0/en/connector-j-versions-java.html 여기에 있습니다. 자바 1.5이상을 쓰시면 그 다지 걱정하지 않아도 될 것 같군요..


  그냥 zip 파일이기 때문에 압축해제 하고 싶은데 하시기 바랍니다. 이 디렉토리(폴더)안에는 mysql-connector-java-[ver]-bin.jar 이런 형식의 jar 파일이 있습니다. 이 파일의 총 경로(디렉토리주소\파일이름)를 CLASSPATH라는 환경변수에 이 디렉토리를 설정하기 바랍니다. (CLASSPATH 에 추가 하는 것은 다 아시리라 믿습니다. PATH에 설정하듯이 설정하면 됩니다. CLASSPATH라는 환경변수가 없으면 만들고, 있으면 세미콜론 하나 붙인 후 이 패스를 추가 하면됩니다. )
 근데 이게 재부팅해야 작동하는 것 같습니다. 환경설정 자체는 재부팅이 필요없는데 JVM이 다시 로드되어서 작동하는 것 같습니다. 재부팅 안하고 하려면 mysql-connector-java-5.0.5-bin.jar 파일을 C:\Program Files\Java\jdk1.5.0_10\lib 라는 디렉토리에 넣으면 됩니다. 이게 더 좋은 방법일 것 같습니다.


 이제 잘 설정되었는지 실험해 보시기 바랍니다. 다음을 컴파일 한 후 실행해 보기 바랍니다.
===============================================
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;



public class jdbcTest {
 public static void main(String[] args) {
  try {
   // The newInstance() call is a work around for some
   // broken Java implementations


   Class.forName("com.mysql.jdbc.Driver").newInstance();
  } catch (Exception ex) {
   // handle the error
  }
 } 
}==================================================


 이 프로그램은 간단하게 Mysql과 연결하기 위해 드라이버를 로딩하는 기능을 합니다. 이게 제대로 실행되어야 합니다. 실행중 에러가 나면 안됩니다. 잘 작동하지 않는다면 대부분의 문제는 앞에서 설정을 잘못하였거나 자기 Mysql 버전과 맞지 않는 것을 사용했기 때문입니다.(저 같은 경우, 완전이 압축해제 하지 않아서 시간을 조금 허비했군요. 이 경우도 확인해 보시기 바랍니다.)


 이제 Mysql에 접속해 보겠습니다. 우선 mysql이 작동하는 상태로 만들고, 다음 코드를 컴파일 후 실행해 보기 바랍니다.
===================================================
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;



public class jdbcTest {
 public static void main(String[] args) {
  try {
   // The newInstance() call is a work around for some
   // broken Java implementations


   Class.forName("com.mysql.jdbc.Driver").newInstance();
  } catch (Exception ex) {
   // handle the error
  }
  try{
   Connection conn =
        DriverManager.getConnection("jdbc:mysql://localhost" ,"아이디" ,"패스워드");
        } catch (SQLException ex) {
   // handle any errors
   System.out.println("SQLException: " + ex.getMessage());
   System.out.println("SQLState: " + ex.getSQLState());
   System.out.println("VendorError: " + ex.getErrorCode());
  }


 } 
}
====================================================
 아이디와 패스워드 라고 중간에 한글로 된 부분은 진짜 자신의 아이디와 패스워드를 적어주시기 바랍니다.
 DriverManager.getConnection 메소드는 접근하기 위한 주소와 아이디, 패스워드를 받아 MySQL과 접속시켜줍니다. 만일 웹에서 작동하게 된다면 localhost 대신 자신의 웹주소를 적어야 하겠죠. 그리고 만일 Mysql을 처음 설치할 때 localhost로 안하고 다른 것으로 설정했다면 그 주소로 해야 합니다. 에러가 안 나와야 정상입니다.


 


 이제 쿼리를 날려봅시다.
==============================================
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.*;


public class jdbcTest {
 public static void main(String[] args) {
  
  try {
   // The newInstance() call is a work around for some
   // broken Java implementations


   Class.forName("com.mysql.jdbc.Driver").newInstance();
  } catch (Exception ex) {
   // handle the error
  }
  
  Connection conn = null;
  try{
   conn =
        DriverManager.getConnection("jdbc:mysql://localhost", "nahanmil","1234");
        } catch (SQLException ex) {
   // handle any errors
   System.out.println("SQLException: " + ex.getMessage());
   System.out.println("SQLState: " + ex.getSQLState());
   System.out.println("VendorError: " + ex.getErrorCode());
  }
  
  Statement stmt = null;
  ResultSet rs = null;
  try{
   stmt = conn.createStatement();
   rs = stmt.executeQuery("SELECT version()");
  
   // or alternatively, if you don't know ahead of time that
   // the query will be a SELECT...
  
   if (stmt.execute("SELECT versoin()")) {
    rs = stmt.getResultSet();
   }
  } catch(Exception ex) {
   // handle the error
  }



 } 
}
================================================================
 쿼리만 날려 봤습니다. SELECT versoin()은 SQL 버전을 출력해 주는 구문입니다. 우리의 결과는 rs에 들어 있습니다.이 자료를 출력하겠습니다. 우선 mytest 데이터베이스에 test라는 테이블을 만들어서 다음과 같이 자료를 넣었습니다. 우선 Database를 만들어 주어야 합니다.
create database mytest;
그 다음 테이블을 만들어 주어야 합니다. 다음과 같이 하면 됩니다.


CREATE TABLE  `mytest`.`test` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(45) character set utf8 NOT NULL,
  `age` int(10) unsigned NOT NULL,
  PRIMARY KEY  (`id`)
);


그리고 그 안의 데이터는 다음과 같습니다.
1 김철수 19
2 이영희 25
3 홍길동 43


 insert into 를 이용하는 것은 다 아시겠죠..


================================================
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.*;
import java.sql.CallableStatement;


public class jdbcTest {
 public static void main(String[] args) {
  
  try {
   // The newInstance() call is a work around for some
   // broken Java implementations


   Class.forName("com.mysql.jdbc.Driver").newInstance();
  } catch (Exception ex) {
   // handle the error
  }
  
  Connection conn = null;
  try{
   conn =
        DriverManager.getConnection("jdbc:mysql://localhost", "nahanmil","1234");
        } catch (SQLException ex) {
   // handle any errors
   System.out.println("SQLException: " + ex.getMessage());
   System.out.println("SQLState: " + ex.getSQLState());
   System.out.println("VendorError: " + ex.getErrorCode());
  }
  
  Statement stmt = null;
  ResultSet rs = null;
  try{
   stmt = conn.createStatement();
   rs = stmt.executeQuery("SELECT * FROM mytest.test");
  
   // or alternatively, if you don't know ahead of time that
   // the query will be a SELECT...
  
   if (stmt.execute("SELECT * FROM mytest.test")) {
    rs = stmt.getResultSet();
   }
  } catch(Exception ex) {
   // handle the error
  }
  
  try{
   while (rs.next()) {
    int id = rs.getInt("id");
    String name = rs.getString("name");        
    int age = rs.getInt("age");
    System.out.println(id + " " + name + " " +age);
   } 
  }catch(Exception ex) {
   // handle the error
  }
  }
 
}
================================================


 다음과 같은 결과가 나와야 합니다.
 
=====================
1 김철수 19
2 이영희 25
3 홍길동 43
====================


 


  MySql5.x 버전을 사용하면 한글이 깨져서 나올 수 있는데, MySQL Server Instance Config Wizard 라는 프로그램(MySQL 설치시 자동설치됩니다.)으로 환경설정을 다시 해주어야 합니다. 기본으로 하다기 Charracter set 을 설정하는 부분이 있는데, 맨 마지막 Manaul로 설정하고 Character set을 EucKR로 설정하세요.
그리고 테이블 삭제하고 다시 만들어서 실험해 보세요..


 여기 까지가 제 강의 입니다. 대부분의 자료는 http://dev.mysql.com/doc/refman/5.0/en/connector-j.htmlhttp://www.javastudy.co.kr/docs/lec_jdbc/index.shtml 에서 읽어보고 작동여부를 점검했습니다. 저기 있는대로 하니까 안되는 것도 있어 좀 고쳐서 했습니다.


 버전마다 차이는 크지 않을 거라고 생각합니다. 감사합니다.

by 한밀 | 2007/04/04 01:20 | APM + Web | 트랙백 | 덧글(4)
[Tomcat] 톰캣5.5 설치(윈도우즈)
sample.war

 우선 톰캣이 뭔지 알아야 할 것 같습니다. 아파치를 이용하여 PHP를 웹에서 돌리듯이 톰캣을 이용해서 JSP를 서버에서 돌려 웹에 보여주게 해줍니다. (사실 저도 JSP 오늘 시작했기 때문에 자세히는 모르겠습니다.  ) 

 톰캣을 다운 받으실려면 http://tomcat.apache.org/ 에 방문하기 바랍니다. (주소 뒤에 받는 apache가 너무 정겹게 느껴지지 않으십니까. ) 

 제 시스텀은 윈도우즈 XP + 서비스팩 2 입니다. (아마 머 않아서 리눅스 데비안 패키지에서도 톰캣을 설치하지 않을까 생각됩니다. 앞의 글들을 보다시피 윈도으즈에서 적용한 다음에 데비안에서 깔아봤봤습니다. 플랫폼 독립을 매우 좋아하는 저이기에 분명히 리눅스에서도 깔아볼려고 할 것 같군요.) 그리고 톰캣의 버전은 5.5.20 입니다.   톰캣의 최신 버전은  6.0.9-beta 입니다. 그러나 이미 많은 경험을 통헤 너무 높은 버전의 설치는 많은 고생을 동반한다는 것을 깨닫았기 때문에 그 보다 한 단계 낮고 많이 사용하는 5.x 대를 설치했습니다. 

 쉬운 설치를 위핸 Windows Service Installer 버전을 선택했습니다. 이미 많은 경험을 통해 zip 파일 형식의 설치는 설정의 복잡함으로 인해 더 고생이 심하다는 것을 깨닫았습니다.

 설치는 그 다지 복잡하지 않습니다. 다만 + 기호를 누른후 서비스(service)를 누르는게 좋아 보입니다. (많은 사이트에서 그것을 추천했습니다. ) 그리고 이왕이면 공부를 위해 Example 까지 설치하시기 바랍니다. 그 다음 디렉토리를 지정해 주고 admin 계정의 비밀번호를 설정해 줍니다. (비밀번호를 잊지 마시기 바랍니다. ) 그 다음 jre 가 설치된 패스를 요구하는데 자동으로 잡아줍니다. 그 다음의 자동으로 설치해 둡니다. 

 설치 후 아파치에서 많이 보아왔던 깃털모양의 아이콘이 시스템 트레이에 보여주어서 start, stop 을 편하게 조절할 수 있습니다. 

 설치 후 http://localhost:8080/ 접속하면 기본 화면이 뜹니다. (설치할 때 다른 포트로 설정했다면 8080대신 설치할 때 적은 포트번호를 입력해야 합니다. )

 
 이제 다 설치 되었는지 실험해 보아야 하겠죠. 간단한 예제코드를 http://tomcat.apache.org/tomcat-5.5-doc/appdev/sample/sample.war 를 받아서 Tomcat설치한 디렉토리\webapps 디렉토리 밑에 압축을 해제해 놓습니다. (war 라는 확장자를 처음보는데, 알집으로 풀리내요. 일반적인 압축프로그램으로 풀리리라 생각됩니다. ) (파일이 없어졌다면 맨 위의 sample.war 파일을 받으시기 바랍니다.)

 그리고 나서 http://localhost:8080/sample 를 열어보면 예제파일이 열립니다. 이제 jsp 배울 준비는 끝난 것 같군요.  

jsp 는 http://www.jabook.org/ 를 통해서 공부 할려고 합니다. 그런데 버전이 달라 애를 먹이군요.


덧 글 : 아직 완벽하지 않습니다. 이 글을 계속 고쳐지고 있습니다.
최종 수정일 06년 02월 23일 오후 17시 경. 이젠 하다하다 별 것을 다하게 됩니다. 이미 APM세팅 때문에 많은 노력을 기울렸는데 이젠 톰캣에 도전하려고 합니다. 솔직히 오늘 갑자기 루씬을 설치하고 싶어젔는데 이것 설치하려면 톰캣이 있어야 한다는 글만 읽고 아침부터 설치에 도전하고 있습니다. 다음 주면 개강인데, 개강전까지 못하면 학업에 지장 줄 것 같군요.
by 한밀 | 2007/02/23 17:04 | APM + Web | 트랙백
<< 이전 다음 >>