iBATIS를 간단하게 설정해보고, DB연동을 어떻게 하는지 테스트해보았습니다. 보통은 웹프로그램에 많이 이용이 되겠지만, 기본적으로 사용하는 법을 알아야 웹에서도 응용을 할 수 있겠지요. 다음에는 톰캣+스트럿츠2+iBATIS 연동하여 사용하는 법을 연구해보겠습니다.

  • MySQL 설치 및 DB, Table 생성
    # apt-get install mysql-server-5.0 mysql-client-5.0
    # mysqladmin -u root password 새로운비밀번호 -p
    # mysql -u root -p
    mysql> CREATE DATABASE 디비이름 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
    mysql> GRANT ALL PRIVILEGES ON 디비이름.* TO '아이디'@'localhost' IDENTIFIED BY '비밀번호' WITH GRANT OPTION;
    mysql> flush privileges;
    mysql> exit;
    # mysql -u 아이디 -p 디비이름
    mysql> create table (
        code_class_id   varchar(4),
        code_class_name varchar(100)
    );
    
    insert into(code_class_id, code_class_name) values('0000', '학교');
    insert into(code_class_id, code_class_name) values('0001', '병원');
    insert into(code_class_id, code_class_name) values('0002', '관공서');
    
  • 테스트를 위한 디렉토리 생성, iBATIS 프레임워크 파일 및 MySQL JDBC 드라이버 복사 (~/jars 에 파일들이 있다고 가정한다.)
    # cd ~
    # mkdir ibatis-test
    # cd ibatis-test
    # cp ~/jars/ibatis-2.3.0.677.jar .
    # cp ~/jars/mysql-connector-java-5.1.6-bin.jar .
    
  • ~/ibatis-test/SqlMapConfig.xml
    <?xml version="1.0" encoding="UTF-8" ?>
    
    <!DOCTYPE sqlMapConfig
      PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
      "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
    
    <sqlMapConfig>
      <transactionManager type="JDBC">
        <dataSource type="SIMPLE">
          <property name="JDBC.Driver"        value="com.mysql.jdbc.Driver"/>
          <property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost/디비이름"/>
          <property name="JDBC.Username"      value="아이디"/>
          <property name="JDBC.Password"      value="비밀번호"/>
        </dataSource>
      </transactionManager>
      <sqlMap resource="SqlMap.xml" />
    </sqlMapConfig>
    
  • ~/ibatis-test/SqlMap.xml
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
        "http://ibatis.apache.org/dtd/sql-map-2.dtd">
    
    <sqlMap>
        <select id="getAllCodeClass" resultClass="CodeClass">
            SELECT code_class_id as codeClassId,
                   code_class_name as codeClassName
            FROM tb_code_class
        </select>
    </sqlMap>
    
  • ~/ibatis-test/CodeClass.java
    public class CodeClass {
        private String codeClassId;
        private String codeClassName;
     
        public String getCodeClassId() {
            return codeClassId;
        }
     
        public void setCodeClassId(String codeClassId) {
            this.codeClassId = codeClassId;
        }
     
        public String getCodeClassName() {
            return codeClassName;
        }
     
        public void setCodeClassName(String codeClassName) {
            this.codeClassName = codeClassName;
        }
    }
    
  • ~/ibatis-test/IBatisTest.java
    import com.ibatis.sqlmap.client.*;
    import com.ibatis.common.resources.Resources;
    import java.io.Reader;
    import java.util.List;
     
    public class IBatisTest {
        public static void main(String[] args) throws Exception {
            String resource = "SqlMapConfig.xml";
            Reader reader = Resources.getResourceAsReader(resource);
            SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
            List list = sqlMap.queryForList("getAllCodeClass");
            System.out.println("Selected " + list.size() + " records.");
            for(int i = 0; i < list.size(); i++) {
                System.out.println(((CodeClass)list.get(i)).getCodeClassId());
                System.out.println(((CodeClass)list.get(i)).getCodeClassName());
                System.out.println();
            }
        }
    }
    
  • 컴파일
    # javac -classpath ibatis-2.3.0.677.jar:. IBatisTest.java
    # javac CodeClass.java
    
  • 실행/테스트
    # java -classpath ./mysql-connector-java-5.1.6-bin.jar:ibatis-2.3.0.677.jar:. IBatisTest
    

