* 허접 구닥다리 wono의 Linux에서 JSP 시작하기 3.

(IBatis 사용하기)

 

원본 글 사이트는 아래와 같습니다.

 

http://blog.naver.com/wono77/140030004047

 

* 글쓴 History:

최초 글쓴시각- 2006년 10월 20일.

수정- 2006년 10월 27일.

이번엔 DB를 접근할 차례입니다.

 

(제 강좌는 Linux 콘솔에서 직접 java 명령어로 컴파일합니다.

DB는 mysql 사용.

일단은 윈도우와 요즘 인기있는 자바툴인 이클립스를 쓰지 않습니다.

초보가 구조적으로 디렉토리 구조등을 이해하기 위해서 리눅스 콘솔이 더 좋다고 생각하기 때문입니다.

3번 강좌를 보시기전에 1,2번 강좌를 선행하시기 바랍니다.^^)

 

먼저 IBatis를 프레임웍 기반이 아닌,

처음부터 초보가... mysql db를 생쿼리로 날리는 것 밖에 모르는 ..

log4j, struts, spring을 모르는 정말 초보가 IBatis로 SqlMap을 어떻게 접근해나가야할까..

저는 그런 고민을 하였으며,

iBatis를 시작하는 많은 사람들이 고민하였을 문제일것입니다.

 

그러나, 인터넷에는 그런 한글 문서를 찾기가 힘들더군요.

구전으로 전해지는것일까요? (아마, 그런것 같습니다.)

아니면, 좋은 출판된 책이라도 있는 것일까요? (이건 아직 아닌것 같습니다^^)

 

IBatis를 어떻게 어디서 다운받아서 어디에 설치하고, 설정은 어떻게 하라는

초보적인 문서가 없었습니다.

 

그래서 직접 설치하면서 하나하나 정리해 보았습니다.

 

여기서 일단 집고 넘어가보지요.

 

IBatis 가 무엇입니까?

 

DB를 xml 형식으로 좀더 효율적으로 사용하자는 것입니다.

java 파일에서 db를 사용할때, xml에 따로 빼서 사용하자는 건데...

 

hibernate란 것도 있습니다.

이 IBatis란 것을 spring+Ibatis, struts+Ibatis로 쓰기도 하고, log4j+Ibatis로도 쓰기도 합니다.

 

http://ibatis.apache.org/javadownloads.html

일단 위 사이트에서 iBatis를 다운로드 받으세요.

 

바이너리 판이라서 설치하실 필요가 없습니다.

윈도우에 일단 받아서 압축을 풀어보시면,

저 파일중 필요한 폴더는 lib 단 1개입니다.

 

lib안에 3개의 jar파일이 있는데요, 실제 필요한 것은 2개입니다.

 

ibatis2-common-2.1.6.589.jar

ibatis2-sqlmap-2.1.6.589.jar

 

사용하는 jar 파일들은 일단 톰캣에서 공통적으로 사용하는 common에 밀어 넣도록 하겠습니다.

 

/apache-tomcat/common/lib

위 폴더 아래에 2파일을 밀어 넣는다.

 

그리고 사용하기 위한 설정에 대한 설명이 "이동국"님이 작성하신 메뉴얼이 역시 위 링크에 있습니다.

허락은 감히 받지 않았지만, 그 pdf 메뉴얼을 여기 올립니다.

문서가 2개인데 하나는 용량이 5메가라 안올라가네요..

 

lib에 파일을 밀어 넣었는데, 윈도우, 리눅스 모두 이 lib 디렉토리의 classpath를 잡아주어야합니다.

 

저는 리눅스 bash 쉘을 쓰므로, .bash_profile 을 아래와 같이 설정합니다.

저는 자바를 /home/wono/jsp/jdk 에 설치했으며,

톰캣은 /home/wono/jsp/local/apache-tomcat 에 설치했습니다.

 

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

# User specific environment and startup programs

SVN_EDITOR=/usr/bin/vim
export SVN_EDITOR

IRTEAM=/home/wono

