2007년 12월 16일 일요일

Spring프레임워크 1.2.9 + iBatis 2.3 연동 정리

Spring프레임워크 1.2.9 + iBatis 2.3 연동 정리

출처 :

 www.hanajava.net : hanajava@empal.com.



목적 :

 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 클래스 부분 설명이 없어서.. 이것만 보고 할 순 없지만요..

Fetch links Quick & Easy. Stream and Direct Download. Give it a try at http://seedr.cc now!

  Fetch links Quick & Easy. Stream and Direct Download. Give it a try at http:// seedr.cc now!   Fetch links Quick & Easy. Stream a...