"스트럿츠2 프로그래밍" 이라는 책에서 이용되는 struts 버전은 2.0.9 입니다. 해당버전을 다운로드 받아서 압축을 풀어보면 많은 파일들이 있는데, 이 중에서 아래 파일들을 WEB-INF/lib 에 복사하라고 나옵니다.

antlr-2.7.2.jar
commons-beanutils-1.7.0.jar
commons-chain-1.2.jar
commons-logging-1.0.4.jar
commons-logging-api-1.1.jar
commons-validator-1.3.1.jar
freemarker-2.3.13.jar
ognl-2.6.11.jar
oro-2.0.8.jar
struts-core-1.3.10.jar
struts2-core-2.1.6.jar
xwork-2.1.2.jar

2.0.9 에서는 위와 같이 복사를 하면 되지만, 최신 버전인 2.1.6 에서는 톰캣 기동시에 설정을 제대로 적용하지 못하게 됩니다. 이 문제를 해결하려면, 아래 파일 4개를 추가로 복사해주면 됩니다.

commons-fileupload-1.2.1.jar
commons-io-1.3.2.jar
struts2-dojo-plugin-2.1.6.jar
aopalliance-1.0.jar

해결책은 간단하지만, 문제가 발생하면 원인도 잘 몰라서 골치아프죠. 이 외에도 2.0.x 에서 2.1.x 로 변경되면서 바뀌는 사항에 대해서는 http://cwiki.apache.org/S2WIKI/troubleshooting-guide-migrating-from-struts-20x-to-21x.html 에서 확인할 수 있습니다. 많은 부분이 변경되서 2.1.x 기반의 책이 나와야 공부하기 편하겠어요. ^^

개요
"최범균의 JSP 2.0 프로그래밍" 이라는 책의 내용중 파일업로드 하는 부분이 나오는데, 해당 라이브러리의 버전이 오래된 것이어서 테스트에 약간의 문제가 있었습니다. 이에 최신 버전으로 테스트할 수 있는 예제 소스를 정리해보았습니다. Java의 파일 업로드 모듈로 많이 사용되는 Apache commons fileUpload 의 최신 버전은 2008년 12월 31일 현재 1.2.1 입니다.또한, FileUpload 는 commons-io 1.3.2 에 의존적입니다.
예제

◎ fileUploadForm.jsp

<%@ page contentType="text/html; charset=utf-8" %>
<html>
<head><title>파일 업로드 폼</title></head>
<body>
<form action="processFileUpload.jsp" method="post" enctype="multipart/form-data">
파일1: <input type="file" name="file1" /><br/>
파일2: <input type="file" name="file2" /><br/>
파일3: <input type="file" name="file3" /><br/>
파라미터1: <input type="text" name="param1" /><br/>
파라미터2: <input type="text" name="param2" /><br/>
파라미터3: <input type="text" name="param3" /><br/>
<input type="submit" value="전송" />
</form>
</body>
</html>

◎ processFileUpload.jsp

<%@ page contentType="text/html; charset=utf-8" %>
<%@ page import="org.apache.commons.fileupload.FileItem" %>
<%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory" %>
<%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Iterator" %>
<%@ page import="java.io.File" %>
<%@ page import="java.io.BufferedInputStream" %>
<%@ page import="java.io.BufferedOutputStream" %>
<%@ page import="java.io.FileOutputStream" %>
<%@ page import="java.io.IOException" %>
<html>
<head><title>파일 업로드 처리</title></head>
<body>
<%
// Check that we have a file upload request
boolean isMultipart = ServletFileUpload.isMultipartContent(request);

if( isMultipart ) {
    File temporaryDir = new File("/tmp/");

    // Create a factory for disk-based file items
    DiskFileItemFactory factory = new DiskFileItemFactory();
    // Set factory constraints
    factory.setSizeThreshold(1024*100);
    factory.setRepository(temporaryDir);
    // Create a new file upload handler
    ServletFileUpload upload = new ServletFileUpload(factory);
    // Set overall request size constraint
    upload.setSizeMax(1024*1024);
    // Parse the request
    List /* FileItem */ items = upload.parseRequest(request);

    // Process the uploaded items
    Iterator iter = items.iterator();
    while (iter.hasNext()) {
        FileItem fileItem = (FileItem) iter.next();

        if (fileItem.isFormField()) {
            // processFormField(fileItem);
            out.println("폼 파라미터 : " + fileItem.getFieldName() + "=" + fileItem.getString("utf-8") + "<br/>");
        } else {
            // processUploadedFile(fileItem);
            out.println("파일 : " + fileItem.getFieldName() + "=<pre>" + fileItem.getString() + "</pre>(" + fileItem.getSize() + " bytes)<br/>");

            // 업로드한 파일이 존재하는 경우
            if( fileItem.getSize() > 0 ) {
                int idx = fileItem.getName().lastIndexOf("\\");
                if( idx == -1 ) {
                    idx = fileItem.getName().lastIndexOf("/");
                }
                String fileName = fileItem.getName().substring(idx + 1);

                try {
                    File uploadedFile = new File("/opt/project/jspstudy/web/chap16/data/", fileName);
                    fileItem.write(uploadedFile);
                } catch(IOException ex) {}
            }
        }
    }
} else {
    out.println("인코딩 타입이 multipart/form-data 가 아님.");
}
%>
</body>
</html>

