2012년 8월 24일

Spring 프레임워크와 iBatis를 연동


목적 :
 Spring 프레임워크와 iBatis를 연동한다.

준비물 :
1. JDK : JDK 1.5 이상 설치되어있어야 함
2. 웹서버 : 아파치 톰캣 5.5.23
3. 라이브러리 : Spring프레임워크 1.2.9 (다운로드 : http://www.springframework.org/download)
4. 라이브러리 : iBatis 2.3 (다운로드 : http://ibatis.apache.org/javadownloads.cgi)
5. 개발툴 : WTP (이클립스 플러그인) (다운로드 : http://www.eclipse.org/downloads/) 
               By Project에서 이클립스랑 통합된 All-in-one 버전을 추천
6. 지식 수준 : Java, 서블릿 사용가능, J2EE환경에 대한 기초지식


시작하기 전에 :
1. JDK 1.5 이상이 설치 되어있어야 한다.
2. tomcat 5.5.23 이 설치 되어있어야 한다.
3. 개발툴이 설치되어 있어야 한다.

시작 :
모두 다운로드 받았으면

[1. 프로젝트 생성 및 lib 넣어주기]
이클립스(WTP)에서 다이나믹 웹 프로젝트를 만들고
spring jar와 ibatis 관련 jar등을 lib 폴더에 넣어준다.
그 외에 common 관련 lib 들도 넣어주고..
jdbc용 라이브러리들도 넣어줘야 한다.
(이 부분이 좀.. 불친절해서 시간이 더 소요될지도 모르겠다..)


[2. web.xml  설정]
그리고  WEB-INF 폴더 밑에 있는 web.xml 을 수정한다.

<web-app>
 <display-name>licenceweb</display-name>
노드 아래에

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/dataAccessContext.xml  /WEB-INF/applicationContext.xml</param-value>
 </context-param>
    <listener>
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
어플리케이션 설정과
DB설정을 위해 이 부분을 추가하고

    <servlet>
  <servlet-name>licenceweb</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 </servlet>

 <servlet-mapping>
        <servlet-name>licenceweb</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
스프링 연동을 위해 서블릿 설정을 한다.

보너스로 톰캣 인코딩 설정을 위해(post, get 파라미터용, 한글이 안 깨지도록)
    <!-- 인코딩 필더 설치 -->
    <filter>
          <filter-name>encodingFilter</filter-name>
          <filter-class>
               org.springframework.web.filter.CharacterEncodingFilter
          </filter-class>
          <init-param>
               <param-name>encoding</param-name>
               <param-value>utf-8</param-value>
          </init-param>
     </filter>
     <filter-mapping>
          <filter-name>encodingFilter</filter-name>
          <url-pattern>/*</url-pattern>
     </filter-mapping>
을 추가한다.


[3. licenceweb-servlet.xml 설정] 
(* licenceweb은 디스플레이 이름과 동일하게..다른 걸로 바꾸었다면 그 이름으로 한다.)
spring을 위한 xml 설정파일이다.
기본적으로 루트는 <beans>로 시작하고
그 하위 노드를 추가한다.

 <!-- ========================= VIEW DEFINITIONS ========================= -->
 <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
  <property name="prefix" value="/WEB-INF/jsp/"/>
  <property name="suffix" value=".jsp"/>
 </bean>

VIEW를 위해서 정의하고.
(이 부분의 역할은 서버의 view에서 넘겨줄 페이지를 위해 prefix랑 suffix를 설정하는 부분..
추후에 자세히 설명하겠다..)


 <!-- ========================= DEFINITIONS OF PUBLIC CONTROLLERS ========================= -->
 <bean 
   id="defaultHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

<bean name="/login.do" class="com.comtrue.pc.licenceweb.web.LoginController">
  <property name="licenceWeb" ref="licenceWeb"/>
 </bean>
 <bean name="/logout.do" class="com.comtrue.pc.licenceweb.web.LogoutController">
 </bean>
...

컨트롤러를 위해 이 부분을 정의한다.
(설정에 있어서는 클래스의 public, protected 처럼 지정할 수 있지만
여기서는 일단 public 만 넣어둔다.)


[4. applicationContext.xml 설정]
어플리케이션 컨텍스트를 설정하는 부분이다
db 설정 파일을 스프링에서 쓸 수 있게하고
트랜잭션 등을 설정한다.
밸리데이션 등을 지정할 수도 있다.


<beans>
 <!-- ========================= GENERAL DEFINITIONS ========================= -->
 <!-- Configurer that replaces ${...} placeholders with values from properties files -->
 <!-- (in this case, mail and JDBC related properties) -->
 <bean id="propertyConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="location">
   <value>WEB-INF/db_mssql.properties</value>
  </property>
 </bean>

스프링의 PropertyPlaceholderConfigurer를 위해
jdbc파일의 경로를 지정하여 쓸 수 있게 하고


 <bean 
    id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
    abstract="true">
  <property name="transactionManager" ref="transactionManager"/>
  <property name="transactionAttributes">
   <props>
    <prop key="insert*">PROPAGATION_REQUIRED</prop>
    <prop key="update*">PROPAGATION_REQUIRED</prop>
    <prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
   </props>
  </property>
 </bean>

트랜잭션 매니저를 지정한다.


 <bean id="licenceWeb" parent="baseTransactionProxy">
  <property name="target">
   <bean class="com.comtrue.pc.licenceweb.domain.logic.LicenceWebImpl">
    <property name="accountDao" ref="accountDao"/>
    <property name="licenceDao" ref="licenceDao"/>
   </bean>
  </property>
 </bean>

스프링프레임워크의 서비스 부분을 위한 DAO를 설정하여 트랜잭션 관리를 지정한다.


[5. db_mssql.properties 설정]
####################################
# MSSQL 2000
####################################
jdbc.driverClassName=com.microsoft.jdbc.sqlserver.SQLServerDriver
jdbc.url=jdbc:microsoft:sqlserver://localhost:1433;SelectMethod=cursor;DatabaseName=데이터베이스이름;
jdbc.username=아이디
jdbc.password=비밀번호


[6. dataAccessContext.xml 설정]
<beans>

 <!-- ========================= RESOURCE DEFINITIONS ========================= -->
 <!-- Local Apache Commons DBCP DataSource that refers to a combined database -->
 <!-- (see dataAccessContext-jta.xml for an alternative) -->
 <!-- The placeholders are resolved from jdbc.properties through -->
 <!-- the PropertyPlaceholderConfigurer in applicationContext.xml -->
 <bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName"><value>${jdbc.driverClassName}</value></property>
        <property name="url"><value>${jdbc.url}</value></property>
        <property name="username"><value>${jdbc.username}</value></property>
        <property name="password"><value>${jdbc.password}</value></property>
    </bean>

dataSource에 jdbc 설정을 알린다. 이 부분은 5번의 프로퍼티 파일에서 읽어왔기 때문에
${} 식으로 받아서 서버에서 처리하게 된다.


   
    <!-- Transaction manager for a single JDBC DataSource -->
 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource" />
 </bean>

이 부분은.. 트랜잭션 매니저 bean을 설정하는 부분..


 <!-- SqlMap setup for iBATIS Database Layer -->
 <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
     <property name="configLocation" value="WEB-INF/sqlmap-config.xml"/>
     <property name="dataSource" ref="dataSource"/>
   </bean>

이 부분은 iBatis 연동을 위해 sql map 설정파일의 경로를 지정하고
dataSoruce를 지정한다.


 <!-- ========================= DAO DEFINITIONS: IBATIS IMPLEMENTATIONS ========================= -->

 <bean id="accountDao" class="com.comtrue.pc.licenceweb.dao.ibatis.SqlMapAccountDao">
  <property name="sqlMapClient" ref="sqlMapClient"/>
 </bean>


이 부분은 Dao를 구현한 클래스를 정의한다.


[7. sqlmap-config.xml 설정]
iBatis 연동을 위해 sqlmap 설정한다.

<sqlMapConfig>
 <sqlMap resource="com/comtrue/pc/licenceweb/dao/ibatis/maps/Account.xml" />
 <sqlMap resource="com/comtrue/pc/licenceweb/dao/ibatis/maps/Licence.xml" />
</sqlMapConfig>

Dao 클래스들이 사용하는 쿼리를 담은 xml 경로를 지정한다.


[8. Account.xml 설정, 객체마다 해야함]
Dao 클래스에서 사용하는 쿼리를 입력해두는 파일

<sqlMap namespace="Account">
  <resultMap id="result" class="com.comtrue.pc.licenceweb.domain.Account">
   <result property="userid" column="userid" columnIndex="1"/>
    <result property="name" column="name" columnIndex="2"/>
    <result property="email" column="email" columnIndex="3"/>
  </resultMap>
  <select id="getAccountByUseridAndPassword" resultMap="result">
    select userid, name, email
    from ACCOUNT
    where userid = #userid# and password = #password#
  </select>
</sqlMap>

resultMap 은 결과 형태를 지정하는 노드고

select 노드는 select 할 때를 위한 쿼리를 담는 곳이다.
이때 resultMap 속성에 resultMap 의 id를 지정한다. 그러면.. 결과 시에
resultMap 형식으로 결과를 갖고 온다.


[9. SqlMapAccountDao.java 구현 예]

public class SqlMapAccountDao extends SqlMapClientDaoSupport implements AccountDao {
 public Account getAccount(String userid, String password) throws DataAccessException
 { 
  Account account = new Account();
  account.setUserid(userid);
     account.setPassword(password);
    
  return (Account) getSqlMapClientTemplate().queryForObject("getAccountByUseridAndPassword", account);
 }
}

getSqlMapClientTemplate()의 queryForObject()를 사용해서
seletc 쿼리를 수행한다. 결과는 resultMap 형식의 클래스로 돌려받게 된다.

Dao를 구현한 클래스들은 서비스 형식의 클래스에서 사용하는 방식으로 개발을 한다.
Dao를 직접 View부분에서 지정하진 않고..


p.s. 2주전쯤 프레임워크 적용을 했었는데..
혹 도움이 될까해서 올려봅니다..

Java 클래스 부분 설명이 없어서.. 이것만 보고 할 순 없지만요..

출처 -  ITWILLCAMPUS

댓글 없음:

댓글 쓰기