PATH=$PATH:$HOME/bin:/usr/local/bin:

export PATH
unset USERNAME

#자바 설정

JAVA_HOME=/home/wono/jsp/jdk
CATALINA_HOME=/home/wono/jsp/local/apache-tomcat
PATH=$JAVA_HOME/bin:$CATALINA_HOME/bin:$PATH
export JAVA_HOME CATALINA_HOME
#export CLASSPATH="$CATALINA_HOME/common/lib/servlet-api.jar:$JAVA_HOME/mysql-connector-java-5.0.2-beta-bin.jar:."
export CLASSPATH="$CATALINA_HOME/common/lib/servlet-api.jar:$JAVA_HOME/mysql-connector-java-5.0.2-beta-bin.jar:$CATALINA_HOME/common/lib/jsp-api.jar"
export CLASSPATH="$CLASSPATH:$CATALINA_HOME/common/lib:$CATALINA_HOME/common/lib/*.jar:$CATALINA_HOME/common/lib/ibatis2-common-2.1.6.589.jar:$CATALINA_HOME/common/lib/ibatis2-sqlmap-2.1.6.589.jar:."
#export CLASSPATH="$CLASSPATH:$CATALINA_HOME/common/lib/jsp-api.jar"
#--------------------------------------------------------------
# myapp
# myapp의 lib추가
#export CLASSPATH="$CATALINA_HOME/webapps/myapp/WEB-INF/lib:$CATALINA_HOME/webapps/myapp/WEB-INF/lib/*.jar"
export CLASSPATH="$CLASSPATH:$CATALINA_HOME/webapps/myapp/WEB-INF/classes:$CATALINA_HOME/webapps/myapp/WEB-INF/classes/*.xml:$CATALINA_HOME/webapps/myapp/WEB-INF/classes/*.properties"

export PATH

 

source .bashrc를 해주거나, 재접을 하시고, 1번 강좌에서 설명한

myapp라는 폴더에서 작업을 하겠습니다.

 

제가 iBatis로 해볼 작업은 다음과 같습니다.

 

Mysql의 DB명 testDB

Table 이름과 속성은 아래와 같습니다.

tb_Person{

int pid,

varchar pname 

}
 

안에 값을 간단히 넣어 두세요.^^

insert into tb_Person values(2222,'wono');

insert into tb_Person values(1111,'kanoe');

 

이제 가장 간단한 select 쿼리를 날리는 예제를 iBatis로 작성하겠습니다.

 

select pid,pname from tb_Person where pid=2222;

 

이걸 만들겁니다.

사실 php로 코딩하자면 꿀입니다. 아주 간단합니다.

또는 기존의 java로 코딩해도 별거 아닙니다.

 

그냥 아래처럼 코딩하면 됩니다. 이것이 model1 방식입니다.

 

db 이름을 testDB이며 로그인 아이디는 loginId, 패스워드는 1111, 로그인포트 3306인 경우.

 

import java.sql.*;

      class Driver {
        public static void main(String argv[]) {
            try {
                Class.forName("org.gjt.mm.mysql.Driver");
                System.out.println("jdbc 드라이버 로딩 성공");
            } catch (ClassNotFoundException e) {
                System.out.println(e.getMessage());
            }
            try {
                String url = "jdbc:mysql://localhost:3306/testDB";
                Connection con = DriverManager.getConnection(url,"loginId","1111");
                System.out.println("mysql 접속 성공");
                Statement stmt = con.createStatement();
                ResultSet rs = stmt.executeQuery("select pid from tb_Person where pid=2222");
                System.out.println("Got result:");
                while(rs.next()) {
                    String no= rs.getString(1);
                    System.out.println(" no = " + no);
                }
                stmt.close();
                con.close();
            } catch(java.lang.Exception ex) {
                ex.printStackTrace();
            }
        }
      }

 

이러면 끝입니다. 간단합니다.(우선 pid빼기일때..)

머리아프게 iBatis 쓸필요 없습니다.