저장하고자 하는 디렉토리는 바꾸어서 테스트해보시기 바랍니다.
이제 몇시간 후면 2009년이 되는군요. 내년도 건강하고 즐거운 한 해가 되시기 바랍니다.


오랜만의 포스팅이군요~ 그동안 이래저래 바빴답니다. 이번에는 FreeBSD 에서 Java 를 설치하는 방법을 정리하였습니다.

JDK는 라이센스 문제로 재배포를 할 수가 없다고 합니다. 그래서 사용자가 직접 사이트에서 다운로드하여 설치해야만 합니다. FreeBSD에 설치할 수 있는 JDK는 여러가지가 있습니다. 우선, /usr/ports/java 로 이동해보고 ls 를 해보면 여러 디렉토리가 나올 것입니다. jikes,diablo-jdk15, diablo-jre15, jdk11 ~ jdk16, linux-blackdown-jdk14,linux-sun-jdk12 ~ linux-sun-jdk16 과 같이 다양한 JDK를 볼 수 있습니다. 이중에서 diablo-jdk15 와 jdk15 를 설치하는 방법을 살펴보겠습니다. 그 전에 포트를 최신으로 업데이트 합니다.

# portsnap fetch update

포트를 처음 업데이트 하는 것이라면 # portsnap fetch extract update 로 업데이트해주셔야 합니다. 포트 업데이트를 하지 않으면 아래의 tzupdater 의 해당 버전을 구할 수 없는 문제가 발생할 수 있으니, 꼭 업데이트 해야 합니다. 아래 설치방법은 현재(2008-05-15)를 기준으로 FreeBSD 7.0 에서 작성되었습니다.

diablo-jdk15 설치

/usr/ports/java/diablo-jdk15 로 이동하여 바로 make 를 하면 에러를 보게 될 것이다.
우선, http://www.FreeBSDFoundation.org 에서 diablo-caffe-freebsd6-i386-1.5.0_07-b01.tar.bz2 를 다운로드 받고,
http://java.sun.com/javase/downloads/index.jsp 에서 tzupdater-1_3_5-2008b.zip 을 다운로드 받는다.
그리고, 다운로드 받은 파일을 /usr/ports/distfiles 에 복사한다.
이제 아래와 같이 수행하면 잘 설치될 것입니다.

# cd /usr/ports/java/diablo-jdk15
# make; make install

jdk15 설치

역시, /usr/ports/java/jdk15 로 이동하여 make 를 하면 에러를 보게 됩니다.
그러니, http://download.java.net/tiger/archive/tiger_u14/ 에서 jdk-1_5_0_14-fcs-src-b03-jrl-05_oct_2007.jar 와 jdk-1_5_0_14-fcs-bin-b03-jrl-05_oct_2007.jar 다운로드 받고,
http://java.sun.com/javase/downloads/index.jsp 에서 tzupdater-1_3_5-2008b.zip 을 다운로드 받는다.
http://www.eyesbeyond.com/freebsddom/java/jdk15.html 에서 bsd-jdk15-patches-8.tar.bz2 를 다운로드 받습니다.
그리고, 다운로드 받은 파일을 /usr/ports/distfiles 에 복사한다.
이제 아래와 같이 수행하면 잘 설치될 것입니다.

# cd /usr/ports/java/jdk15
# make; make install

jdk16 도 같은 방법으로 다운로드/설치하면 될 것 같습니다. diablo-sdk 는 1.6 버전이 없고, 꾸준이 업데이트되는 것 같지 않습니다. 따라서, java.net 에서 제공되jdk15 또는 jdk16을 설치해서 쓰는것이 좋을 듯 합니다.

+ Recent posts