2009년 9월 9일 수요일

iBATIS Setting


이번엔 iBatis를 이용해보자...

일단 iBatis를 사용하기 위한 준비를 해보자...

 

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

 

위 사이트에서 2.3버전을 다운받은 후 압축을 풀도록 한다...

압축을 푼 후 lib폴더에 보면 ibatis-2.3.0.677.jar 파일이 있는데..

라이브러리에 추가하도록 하자..

이전 버전에서는 파일이 여러개로 나뉘어져 있었는데..

2.3버전으로 오면서 하나로 통합되었다...

 

그리고 자신이 사용할 DB에 맞는 JDBC 라이브러리를 다운받도록 한다..

나같은 경우는 MySQL을 사용하므로 MySQL JDBC 커넥터를 받았다..

아래 사이트에서 다운 받도록 하자...

 

http://dev.mysql.com/downloads/connector/j/5.1.html

 

준비는 모두 끝났다.. 본격적으로 시작해보자..

일단 iBatis 설정 파일을 만들어 보자..

보통 SqlMapConfig.xml 로 만든다..

이 파일에는 JDBC 연결 정보 및 환경 설정 등을 할 수 있다...

 

<?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>

 

 <properties resource="/org/cuvic/sql/db.properties"/>
 
 <settings useStatementNamespaces="false"
     cacheModelsEnabled="true"
     enhancementEnabled="true"
     lazyLoadingEnabled="true"
     maxRequests="512"
     maxSessions="128"
     maxTransactions="32"/>
 
 <transactionManager type="JDBC">
  <dataSource type="SIMPLE">
   <property name="JDBC.Driver" value="${driver}"/>
   <property name="JDBC.ConnectionURL" value="${url}"/>
   <property name="JDBC.Username" value="${user}"/>
   <property name="JDBC.Password" value="${pword}"/>
  </dataSource>
 </transactionManager>
 
 <sqlMap resource="/org/cuvic/sql/map/SqlMap.xml"/>
 
</sqlMapConfig>

 

<property> 태그는 properties 파일을 읽어오기 위한 태그이다...

properties 파일에 있는 속성을 ${프로퍼티이름} 이런 식으로 사용할 수 있다..

db.propertieis 파일은 아래와 같이 작성하면 된다...

 

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/cuvicdb
user=user
pword=pword

 

<transactionManager> 태그에 보면 ${driver} 이런 식으로 사용하는 것을 볼 수 있다..

 

<settings> 태그를 살펴보면 옵션이 많이 있는데...

useStatementNamespace는 이름공간을 사용할 수 있도록 하고 디폴트는 false이다..

보통의 이름 공간이 가지는 장점들을 사용할 수 있다...

cacheModelsEnabled는 캐싱을 사용할지 지정하는 옵션으로 디폴트는 true이다...

lazyLoadingEnabled는 적재지연 기술을 사용할지 지정하는 옵션이고 디폴트는 true이다...

적재지연은 데이터를 읽어올 때 실제 요청이 있을 경우에만 읽어오는 기술이다..

enhancementEnabled는 적재지연의 성능을 향상시킬 때 사용하고 디폴트는 true이다....

실행시간에 코드를 변경할 수 있는 CGLIB를 사용하므로 라이브러리가 없다면 자동 비활성화 된다...

기타 max 시리즈의 옵션들은 위에 나온 값이 디폴트 값이다..

위 옵션들은 작성을 권장하지 않으므로 그대로 사용하는 것이 좋을 듯 하다..

만약 수정한다면 값이 maxRequest > maxSessions > maxTransactions 이렇게 되어야 한다...

 

이제 제일 중요한 <transactionManager> 태그를 살펴보자...

type에는 JDBC, JTA, EXTERNAL 3가지 종류가 있다..

 

iBatis에서는 트랜잭션을 자동, 로컬, 글로벌, 사용자 정의 4가지로 구분하게 된다..

자동 트랜잭션은 아래에 나오는 쿼리 실행 메소드를 호출하는 것으로 지원된다...

즉.. 하나의 쿼리 실행 메소드는 하나의 트랜잭션이라는 것이다..

그리고 로컬 트랜잭션은 자동 트랜잭션과 다를게 없다..

단지 자동이 아니고 개발자가 직접 제어할 수 있다는 것이 자동과 로컬의 차이일 뿐이다...

또한 분산 DB가 아닌 하나의 DB에만 적용할 수 있다...

여기까지가 바로 JDBC type을 사용할 경우 사용할 수 있는 트랜잭션이다...

 

글로벌 트랜잭션... 즉 분산 DB를 적용하고 싶은 경우에 JTA와 EXTERNAL type을 사용한다..

능동 혹은 수동으로 글로벌 트랜잭션을 사용할 수 있는데...

iBatis가 직접 트랜잭션을 관리하고자 한다면 JTA를...

외부에 트랜잭션을 맡기고자 한다면 EXTERNAL을 사용한다..

 

<dataSource> 태그에 실제 DB에 접속할 정보를 설정해준다...

type에는 역시나 SIMPLE, DBCP, JNDI 3가지 종류가 있다..

