본문 바로가기

카테고리 없음

iBATIS 2.3.4 with Spring 2.5.6, Weblogic 10.3.4

iBATIS 2.3.4 with Spring 2.5.6, Weblogic 10.3.4

테스트환경: JDK 1.6, iBATIS 2.3.4, Spring 2.5.6, Weblogic 10.3.4, MSSQL 2008 R2, Eclipse 3.5



개요
웹로직 서버의 관리콘솔에서 설정한 데이터소스를 iBATIS에서 사용하도록 설정(sqlMapConfig.xm)하고 Spring프레임워크에서 iBATIS의 SqlMapClient인스턴스를 생성해주는 SqlMapClientFactoryBean 클래스와 SqlMapClient 인스턴스를 속성으로 포함하면서 DAO 기능을 지원하는 SqlMapClientDaoSupport 클래스를 사용하는 절차를 정리해봅니다.

1. JDK 1.6 설치
2. MS SQL 2008 R2 설치 / Test_DB 생성 / my_table 생성 및 간단한 데이터 저장 /
3. Oracle Weblogic10.3.4 설치 / base_domain(임의의 도메인) 생성 / Weblogic 서버에 MS SQL 2008의 데이터 소스  설정 /
4. Eclipse 3.5 설치 / Eclipse에 Weblogic 서버 및 base_domain 등록 / Dynamic Web Project 생성 /
5. iBATIS 2.3.4 다운로드 / 압축해제 / ibatis.jar 파일을 Eclipse 프로젝트의 WEB-INF/lib 안에 복사 /
6. Spring 2.5.6 다운로드 / 압축해제 / spring.jar, standard.jar, jstl.jar, spring-webmvc.jar, commons-logging.jar 를 프로젝트의 WEB-INF/lib 안에 복사 /
7. iBATIS의 주 설정파일(sqlMapConfig.xml) 작성 --> WEB-INF/classes/안에 작성, 여기서 데이터소스를 설정할 필요가 없음, 데이터소스는 이미 Weblogic서버에서 설정했기 때문에 그 설정을 공유하면 된다.
iBATIS가 필요로 하는 SQL 문장을 포함한 xml 파일을 작성한다.
8. Spring 의  빈 설정파일(dispatcher-servlet.xml) 파일 작성 --> SqlMapClient 를 빈으로 설정하고 SqlMapClientDaoSupport빈에 속성으로 설정해 준다.
9. 빈 설정파일에 MultiActionController 클래스의 하위 클래스를 빈으로 등록하고 SqlMapClientDaoSupport의 인스턴스를 콘트롤러의 속성으로 설정해준다.




WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>WeblogicSpring</display-name>
 
  <servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>*.htm</url-pattern>
  </servlet-mapping>

  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
 
</web-app>




WEB-INF/weblogic.xml

<?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.2/weblogic-web-app.xsd">
    <wls:weblogic-version>10.3.4</wls:weblogic-version>
    <wls:context-root>ibatis_spring</wls:context-root>
</wls:weblogic-web-app>




WEB-INF/dispatcher-servlet.xml (Spring 빈 설정파일 ) - web.xml에 등록된 DispatcherServlet의 이름에 따라서 설정파일명이 결정됨

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:p="http://www.springframework.org/schema/p"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"
 >

 <bean id="sqlMapClient"
  class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"
  p:configLocation="classpath:sqlMapConfig.xml"
  p:useTransactionAwareDataSource="true"/>

 <bean id="ibatisDao"
  class="com.hdm.ibatis.IBatisDao"
  p:sqlMapClient-ref="sqlMapClient" />

 <bean name="/hello.htm"  class="test.SampleController"/>
 
 <bean name="/test/*.htm" class="springapp.SpringIbatisController"
  p:ibatisDao-ref="ibatisDao" />
 
 <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix" value="/spring/"></property>
  <property name="suffix" value=".jsp"></property>       
 </bean>