하지만, 이렇게 살수는 없지 않겠습니까?^^;

파일수도 늘어나고, xml도 써야하고;; 머리아프겠지만, 조금더 함께 고생해봅시다~

쿼리문을 다 xml하나에 모아보자는데....

 

그래서 아래와 같은 총 6개의 파일들이 필요합니다.

이제 하나하나 살펴 보겠습니다.

 

3개의 java 파일과,

apache-tomcat/webapps/myapp/WEB-INF/classes 안에 넣을 다음 3개의 설정파일이 필요합니다..

 

3개의 자바 파일은 myapp 안에 그냥 두면 됩니다.

 

1. MyAppSqlMapConfig.java (ibatis와의 connectionPool 생성 및 db문xml 파싱)

2. Person.java  (id 값을 가져오기 위한 person 클래스입니다.)

3. DBTest.java  ( 이안에 main이 있습니다.)

 

3개의 설정 파일은 apache-tomcat/webapps/myapp/WEB-INF/classes 에 둡니다.


1. Person.xml  (table을 가지고 놀 db 쿼리문을 여기에 xml로 작성하셔야합니다.)

2. SqlMapConfig.properties  (db 연결용 connect 파일, id, pass가 들어있음)

3. SqlMapConfig.xml (ibatis의 핵심 설정 파일. Person.xml등 정의)

설정 파일의 소스를 먼저 본후, 소스를 하나하나 보겠습니다.

 

1. Person.xml

 

<?xml version="1.0"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="Person">
<select id="getPerson" resultClass="Person">
    SELECT pid as id,pname as name

    FROM tb_Person
    WHERE
    pid = #value#
</select>
</sqlMap>

 

쿼리문을 하나 만들때 마다 <select id..>를 선언합니다.

getPerson이라고 이름지었는데, 실제 DBTest.java 소스에서 이 getPerson 이름을 사용해서,

이곳을 호출합니다.

pid as id에서 이 id를 알리어스라고 하는데, 이렇게 as id로 알리아스를 해주어야,

자바 프로그램에서 사용이 가능합니다.

이 id라는 것은 Person.java 라는 프로그램에서 실제로 선언한 프로그램 변수명이어야 합니다.

 

2. SqlMapConfig.properties 

 

driver=org.gjt.mm.mysql.Driver
url=jdbc:mysql://localhost:3306/testDB
username=loginId
password=1111

 

이건 그냥 connect 설정입니다.

 

3. SqlMapConfig.xml

 

<?xml version="1.0" ?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<!--<properties resource="examples/domain/SqlMapConfig.properties" />-->
<properties resource="WEB-INF/classes/SqlMapConfig.properties" />
<!--<properties resource="SqlMapConfig.properties" />-->
<!--These settings control SqlMap configuration details, primarily to do with transaction management. They are all optional (see the Developer Guide for more). -->
<settings
    cacheModelsEnabled="true"
    enhancementEnabled="true"
    lazyLoadingEnabled="true"
    maxRequests="32"
    maxSessions="10"
    maxTransactions="5"
    useStatementNamespaces="false"
/>
<!--Type aliases allow you to use a shorter name for long fully qualified class names. -->
<!--<typeAlias alias="order" type="testdomain.Order" />-->
<!--Configure a datasource to use with this SQL Map using SimpleDataSource.
Notice the use of the properties from the above resource -->
<transactionManager type="JDBC" >
  <dataSource type="SIMPLE">
   <property name="JDBC.Driver" value="${driver}" />
   <property name="JDBC.ConnectionURL" value="${url}" />
   <property name="JDBC.Username" value="${username}" />
   <property name="JDBC.Password" value="${password}" />
  </dataSource>
</transactionManager>
<!--Identify all SQL Map XML files to be loaded by this SQL map. Notice the paths
are relative to the classpath. For now, we only have one… -->
<sqlMap resource="WEB-INF/classes/Person.xml" />
<!--<sqlMap resource="Person.xml" />-->
</sqlMapConfig>

별다른 설명은 필요 없을듯합니다.