보통 SIMPLE을 사용해서 DB 접속 정보를 직접 넣어주면 된다...

혹시나 Jakarta Commons Database Connection Pool을 사용하고자 한다면 DBCP를 쓰면 되고...

JNDI 데이터 소스를 사용하고자 한다면 JNDI를 사용하면 된다...

 

아무튼 이것으로 iBatis 설정 파일은 끝이다...

실제 SQL을 모아놓은 파일은 <sqlMap> 태그 경로에 있는 SqlMap.xml 파일이다...

물론 하나만 할 수도 있고 여러 개를 만들 수도 있다...

SqlMap.xml은 다음에 알아보도록 하고...

이제 iBatis를 어떻게 사용하는지 알아보도록 하자...

 

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

 

public class Test
{

     public static void main(String args[]) throws Exception

     {

          Reader reader = Resources.getResourceAsReader("/org/cuvic/sql/SqlMapConfig.xml");
          SqlMapClient client = SqlMapClientBuilder.buildSqlMapClient(reader);

 

          // 아래와 같은 메소드들을 사용할 수 있다.

          client.queryForObject(id, parameter);

          client.queryForList(id, parameter);

          client.queryForMap(id, parameter, key);

 

          client.insert(id, parameter);

          client.update(id, parameter);

          client.delete(id, parameter);

     }

}

 

일단 앞서 설정한 SqlMapConfig.xml 파일을 읽어온다...

원래는 WEB-INF에 넣어놓으면 경로를 안 써도 된다고 하는데 난 안되서 저렇게 해주었다...

그 후에 SqlMapClient 객체를 생성해주면 된다...

이 객체가 바로 모든 SQL 명령을 내릴 수 있는 객체이다...

일단 기본적으로 select문 insert문, update문, delete문을 위한 메소드가 있다..

 

참고로 iBatis는 SQL 결과를 자바빈즈로 만드는 것을 추천하고 있다..

근데 난 자바빈즈 만드는게 귀찮아서 HashMap을 주로 이용한다..

물론 각각 장단점이 있지만 난 저게 편하다...

 

아무튼 먼저 select문에 사용되는 메소드는 다음과 같이 3가지가 있다...

 

Object queryForObject(String id, Object parameter) 메소드

List queryForList(String id, Object parameter) 메소드

Map queryForMap(String id, Object parameter, String key) 메소드

 

물론 메소드가 오버로드 되서 2개씩 존재하지만 내가 사용해 본 것만 적어놨다...

 

일단 queryForObject는 레코드가 1개만 존재할 때 사용할 수 있다...

1개 이상 리턴될 경우 에러가 발생한다...

그리고 리턴되는 객체에 디폴트 생성자가 없어도 에러가 발생하므로 주의하자...

id에는 SqlMap에 정의된 SQL id를 넘겨주고 파라미터가 필요하면 parameter에 넘겨주면 된다..

파라미터가 1개 밖에 존재하지 않는데 파라미터가 2개 이상이면 어쩌나 고민할지도 모르겠다..

2개 이상인 경우는 자바빈즈를 만들어서 전달하던가 HashMap 등을 만들어서 넘기면 된다...

이것은 insert나 update나 delete나 전부 해당하는 내용이다...

나 같은 경우는 당연히 HashMap으로 만들어서 전달하는 방식을 사용한다...

 

queryForList는 1개 이상의 레코드를 가져올 때 사용한다...

위의 예에서 볼 수 있듯이 결과값이 List 형태로 넘어오게 된다..

만약 자바빈즈를 결과 값으로 갖도록 SqlMap을 만들었다면...

List에 자바빈즈가 들어간 상태로 리턴된다...

 

queryForMap도 1개 이상의 레코드를 가져올 때 사용하는데..

Map의 특성상 key를 지정해주는 매개변수가 하나 더 추가되어 있다...

해당 key값에 결과를 저장해서 리턴해주게 된다..

 

이번에는 나머지 메소드들을 알아보도록 하자...

 

Object insert(String id, Object parameter)

int update(String id, Object parameter)

int delete(String id, Object paramter)

 

3개 다 사용법은 queryForObject와 같은 방식으로 사용하면 된다...

여기서 주목할 것은 insert의 반환값이 Object라는 사실이다...

<selectKey> 태그를 사용해 반환값을 지정해 줄 수 있는데...

이를 이용해서 자동 생성 키(오라클의 경우 sequence)를 사용할 수 있다고 한다..

update나 delete 같은 경우는 반환값이 int라서 수정되거나 삭제된 개수만 리턴하게 된다...

 

여기까지 기본적으로 iBatis를 어떻게 사용하는지까지 알아보았다..

아직 SqlMap에 대한 파악이 끝나지 않은 관계로 여기까지만 정리하도록 하자...

다시 한 번 말하지만 iBatis는 자바빈즈를 추천하고 있지만...

개인적으로 HashMap이 편해서 앞으로 전부다 HashMap을 이용할 계획이다..

[출처] iBatis 사용하기...|작성자 따굴찬

댓글 없음:

댓글 쓰기