</beans>

위의 설정 중에 /test/*.htm 의 의미
이용자의 요청 URL이 "루트 컨텍스트/test/xxx.htm" 형식이라면 SpringIbatisController클래스가 호출된다. 그리고 "xxx.htm" 에 포함된 xxx 는 SpringIbatisController클래스의 메소드를 호출하는데 사용된다. 즉, 이용자가 http://localhost/hello/test/getList.htm 이라는 요청 URL을 사용했다면 getList()라는 메소드가 SpringIbatisController클래스에 포함되어 있을 경우에는 호출된다는 의미이다.


springapp.SpringIbatisController.java

package springapp;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import com.hdm.ibatis.IBatisDao;
import com.ibatis.common.resources.Resources;

public class SpringIbatisController extends MultiActionController {
 IBatisDao ibatisDao;
 
 public IBatisDao getIbatisDao() {
  return ibatisDao;
 }

 public void setIbatisDao(IBatisDao ibatisDao) {
  this.ibatisDao = ibatisDao;
 }

 public ModelAndView getList(HttpServletRequest request, HttpServletResponse response)
 throws Exception{

  List<String> list = ibatisDao.getList();
  return new ModelAndView("list", "message", list);
 }
}

Annotation을 사용한 컨트롤러의 경우

package springapp;

import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import dao.*;
import db.*;

@Controller
public class AnnotationIBATISController {

 IBatisDao ibatisDao;

 public IBatisDao getIbatisDao() {
  return ibatisDao;
 }

 public void setIbatisDao(IBatisDao ibatisDao) {
  this.ibatisDao = ibatisDao;
 }

@RequestMapping("/test/getList.htm")
public ModelAndView getList()
 throws Exception{

     List<String> list = ibatisDao.getList();
     return new ModelAndView("list", "message", list);
 }
}



View 파일 ( WebContent/spring/list.jsp )

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ include file="/include/include.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>List 페이지</title>
</head>
<body>
리스트<br/>

<c:forEach items="${message }" var="name">
 <c:out value="${name }"/><br/>
</c:forEach>

</body>
</html>



iBATIS의 주 설정파일 ( WEB-INF/classes/sqlMapConfig.xml )
참고 : 데이터베이스 연결정보를 이파일에 상세하게 설정하는 것이 일반적이지만 이미 Weblogic의 관리콘솔에서 이용하고자 하는 데이터베이스의 데이터소스를 설정했기 때문에 그 이름을 공유하므로 여기서 복잡한 설정은 필요없다

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

<!-- Always ensure to use the correct XML header as above! -->

<sqlMapConfig>

  <transactionManager type="JDBC">

     <dataSource type="JNDI">

       <property name="context.java.naming.factory.initial" value="weblogic.jndi.WLInitialContextFactory"/>

       <property name="context.java.naming.provider.url" value="t3://localhost:80"/>

        <property name="DataSource" value="db/mssql2008"/><!-- Weblogic 에서 설정한 Datasource JNDI 이름-->

     </dataSource>

  </transactionManager>

  <sqlMap resource="com/hdm/ibatis/test.xml"/>

</sqlMapConfig>


iBATIS의 SQL문장등록  파일 (com.hdm.ibatis/test.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 namespace="test">

  <select id="test.getNames" resultClass="java.lang.String">
    select name from dbo.my_table
  </select>

</sqlMap>





com.hdm.ibatis.IBatisDao.java

package com.hdm.ibatis;

import java.sql.SQLException;
import java.util.List;

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
import com.ibatis.sqlmap.client.SqlMapClient;

public class IBatisDao extends SqlMapClientDaoSupport {

  public List getList () throws SQLException {
     return getSqlMapClient().queryForList("test.getNames");
  }
 
/* 이외에도, queryForObject(), queryForInt() ,insert(), update(), delete() 등을 사용할 수 있다 */

}




테스트
http://localhost/ibatis_spring/test/getList.htm