제 경우 classpath에 위치 지정을 해줬는데됴, WEB-INF/classes 와 같이 위치 지정을 직접 안하면, 안되더군요.

 

 

이제 자바 소스 들어갑니다.~

 

1. MyAppSqlMapConfig.java (ibatis와의 connectionPool 생성 및 db문xml 파싱)

 

import java.io.*;
import com.ibatis.common.resources.*;
import com.ibatis.sqlmap.client.*;

public class MyAppSqlMapConfig {
        private static final SqlMapClient sqlMap;
        static {
            try {
                    String resource = "SqlMapConfig.xml";
                    Reader reader = Resources.getResourceAsReader(resource);
                    sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
            } catch (Exception e) {
                    e.printStackTrace();
                    throw new RuntimeException("Error initializing class. Cause:" + e);
            }
        }

        public static SqlMapClient getSqlMapInstance() {
            return sqlMap;
        }

}

 

2. Person.java  (id 값을 가져오기 위한 person 클래스입니다.)

 

import java.util.*;

public class Person {

    private int id;

    private String name;

    // setter
    public void setId (int id) { this.id = id; }

    // getter
    public int getId () { return id; }

    public void setName (String name) { this.name = name; }

    public String getName () { return name; }

}

 

3. DBTest.java  ( 이안에 main이 있습니다.)

 

import java.sql.SQLException;
import java.util.*;

import com.ibatis.sqlmap.client.*;

public class DBTest {

    /**
     * @param args
     * @throws SQLException
     */
    public static void main(String argv[]) throws SQLException {
        // TODO Auto-generated method stub
        // select
        /*
        */
        selectTest();
    }

    public static void selectTest () throws SQLException
    {
        //sqlMap 초기화(MyAppSqlConfig.java)
        SqlMapClient sqlMap = MyAppSqlMapConfig.getSqlMapInstance();


        Integer personId = 2222;
        //Person.xml 안의 ID가 getPerson인 DB 선언에서 값이 psersonId(2222)인것을 select>해옴
        Person person = (Person) sqlMap.queryForObject("getPerson",personId);

        System.out.println("- Id : " + person.getId());

        System.out.println("- name : " + person.getName());

        System.out.println("\\nSelect Done");
    }

}

 

짝짝짝...

그대로 한번 꼭 해보시길 바랍니다.

 

결과는

 

- Id: 2222

- name: wono

 

라고 나오겠지요? ^^

 

저도 처음에 남이 하는걸 볼때는 쉬워 보였는데, 직접 해볼려니 어렵더군요.

 

아, 컴파일은 각각 해주시면 됩니다.(아직 모든 파일들을 한방에 쏵~ 컴파일 해주는 ant 설정은 해주지 않았습니다. 뒷 강좌에서 리눅스 ant에 대해 다루겠습니다.^^)

 

1. javac MyAppSqlMapConfig.java

2. javac Person.java 

3. javac DBTest.java 

 

그리고, java DBTest 라고 해주시면...

값을 확인해 보실수 있습니다.^^

 

 

이 강좌를 iBatis를 처음 접하는 저와 같은 모든 이땅의 java, jsp 초보프로그래머에게 바칩니다.

조금이라도 도움이 되셨다면, 덧글이라도 살짝 남겨주세요. 감사합니다.

 

iBatis 사이트(http://ibatis.apache.org/javadownloads.html)의 이동국님께서 올려주신 메뉴얼을 많이 참고하였음을 밝히며, 조금밖에 안바꼈지만, 본 강좌의 저작권은 wono77에게 있습니다.

퍼가실때는 스크랩을 해주세요. 감사합니다. ^^ (__)

 

이제 이 iBatis의 기능으로 insert, delete, update 를 추가해서 게시판을 만들거나, struts, spring, log4j 같은 프레임웍을 조금씩 얹어가볼 생각입니다.

강좌는 계속 수정,보완되며... 진행 될 예정입니다.^^

Posted by '김용환'

댓글을 달아 주세요